x86: Disallow invalid relocation against protected symbol
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 9 Feb 2022 23:51:22 +0000 (15:51 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 11 Feb 2022 18:24:54 +0000 (10:24 -0800)
commitebb191adac4ab45498dec0bfaac62f0a33537ba4
tree34999ecb8d01541fde94b8a70b3164d80682a516
parent29ba33db77f22a54d97db90cb87c39126efad3db
x86: Disallow invalid relocation against protected symbol

I am checking this into master and will backport it to 2.38 branch.

H.J
----
On x86, GCC 12 supports -mno-direct-extern-access to enable canonical
reference to protected function and disable copy relocation.  With
-mno-direct-extern-access, the canonical protected function symbols must
be accessed via canonical reference and the protected data symbols in
shared libraries are non-copyable. Under glibc 2.35, non-canonical
reference to the canonical protected function will get the run-time error:

./y: internal_f: ./libfoo.so: non-canonical reference to canonical protected function

and copy relocations against the non-copyable protected symbols will get
the run-time error:

./x: internal_i: ./libfoo.so: copy relocation against non-copyable protected symbol

Update x86 linker to disallow non-canonical reference to the canonical
protected function:

ld: plt.o: non-canonical reference to canonical protected function `internal_f' in libfoo.so
ld: failed to set dynamic section sizes: bad value

and copy relocation against the non-copyable protected symbol:

ld: main.o: copy relocation against non-copyable protected symbol `internal_i' in libfoo.so

at link-time.

bfd/

PR ld/28875
* elf-properties.c (_bfd_elf_parse_gnu_properties): Don't skip
shared libraries for GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
* elf32-i386.c (elf_i386_scan_relocs): Disallow non-canonical
reference to canonical protected function.
* elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise.
* elfxx-x86.c (elf_x86_allocate_dynrelocs): Don't allow copy
relocation against non-copyable protected symbol.

ld/

PR ld/28875
* testsuite/ld-i386/i386.exp: Check non-canonical reference to
canonical protected function and check copy relocation against
non-copyable protected symbol.
* testsuite/ld-i386/pr21997-1.err: New file.
* testsuite/ld-i386/pr28875.err: Likewise.
* testsuite/ld-i386/pr28875a.c: Likewise.
* testsuite/ld-i386/pr28875b.c: Likewise.
* testsuite/ld-x86-64/pr21997-1a.err: Updated.
* testsuite/ld-x86-64/pr21997-1b.err: Likewise.
* testsuite/ld-x86-64/pr28875-data.err: New file.
* testsuite/ld-x86-64/pr28875-func.err: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Check non-canonical reference
to canonical protected function and check copy relocation against
non-copyable protected symbol.
14 files changed:
bfd/elf-properties.c
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr21997-1.err [new file with mode: 0644]
ld/testsuite/ld-i386/pr28875.err [new file with mode: 0644]
ld/testsuite/ld-i386/pr28875a.c [new file with mode: 0644]
ld/testsuite/ld-i386/pr28875b.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr21997-1a.err
ld/testsuite/ld-x86-64/pr21997-1b.err
ld/testsuite/ld-x86-64/pr28875-data.err [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr28875-func.err [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp