From 00e49dff20421e0f8f28ee74cec12a0bae8f1b82 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 20 Feb 2020 13:08:29 +0000 Subject: [PATCH] Stop the BFD library from automatically converting OS and PROC specific symbol section indicies to SHN_ABS, and provide a hook for backends to decide how such indicies should be processed. * elf-bfd.h (struct elf_backend_data): Add symbol_section_index callback. * elfxx-target.h (elf_backend_symbol_section_index): Provide default definition. (elfNN_bed): Initialise the symbol_section_index field. * elf.c (swap_out_syms): Call symbol_section_index, if defined, on OS and PROC specific section indicies. Warn if converting other reserved incidies to SHN_ABS. --- bfd/ChangeLog | 11 +++++++++++ bfd/elf-bfd.h | 6 ++++++ bfd/elf.c | 19 ++++++++++++++++++- bfd/elfxx-target.h | 5 +++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6c1c1316af8..6ee734c4fc9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2020-02-20 Nick Clifton + + * elf-bfd.h (struct elf_backend_data): Add symbol_section_index + callback. + * elfxx-target.h (elf_backend_symbol_section_index): Provide + default definition. + (elfNN_bed): Initialise the symbol_section_index field. + * elf.c (swap_out_syms): Call symbol_section_index, if defined, on + OS and PROC specific section indicies. Warn if converting other + reserved incidies to SHN_ABS. + 2020-02-19 Sergey Belyashov PR 25537 diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index cbbba153f49..7d36e23ea11 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1503,6 +1503,12 @@ struct elf_backend_data /* Opcode representing no unwind. */ int (*cant_unwind_opcode) (struct bfd_link_info *); + /* Called when emitting an ELF symbol whoes input version had an + ST_SHNDX field set to a value in the range SHN_LOPROC..SHN_HIOS. + Returns the value to be installed in the ST_SHNDX field of the + emitted symbol. If not defined, the value is left unchanged. */ + unsigned int (*symbol_section_index) (bfd *, elf_symbol_type *); + /* This is non-zero if static TLS segments require a special alignment. */ unsigned static_tls_alignment; diff --git a/bfd/elf.c b/bfd/elf.c index deb93b0a5a9..4342e847527 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -8194,9 +8194,26 @@ swap_out_syms (bfd *abfd, if (elf_symtab_shndx_list (abfd)) shndx = elf_symtab_shndx_list (abfd)->ndx; break; - default: + case SHN_COMMON: + case SHN_ABS: shndx = SHN_ABS; break; + default: + if (shndx >= SHN_LOPROC && shndx <= SHN_HIOS) + { + if (bed->symbol_section_index) + shndx = bed->symbol_section_index (abfd, type_ptr); + /* Otherwise just leave the index alone. */ + } + else + { + if (shndx > SHN_HIOS && shndx < SHN_HIRESERVE) + _bfd_error_handler (_("%pB: \ +Unable to handle section index %x in ELF symbol. Using ABS instead."), + abfd, shndx); + shndx = SHN_ABS; + } + break; } } else diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index caca83f5c97..e9cac0a5352 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -769,6 +769,10 @@ #define elf_backend_cant_unwind_opcode 0 #endif +#ifndef elf_backend_symbol_section_index +#define elf_backend_symbol_section_index NULL +#endif + #ifndef elf_match_priority #define elf_match_priority \ (ELF_ARCH == bfd_arch_unknown ? 2 : ELF_OSABI == ELFOSABI_NONE ? 1 : 0) @@ -895,6 +899,7 @@ static struct elf_backend_data elfNN_bed = elf_backend_fixup_gnu_properties, elf_backend_compact_eh_encoding, elf_backend_cant_unwind_opcode, + elf_backend_symbol_section_index, elf_backend_static_tls_alignment, elf_backend_stack_align, elf_backend_strtab_flags, -- 2.30.2