diff options
author | Fangrui Song <i@maskray.me> | 2022-06-25 10:44:26 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-07-25 10:01:37 -0700 |
commit | 366e8fc8f7b269f4c68d0d5768c64a5a7ca42d6b (patch) | |
tree | 963d1b04d8125817089cd8e34c0809ed80b5141c | |
parent | 97acb51d6ac5b3e09b5817edc7a41678d96e945c (diff) |
x86: Make protected symbols local for -shared
Call _bfd_elf_symbol_refs_local_p with local_protected==true. This has
2 noticeable effects for -shared:
* GOT-generating relocations referencing a protected data symbol no
longer lead to a GLOB_DAT (similar to a hidden symbol).
* Direct access relocations (e.g. R_X86_64_PC32) no longer has the
confusing diagnostic below.
__attribute__((visibility("protected"))) void *foo() {
return (void *)foo;
}
// gcc -fpic -shared -fuse-ld=bfd
relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object
The new behavior matches arm, aarch64 (commit
83c325007c5599fa9b60b8d5f7b84842160e1d1b), and powerpc ports, and other
linkers: gold and ld.lld.
Note: if some code tries to use direct access relocations to take the
address of foo, the pointer equality will break, but the error should be
reported on the executable link, not on the innocent shared object link.
glibc 2.36 will give a warning at relocation resolving time.
With this change, `#define elf_backend_extern_protected_data 1` is no
longer effective. Just remove it.
Remove the test "Run protected-func-1 without PIE" since -fno-pic
address taken operation in the executable doesn't work with protected
symbol in a shared object by default. Similarly, remove
protected-data-1a and protected-data-1b. protected-data-1b can be made
working by removing HAVE_LD_PIE_COPYRELOC from GCC
(https://sourceware.org/pipermail/gcc-patches/2022-June/596678.html).
(cherry picked from commit d19a265487eda186b6977d9d15648cda9fad3298)
-rw-r--r-- | bfd/elf32-i386.c | 1 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 1 | ||||
-rw-r--r-- | bfd/elfxx-x86.c | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected1.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected3.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected6a.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr24151a-x32.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr24151a.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected1.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected3.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected6a.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected7a.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/x86-64.exp | 27 |
13 files changed, 24 insertions, 39 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 182c93bc3c..4bcb06b003 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -4431,7 +4431,6 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info) #define elf_backend_got_header_size 12 #define elf_backend_plt_alignment 4 #define elf_backend_dtrel_excludes_plt 1 -#define elf_backend_extern_protected_data 1 #define elf_backend_caches_rawsize 1 #define elf_backend_want_dynrelro 1 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 48ca6309d1..3abc68a412 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -5277,7 +5277,6 @@ elf_x86_64_special_sections[]= #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3) #define elf_backend_rela_normal 1 #define elf_backend_plt_alignment 4 -#define elf_backend_extern_protected_data 1 #define elf_backend_caches_rawsize 1 #define elf_backend_dtrel_excludes_plt 1 #define elf_backend_want_dynrelro 1 diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index acb2cc8528..18f3d33545 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -3094,7 +3094,7 @@ _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info, 2. When building executable, there is no dynamic linker. Or 3. or "-z nodynamic-undefined-weak" is used. */ - if (SYMBOL_REFERENCES_LOCAL (info, h) + if (_bfd_elf_symbol_refs_local_p (h, info, 1) || (h->root.type == bfd_link_hash_undefweak && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || (bfd_link_executable (info) diff --git a/ld/testsuite/ld-i386/protected1.d b/ld/testsuite/ld-i386/protected1.d index a3cb5cef14..531645b8fe 100644 --- a/ld/testsuite/ld-i386/protected1.d +++ b/ld/testsuite/ld-i386/protected1.d @@ -1,3 +1,5 @@ #as: --32 #ld: -shared -melf_i386 -#error: .*relocation R_386_GOTOFF against protected function `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/protected3.d b/ld/testsuite/ld-i386/protected3.d index c3a6888d90..77367c4738 100644 --- a/ld/testsuite/ld-i386/protected3.d +++ b/ld/testsuite/ld-i386/protected3.d @@ -8,7 +8,7 @@ Disassembly of section .text: 0+[a-f0-9]+ <bar>: -[ ]*[a-f0-9]+: 8b 81 [a-f0-9][a-f0-9] [a-f0-9][a-f0-9] ff ff mov -0x[a-f0-9]+\(%ecx\),%eax +[ ]*[a-f0-9]+: 8d 81 00 00 00 00 lea 0x0\(%ecx\),%eax [ ]*[a-f0-9]+: 8b 00 mov \(%eax\),%eax [ ]*[a-f0-9]+: c3 ret #pass diff --git a/ld/testsuite/ld-i386/protected6a.d b/ld/testsuite/ld-i386/protected6a.d index 7dc350432f..4d3873239f 100644 --- a/ld/testsuite/ld-i386/protected6a.d +++ b/ld/testsuite/ld-i386/protected6a.d @@ -1,4 +1,6 @@ #source: protected6.s #as: --32 #ld: -shared -melf_i386 -#error: .*relocation R_386_GOTOFF against protected data `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/pr24151a-x32.d b/ld/testsuite/ld-x86-64/pr24151a-x32.d index 130611ddf4..1f49b655f7 100644 --- a/ld/testsuite/ld-x86-64/pr24151a-x32.d +++ b/ld/testsuite/ld-x86-64/pr24151a-x32.d @@ -1,4 +1,6 @@ #source: pr24151a.s #as: --x32 #ld: -shared -melf32_x86_64 -#error: .*relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/pr24151a.d b/ld/testsuite/ld-x86-64/pr24151a.d index 783b85a1a6..6c48e383e0 100644 --- a/ld/testsuite/ld-x86-64/pr24151a.d +++ b/ld/testsuite/ld-x86-64/pr24151a.d @@ -1,3 +1,5 @@ #as: --64 #ld: -shared -melf_x86_64 -#error: .*relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected1.d b/ld/testsuite/ld-x86-64/protected1.d index 783b85a1a6..6c48e383e0 100644 --- a/ld/testsuite/ld-x86-64/protected1.d +++ b/ld/testsuite/ld-x86-64/protected1.d @@ -1,3 +1,5 @@ #as: --64 #ld: -shared -melf_x86_64 -#error: .*relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected3.d b/ld/testsuite/ld-x86-64/protected3.d index 57950e4d6b..ba63991582 100644 --- a/ld/testsuite/ld-x86-64/protected3.d +++ b/ld/testsuite/ld-x86-64/protected3.d @@ -8,7 +8,7 @@ Disassembly of section .text: 0+[a-f0-9]+ <bar>: -[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <.*> +[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <.*> [ ]*[a-f0-9]+: 8b 00 mov \(%rax\),%eax [ ]*[a-f0-9]+: c3 ret #pass diff --git a/ld/testsuite/ld-x86-64/protected6a.d b/ld/testsuite/ld-x86-64/protected6a.d index 3a7963ffd2..50d6430b57 100644 --- a/ld/testsuite/ld-x86-64/protected6a.d +++ b/ld/testsuite/ld-x86-64/protected6a.d @@ -1,4 +1,6 @@ #source: protected6.s #as: --64 #ld: -shared -melf_x86_64 -#error: .*relocation R_X86_64_GOTOFF64 against protected data `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected7a.d b/ld/testsuite/ld-x86-64/protected7a.d index 3082084a7b..3974246a2a 100644 --- a/ld/testsuite/ld-x86-64/protected7a.d +++ b/ld/testsuite/ld-x86-64/protected7a.d @@ -1,4 +1,6 @@ #source: protected7.s #as: --64 #ld: -shared -melf_x86_64 -#error: .*relocation R_X86_64_GOTOFF64 against protected function `foo' can not be used when making a shared object +#readelf: -rW +#... +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 5e5636bceb..a096c0b9d0 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -1833,15 +1833,6 @@ if { [isnative] && [check_compiler_available] } { "pass.out" \ ] \ [list \ - "Run protected-func-1 without PIE" \ - "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libprotected-func-1.so" \ - "-Wa,-mx86-used-note=yes" \ - { protected-func-1b.c } \ - "protected-func-1a" \ - "pass.out" \ - "$NOPIE_CFLAGS" \ - ] \ - [list \ "Run protected-func-1 with PIE" \ "-Wl,--no-as-needed -pie tmpdir/libprotected-func-1.so" \ "-Wa,-mx86-used-note=yes" \ @@ -1905,24 +1896,6 @@ if { [isnative] && [check_compiler_available] } { "-fPIE" \ ] \ [list \ - "Run protected-data-1a without PIE" \ - "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libprotected-data-1a.so" \ - "-Wa,-mx86-used-note=yes" \ - { protected-data-1b.c } \ - "protected-data-1a" \ - "pass.out" \ - "$NOPIE_CFLAGS" \ - ] \ - [list \ - "Run protected-data-1b with PIE" \ - "-Wl,--no-as-needed -pie tmpdir/libprotected-data-1a.so" \ - "-Wa,-mx86-used-note=yes" \ - { protected-data-1b.c } \ - "protected-data-1b" \ - "pass.out" \ - "-fPIE" \ - ] \ - [list \ "Run protected-data-2a without PIE" \ "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libprotected-data-2a.so" \ "-Wa,-mx86-used-note=yes" \ |