aarch64: Allow PC-relative relocations against protected STT_FUNC for -shared
authorFangrui Song <maskray@google.com>
Thu, 23 Jun 2022 08:10:44 +0000 (01:10 -0700)
committerFangrui Song <i@maskray.me>
Thu, 23 Jun 2022 08:10:44 +0000 (01:10 -0700)
commit83c325007c5599fa9b60b8d5f7b84842160e1d1b
tree426017dc48259ad79946e1bd3faed0b9e4a608a6
parent4fb55bf6a9606eb7b626c30a9f4e71d6c2d4fbb2
aarch64: Allow PC-relative relocations against protected STT_FUNC for -shared

    __attribute__((visibility("protected"))) void *foo() {
      return (void *)foo;
    }

gcc -fpic -shared -fuse-ld=bfd fails with the confusing diagnostic:

    relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `foo' which may bind externally can not be used when making a shared object; recompile with -fPIC

Call _bfd_elf_symbol_refs_local_p with local_protected==true to suppress
the error.  The new behavior matches gold and ld.lld.

Note: if some code tries to use direct access relocations to take the
address of foo (likely due to -fno-pic), 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.
bfd/elfnn-aarch64.c
ld/testsuite/ld-aarch64/aarch64-elf.exp
ld/testsuite/ld-aarch64/pcrel-protected.s [new file with mode: 0644]
ld/testsuite/ld-aarch64/pcrel_pic_protected.d [new file with mode: 0644]