diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2022-07-18 18:24:26 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-07-19 08:41:52 -0700 |
commit | f638657759f5b9b4eb31a1aa6b9fe6e6fb01f4a0 (patch) | |
tree | 8be7ee0ba0f54495fab063d3a6fb7c626afa2b88 /bfd/elfxx-x86.c | |
parent | d19a265487eda186b6977d9d15648cda9fad3298 (diff) | |
download | gdb-f638657759f5b9b4eb31a1aa6b9fe6e6fb01f4a0.zip gdb-f638657759f5b9b4eb31a1aa6b9fe6e6fb01f4a0.tar.gz gdb-f638657759f5b9b4eb31a1aa6b9fe6e6fb01f4a0.tar.bz2 |
x86: Disallow invalid relocations against protected symbols
Since glibc 2.36 will issue warnings for copy relocation against
protected symbols and non-canonical reference to canonical protected
functions, change the linker to always disallow such relocations.
bfd/
* elf32-i386.c (elf_i386_scan_relocs): Remove check for
elf_has_indirect_extern_access.
* elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise.
(elf_x86_64_relocate_section): Remove check for
elf_has_no_copy_on_protected.
* elfxx-x86.c (elf_x86_allocate_dynrelocs): Check for building
executable instead of elf_has_no_copy_on_protected.
(_bfd_x86_elf_adjust_dynamic_symbol): Disallow copy relocation
against non-copyable protected symbol.
* elfxx-x86.h (SYMBOL_NO_COPYRELOC): Remove check for
elf_has_no_copy_on_protected.
ld/
* testsuite/ld-i386/i386.exp: Expect linker error for PR ld/17709
test.
* testsuite/ld-i386/pr17709.rd: Removed.
* testsuite/ld-i386/pr17709.err: New file.
* testsuite/ld-x86-64/pr17709.rd: Removed.
* testsuite/ld-x86-64/pr17709.err: New file.
* testsuite/ld-x86-64/pr28875-func.err: Updated.
* testsuite/ld-x86-64/x86-64.exp: Expect linker error for PR
ld/17709 test. Add tests for function pointer against protected
function.
Diffstat (limited to 'bfd/elfxx-x86.c')
-rw-r--r-- | bfd/elfxx-x86.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 18f3d33..7fb9727 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -524,8 +524,7 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) { asection *sreloc; - if (eh->def_protected - && elf_has_no_copy_on_protected (h->root.u.def.section->owner)) + if (eh->def_protected && bfd_link_executable (info)) { /* Disallow copy relocation against non-copyable protected symbol. */ @@ -3041,6 +3040,24 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info, } if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { + if (eh->def_protected && bfd_link_executable (info)) + for (p = h->dyn_relocs; p != NULL; p = p->next) + { + /* Disallow copy relocation against non-copyable protected + symbol. */ + s = p->sec->output_section; + if (s != NULL && (s->flags & SEC_READONLY) != 0) + { + info->callbacks->einfo + /* xgettext:c-format */ + (_("%F%P: %pB: copy relocation against non-copyable " + "protected symbol `%s' in %pB\n"), + p->sec->owner, h->root.root.string, + h->root.u.def.section->owner); + return false; + } + } + srel->size += htab->sizeof_reloc; h->needs_copy = 1; } |