aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2020-02-20 13:08:29 +0000
committerNick Clifton <nickc@redhat.com>2020-02-20 13:08:29 +0000
commit00e49dff20421e0f8f28ee74cec12a0bae8f1b82 (patch)
treeb5ad074f9e41fd5fdcdfae88cfac0c517b4a79f8 /bfd
parentd13c7322fe1266984024644154003a19664610ea (diff)
downloadbinutils-00e49dff20421e0f8f28ee74cec12a0bae8f1b82.zip
binutils-00e49dff20421e0f8f28ee74cec12a0bae8f1b82.tar.gz
binutils-00e49dff20421e0f8f28ee74cec12a0bae8f1b82.tar.bz2
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf.c19
-rw-r--r--bfd/elfxx-target.h5
4 files changed, 40 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6c1c131..6ee734c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2020-02-20 Nick Clifton <nickc@redhat.com>
+
+ * 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 <sergey.belyashov@gmail.com>
PR 25537
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index cbbba15..7d36e23 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 deb93b0..4342e84 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 caca83f..e9cac0a 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,