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:
parent
d13c7322fe
commit
00e49dff20
@ -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>
|
2020-02-19 Sergey Belyashov <sergey.belyashov@gmail.com>
|
||||||
|
|
||||||
PR 25537
|
PR 25537
|
||||||
|
@ -1503,6 +1503,12 @@ struct elf_backend_data
|
|||||||
/* Opcode representing no unwind. */
|
/* Opcode representing no unwind. */
|
||||||
int (*cant_unwind_opcode) (struct bfd_link_info *);
|
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. */
|
/* This is non-zero if static TLS segments require a special alignment. */
|
||||||
unsigned static_tls_alignment;
|
unsigned static_tls_alignment;
|
||||||
|
|
||||||
|
19
bfd/elf.c
19
bfd/elf.c
@ -8194,9 +8194,26 @@ swap_out_syms (bfd *abfd,
|
|||||||
if (elf_symtab_shndx_list (abfd))
|
if (elf_symtab_shndx_list (abfd))
|
||||||
shndx = elf_symtab_shndx_list (abfd)->ndx;
|
shndx = elf_symtab_shndx_list (abfd)->ndx;
|
||||||
break;
|
break;
|
||||||
default:
|
case SHN_COMMON:
|
||||||
|
case SHN_ABS:
|
||||||
shndx = SHN_ABS;
|
shndx = SHN_ABS;
|
||||||
break;
|
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
|
else
|
||||||
|
@ -769,6 +769,10 @@
|
|||||||
#define elf_backend_cant_unwind_opcode 0
|
#define elf_backend_cant_unwind_opcode 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef elf_backend_symbol_section_index
|
||||||
|
#define elf_backend_symbol_section_index NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef elf_match_priority
|
#ifndef elf_match_priority
|
||||||
#define elf_match_priority \
|
#define elf_match_priority \
|
||||||
(ELF_ARCH == bfd_arch_unknown ? 2 : ELF_OSABI == ELFOSABI_NONE ? 1 : 0)
|
(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_fixup_gnu_properties,
|
||||||
elf_backend_compact_eh_encoding,
|
elf_backend_compact_eh_encoding,
|
||||||
elf_backend_cant_unwind_opcode,
|
elf_backend_cant_unwind_opcode,
|
||||||
|
elf_backend_symbol_section_index,
|
||||||
elf_backend_static_tls_alignment,
|
elf_backend_static_tls_alignment,
|
||||||
elf_backend_stack_align,
|
elf_backend_stack_align,
|
||||||
elf_backend_strtab_flags,
|
elf_backend_strtab_flags,
|
||||||
|
Loading…
Reference in New Issue
Block a user