]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
elf: Add GNU_PROPERTY_1_NEEDED check
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 17 Jun 2021 21:11:28 +0000 (14:11 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 9 Jul 2021 01:14:31 +0000 (18:14 -0700)
commit6f365fda85a2e2682b197540d14adf66c4261b19
treef746621b46e022fabe3662b04da4d5c2a36f2e1b
parent6320fd00dc374f74658c7e4b7dffbe1d71723284
elf: Add GNU_PROPERTY_1_NEEDED check

If GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is set on any input
relocatable files:

1. Don't generate copy relocations.
2. Turn off extern_protected_data since it implies
GNU_PROPERTY_NO_COPY_ON_PROTECTED.
3. Treate reference to protected symbols with indirect external access
as local.
4. Set GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS on output.
5. When generating executable, clear this bit when there are non-GOT or
non-PLT relocations in input relocatable files without the bit set.
6. Add -z [no]indirect-extern-access to control indirect external access.

bfd/

* elf-bfd (elf_obj_tdata): Add has_indirect_extern_access.
(elf_has_indirect_extern_access): New.
* elf-properties.c (_bfd_elf_parse_gnu_properties): Set
elf_has_indirect_extern_access and elf_has_no_copy_on_protected
when seeing GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
(elf_write_gnu_propertie): Add an argument to pass link_info.
Set needed_1_p for GNU_PROPERTY_1_NEEDED in memory.
(_bfd_elf_link_setup_gnu_properties): Handle
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS for
-z indirect-extern-access.  Set nocopyreloc to true and
extern_protected_data to false for indirect external access.
(_bfd_elf_convert_gnu_properties): Updated.
* elf32-i386.c (elf_i386_check_relocs): Set
non_got_ref_without_indirect_extern_access on legacy non-GOT or
non-PLT references.
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
* elflink.c (_bfd_elf_symbol_refs_local_p): Return true for
STV_PROTECTED symbols with indirect external access.
* elfxx-x86.c (_bfd_x86_elf_adjust_dynamic_symbol): Clear
indirect_extern_access for legacy non-GOT/non-PLT references.
* elfxx-x86.h (elf_x86_link_hash_entry): Add
non_got_ref_without_indirect_extern_access.

include/

* bfdlink.h (bfd_link_info): Add indirect_extern_access and
needed_1_p.  Change nocopyreloc to int.

ld/

* NEWS: Mention -z [no]indirect-extern-access
* ld.texi: Document -z [no]indirect-extern-access
* ldmain.c (main): Initialize link_info.indirect_extern_access
to -1.
* emulparams/extern_protected_data.sh: Support
-z [no]indirect-extern-access.
* testsuite/ld-elf/indirect-extern-access-1.rd: New file
* testsuite/ld-elf/indirect-extern-access-1a.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-1b.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-2.rd: Likewise.
* testsuite/ld-elf/indirect-extern-access-2a.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-2b.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-3.rd: Likewise.
* testsuite/ld-elf/indirect-extern-access.S: Likewise.
* testsuite/ld-elf/property-1_needed-1b.d: Likewise.
* testsuite/ld-elf/property-1_needed-1c.d: Likewise.
* testsuite/ld-x86-64/indirect-extern-access.rd: Likewise.
* testsuite/ld-x86-64/protected-data-1.h: Likewise.
* testsuite/ld-x86-64/protected-data-1a.c: Likewise.
* testsuite/ld-x86-64/protected-data-1b.c: Likewise.
* testsuite/ld-x86-64/protected-data-2a.S: Likewise.
* testsuite/ld-x86-64/protected-data-2b.S: Likewise.
* testsuite/ld-x86-64/protected-func-2a.S: Likewise.
* testsuite/ld-x86-64/protected-func-2b.S: Likewise.
* testsuite/ld-x86-64/protected-func-2c.c: Likewise.
* testsuite/ld-elf/linux-x86.exp: Run test with
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
* testsuite/ld-x86-64/x86-64.exp: Run tests for protected
function and data with indirect external access.
33 files changed:
bfd/elf-bfd.h
bfd/elf-properties.c
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elflink.c
bfd/elfxx-x86.c
bfd/elfxx-x86.h
include/bfdlink.h
ld/NEWS
ld/emulparams/extern_protected_data.sh
ld/ld.texi
ld/ldmain.c
ld/testsuite/ld-elf/indirect-extern-access-1.rd [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-1a.c [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-1b.c [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-2.rd [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-2a.c [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-2b.c [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access-3.rd [new file with mode: 0644]
ld/testsuite/ld-elf/indirect-extern-access.S [new file with mode: 0644]
ld/testsuite/ld-elf/linux-x86.exp
ld/testsuite/ld-elf/property-1_needed-1b.d [new file with mode: 0644]
ld/testsuite/ld-elf/property-1_needed-1c.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/indirect-extern-access.rd [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-data-1.h [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-data-1a.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-data-1b.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-data-2a.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-data-2b.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-func-2a.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-func-2b.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected-func-2c.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp