diff options
author | Jakub Jelinek <jakub@redhat.com> | 2001-12-13 11:09:34 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2001-12-13 11:09:34 +0000 |
commit | 6576570080f306b7799bd1deb2abffdbcc6dc0a5 (patch) | |
tree | 7195727fd9a8486b8f920c7dd3b39148ba67d838 /bfd/elf-bfd.h | |
parent | 49d5aff7e554f7aa7ce868f70d85f98ceed622bf (diff) | |
download | gdb-6576570080f306b7799bd1deb2abffdbcc6dc0a5.zip gdb-6576570080f306b7799bd1deb2abffdbcc6dc0a5.tar.gz gdb-6576570080f306b7799bd1deb2abffdbcc6dc0a5.tar.bz2 |
* elf-bfd.h (enum elf_link_info_type): New.
(struct bfd_elf_section_data): Remove stab_info and merge_info
fields, add sec_info and sec_info_type.
(struct elf_obj_tdata): Add eh_frame_hdr field.
(_bfd_elf_discard_section_eh_frame): New prototype.
(_bfd_elf_discard_section_eh_frame_hdr): Likewise.
(_bfd_elf_eh_frame_section_offset): Likewise.
(_bfd_elf_write_section_eh_frame): Likewise.
(_bfd_elf_write_section_eh_frame_hdr): Likewise.
* Makefile.am (BFD32_BACKENDS): Add elf-eh-frame.lo.
(BFD32_BACKENDS_CFILES): Add elf-eh-frame.c.
(elf-eh-frame.lo): New.
* Makefile.in: Rebuilt.
* configure.in (elf): Add elf-eh-frame.lo.
* configure: Rebuilt.
* elf.c (_bfd_elf_print_private_bfd_data): Support PT_GNU_EH_FRAME.
(map_sections_to_segments): Create PT_GNU_EH_FRAME if requested.
(get_program_header_size): Take into account PT_GNU_EH_FRAME
segment.
(_bfd_elf_rela_local_sym): Use sec_info_type and sec_info.
(_bfd_elf_rel_local_sym): Likewise.
(_bfd_elf_section_offset): Likewise. Call
_bfd_elf_eh_frame_section_offset too.
* elfxx-ia64.c (elfNN_ia64_relocate_section): Use sec_info_type and
sec_info.
* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
* elf-eh-frame.c: New file.
* elflink.h (elf_link_add_object_symbols): Don't optimize SHF_MERGE
.stab sections. Set sec_info_type, use sec_info instead
of merge_info and stab_info.
(elf_link_create_dynamic_sections): Create .eh_frame_hdr section
if --eh-frame-hdr.
(elf_bfd_final_link): Write .eh_frame_hdr section.
(elf_link_sec_merge_syms): Use sec_info_type and sec_info.
(elf_link_input_bfd): Likewise.
Call _bfd_elf_write_section_eh_frame to write .eh_frame sections.
(elf_bfd_discard_info): Add output_bfd argument.
Call _bfd_elf_discard_section_eh_frame and
_bfd_elf_discard_section_eh_frame_hdr.
(elf_section_ignore_discarded_relocs): Use sec_info_type, not section
names.
* bfd-in.h (bfd_elf32_discard_info, bfd_elf64_discard_info): Adjust
prototypes.
* bfd-in2.h (bfd_elf32_discard_info, bfd_elf64_discard_info): Likewise.
* elf/common.h (PT_GNU_EH_FRAME): Define.
* bfdlink.h (struct bfd_link_info): Add eh_frame_hdr field.
* emultempl/elf32.em (finish): Supply output_bfd
to bfd_elf*_discard_info.
(OPTION_EH_FRAME_HDR): Define.
(longopts): Add --eh-frame-hdr.
(parse_args): Handle it.
(list_options): Add --eh-frame-hdr to help.
* emultempl/hppaelf.em (finish): Supply output_bfd
to bfd_elf*_discard_info.
* scripttempl/elf.sc (.eh_frame_hdr): Add.
* readelf.c (get_segment_type): Support PT_GNU_EH_FRAME.
Diffstat (limited to 'bfd/elf-bfd.h')
-rw-r--r-- | bfd/elf-bfd.h | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 3323aaa..d1b088a 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -223,6 +223,16 @@ struct elf_link_local_dynamic_entry Elf_Internal_Sym isym; }; +enum elf_link_info_type +{ + ELF_INFO_TYPE_NONE, + ELF_INFO_TYPE_STABS, + ELF_INFO_TYPE_MERGE, + ELF_INFO_TYPE_EH_FRAME, + ELF_INFO_TYPE_EH_FRAME_HDR, + ELF_INFO_TYPE_LAST +}; + /* ELF linker hash table. */ struct elf_link_hash_table @@ -848,11 +858,11 @@ struct bfd_elf_section_data no dynamic symbol for this section. */ long dynindx; - /* A pointer used for .stab linking optimizations. */ - PTR stab_info; + /* A pointer used for various section optimizations. */ + PTR sec_info; - /* A pointer used for SEC_MERGE optimizations. */ - PTR merge_info; + /* Type of that information. */ + enum elf_link_info_type sec_info_type; /* Group name, if this section is part of a group. */ const char *group_name; @@ -1043,6 +1053,10 @@ struct elf_obj_tdata /* Used to determine if the e_flags field has been initialized */ boolean flags_init; + /* Used to determine if PT_GNU_EH_FRAME segment header should be + created. */ + boolean eh_frame_hdr; + /* Number of symbol version definitions we are about to emit. */ unsigned int cverdefs; @@ -1271,6 +1285,18 @@ extern boolean _bfd_elf_strtab_emit extern void _bfd_elf_strtab_finalize PARAMS ((struct elf_strtab_hash *)); +extern boolean _bfd_elf_discard_section_eh_frame + PARAMS ((bfd *, struct bfd_link_info *, asection *, asection *, + boolean (*) (bfd_vma, PTR), struct elf_reloc_cookie *)); +extern boolean _bfd_elf_discard_section_eh_frame_hdr + PARAMS ((bfd *, struct bfd_link_info *, asection *)); +extern bfd_vma _bfd_elf_eh_frame_section_offset + PARAMS ((bfd *, asection *, bfd_vma)); +extern boolean _bfd_elf_write_section_eh_frame + PARAMS ((bfd *, asection *, asection *, bfd_byte *)); +extern boolean _bfd_elf_write_section_eh_frame_hdr + PARAMS ((bfd *, asection *)); + extern boolean _bfd_elf_link_record_dynamic_symbol PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); extern long _bfd_elf_link_lookup_local_dynindx |