The patch below adds binutils support for the SHT_ARM_EXIDX, as defined by

the ARM EABI.
This commit is contained in:
Nick Clifton 2004-10-01 12:59:42 +00:00
parent 14127cc4f2
commit 40a18ebd3a
11 changed files with 139 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2004-10-01 Paul Brook <paul@codesourcery.com>
* elf32-arm.h (elf32_arm_fake_sections,
is_arm_elf_unwind_section_name, elf32_arm_section_from_shdr): New
functions.
(elf_backend_fake_sections, elf_backend_section_from_shdr): Define.
2004-10-01 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (struct eh_cie_fde): Add need_relative and

View File

@ -4235,9 +4235,6 @@ elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
}
}
static bfd_boolean elf32_arm_section_flags (flagword *, const Elf_Internal_Shdr *);
static void elf32_arm_final_write_processing (bfd *, bfd_boolean);
/* Set the right machine number for an Arm ELF file. */
static bfd_boolean
@ -4255,6 +4252,65 @@ elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED
bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
}
/* Return TRUE if this is an unwinding table entry. */
static bfd_boolean
is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
{
size_t len1, len2;
len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
|| strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
}
/* Set the type and flags for an ARM section. We do this by
the section name, which is a hack, but ought to work. */
static bfd_boolean
elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
{
const char * name;
name = bfd_get_section_name (abfd, sec);
if (is_arm_elf_unwind_section_name (abfd, name))
{
hdr->sh_type = SHT_ARM_EXIDX;
hdr->sh_flags |= SHF_LINK_ORDER;
}
return TRUE;
}
/* Handle an ARM specific section when reading an object file.
This is called when elf.c finds a section with an unknown type. */
static bfd_boolean
elf32_arm_section_from_shdr (bfd *abfd,
Elf_Internal_Shdr * hdr,
const char *name)
{
/* There ought to be a place to keep ELF backend specific flags, but
at the moment there isn't one. We just keep track of the
sections by their name, instead. Fortunately, the ABI gives
names for all the ARM specific sections, so we will probably get
away with this. */
switch (hdr->sh_type)
{
case SHT_ARM_EXIDX:
break;
default:
return FALSE;
}
if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
return FALSE;
return TRUE;
}
/* Called for each symbol. Builds a section map based on mapping symbols.
Does not alter any of the symbols. */
@ -4426,6 +4482,8 @@ elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
#define elf_backend_reloc_type_class elf32_arm_reloc_type_class
#define elf_backend_object_p elf32_arm_object_p
#define elf_backend_section_flags elf32_arm_section_flags
#define elf_backend_fake_sections elf32_arm_fake_sections
#define elf_backend_section_from_shdr elf32_arm_section_from_shdr
#define elf_backend_final_write_processing elf32_arm_final_write_processing
#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol

View File

@ -1,3 +1,8 @@
2004-10-01 Paul Brook <paul@codesourcery.com>
* readelf.c (get_arm_section_type_name): New function.
(get_section_type_name): Use it.
2004-09-28 Nick Clifton <nickc@redhat.com>
* nm.c: Reorder functions to eliminate most of the static function

View File

@ -2403,6 +2403,19 @@ get_ia64_section_type_name (unsigned int sh_type)
return NULL;
}
static const char *
get_arm_section_type_name (unsigned int sh_type)
{
switch (sh_type)
{
case SHT_ARM_EXIDX:
return "ARM_EXIDX";
default:
break;
}
return NULL;
}
static const char *
get_section_type_name (unsigned int sh_type)
{
@ -2453,6 +2466,9 @@ get_section_type_name (unsigned int sh_type)
case EM_IA_64:
result = get_ia64_section_type_name (sh_type);
break;
case EM_ARM:
result = get_arm_section_type_name (sh_type);
break;
default:
result = NULL;
break;

View File

@ -1,3 +1,10 @@
2004-10-01 Paul Brook <paul@codesourcery.com>
* config/tc-arm.c (arm_elf_section_type): New function.
(arm_elf_change_section): Set section link for exidx sections.
* config/tc-arm.h (arm_elf_section_type): Add prototype.
(md_elf_section_type): Define.
2004-10-01 Bill Farmer <Bill@the-farmers.freeserve.co.uk>
* config/tc-pdp11.c (md_apply_fix3): Change to sign of the SOB

View File

@ -1338,6 +1338,11 @@ arm_elf_change_section (void)
{
flagword flags;
/* Link an unlinked unwind index table section to the .text section. */
if (elf_section_type (now_seg) == SHT_ARM_EXIDX
&& elf_linked_to_section (now_seg) == NULL)
elf_linked_to_section (now_seg) = text_section;
if (!SEG_NORMAL (now_seg))
return;
@ -1349,6 +1354,15 @@ arm_elf_change_section (void)
mapstate = seg_info (now_seg)->tc_segment_info_data;
}
int
arm_elf_section_type (const char * str, size_t len)
{
if (len == 5 && strncmp (str, "exidx", 5) == 0)
return SHT_ARM_EXIDX;
return -1;
}
#else
#define mapping_state(a)
#endif /* OBJ_ELF */

View File

@ -167,6 +167,7 @@ struct fix;
# define DWARF2_LINE_MIN_INSN_LENGTH 2
# define obj_frob_symbol(sym, punt) armelf_frob_symbol ((sym), & (punt))
# define md_elf_section_change_hook() arm_elf_change_section ()
# define md_elf_section_type(str, len) arm_elf_section_type (str, len)
# define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
# define LOCAL_LABEL_PREFIX '.'
# define TC_SEGMENT_INFO_TYPE enum mstate
@ -209,3 +210,5 @@ extern void cons_fix_new_arm (fragS *, int, int, expressionS *);
extern void arm_init_frag (struct frag *);
extern void arm_handle_align (struct frag *);
extern bfd_boolean arm_fix_adjustable (struct fix *);
extern int arm_elf_section_type (const char *, size_t);

View File

@ -1,3 +1,10 @@
2004-10-01 Paul Brook <paul@codesourcery.com>
* arm.h (SHT_ARM_EXIDX): Define.
(ELF_STRING_ARM_unwind, ELF_STRING_ARM_unwind,
ELF_STRING_ARM_unwind_once, ELF_STRING_ARM_unwind_info_once):
Define.
2004-08-25 Dmitry Diky <diwil@spec.ru>
* msp430.h: Add new relocs.

View File

@ -64,6 +64,9 @@
#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
/* Additional section types. */
#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */
/* ARM-specific values for sh_flags. */
#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */
@ -157,5 +160,11 @@ END_RELOC_NUMBERS (R_ARM_max)
/* The name of the note section used to identify arm variants. */
#define ARM_NOTE_SECTION ".note.gnu.arm.ident"
/* Special section names. */
#define ELF_STRING_ARM_unwind ".ARM.exidx"
#define ELF_STRING_ARM_unwind_info ".ARM.extab"
#define ELF_STRING_ARM_unwind_once ".gnu.linkonce.armexidx."
#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab."
#endif /* _ELF_ARM_H */

View File

@ -1,3 +1,7 @@
2004-10-01 Paul Brook <paul@codesourcery.com>
* emulparams/armelf.sh: Add unwinding table sections.
2004-09-30 Filip Navara <navaraf@reactos.com>
* emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols): Generate

View File

@ -10,6 +10,11 @@ OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7)'
OTHER_BSS_SYMBOLS='__bss_start__ = .;'
OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;'
OTHER_SECTIONS='.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }'
OTHER_READONLY_SECTIONS="
.ARM.extab ${RELOCATING-0} : { *(.ARM.extab${RELOCATING+* .gnu.linkonce.armextab.*}) }
__exidx_start = .;
.ARM.exidx ${RELOCATING-0} : { *(.ARM.exidx${RELOCATING+* .gnu.linkonce.armexidx.*}) }
__exidx_end = .;"
DATA_START_SYMBOLS='__data_start = . ;';