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.
This commit is contained in:
Nick Clifton 2020-02-20 13:08:29 +00:00
parent d13c7322fe
commit 00e49dff20
4 changed files with 40 additions and 1 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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,