x86: Make protected symbols local for -shared
authorFangrui Song <i@maskray.me>
Sat, 25 Jun 2022 17:44:26 +0000 (10:44 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 19 Jul 2022 15:41:52 +0000 (08:41 -0700)
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).

13 files changed:
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
ld/testsuite/ld-i386/protected1.d
ld/testsuite/ld-i386/protected3.d
ld/testsuite/ld-i386/protected6a.d
ld/testsuite/ld-x86-64/pr24151a-x32.d
ld/testsuite/ld-x86-64/pr24151a.d
ld/testsuite/ld-x86-64/protected1.d
ld/testsuite/ld-x86-64/protected3.d
ld/testsuite/ld-x86-64/protected6a.d
ld/testsuite/ld-x86-64/protected7a.d
ld/testsuite/ld-x86-64/x86-64.exp

index 3d39dc07fe0e1bb21e52764c1b597440022662b2..04a972e646de16af16bdd7a1c72eb1958a0f5a3d 100644 (file)
@@ -4426,7 +4426,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
 
index 48ca6309d1b0bf377675104c9728f50d2864e937..3abc68a41275ccae07166609b9d907c004761fbd 100644 (file)
@@ -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
index acb2cc8528db8f69bd5168da42cd64bcdabd1905..18f3d33545842af6e25302f42b45e7e1ce01d6b9 100644 (file)
@@ -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)
index a3cb5cef1403733817b6ff46b76d1a4e1223cb8e..531645b8fe84e3eb94ba29be99abea15b14f93e8 100644 (file)
@@ -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.
index c3a6888d9006ab5fc4a290f74a9fc1601837b7f9..77367c4738f73984e4032c33ca355b859275e088 100644 (file)
@@ -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
index 7dc350432f4bc117b2f7ec4af5b01e71fdf30a72..4d3873239f985eb7731785e7c5fd5ae48a47d19b 100644 (file)
@@ -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.
index 130611ddf4933dc08a3492e67ce317761575ff6f..1f49b655f7d59e1aa8bd32913654712146b0166d 100644 (file)
@@ -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.
index 783b85a1a6fcd3a5fad812709ba00c77973f4890..6c48e383e01468a21e9cc25e12204f569075aa9b 100644 (file)
@@ -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.
index 783b85a1a6fcd3a5fad812709ba00c77973f4890..6c48e383e01468a21e9cc25e12204f569075aa9b 100644 (file)
@@ -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.
index 57950e4d6b69205f83b78782b4b78510a7828961..ba63991582f38643918fd0bdb2cc82c39d68b7c2 100644 (file)
@@ -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
index 3a7963ffd2ff5c2c2794d86d33c0f8566ed98be7..50d6430b57735895daff16096680802040979833 100644 (file)
@@ -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.
index 3082084a7b8013b8c8e3b601624f16a3108e86df..3974246a2a89e7fdcec3989a6d44941bd6e434ce 100644 (file)
@@ -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.
index 5e5636bcebee05ff8b701603d10a4518b817d22e..a096c0b9d0f76d52e274cd8a8fc30f3709a932a7 100644 (file)
@@ -1832,15 +1832,6 @@ if { [isnative] && [check_compiler_available] } {
            "pr23997" \
            "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" \
@@ -1904,24 +1895,6 @@ if { [isnative] && [check_compiler_available] } {
            "pass.out" \
            "-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" \