From 09e5322ac06823a664de9028cc31deab297c0a08 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 29 Aug 1998 02:43:47 +0000 Subject: [PATCH] * elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare. * elf.c (_bfd_elf_rel_vtable_reloc_fn): New. * elf32-i386.c (elf_howto_table): Add vtable relocs. (elf_i386_reloc_type_lookup): Recognize them. (elf_i386_check_relocs): Pass them off to generic code. (elf_i386_relocate_section): Ignore them. (elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New. (elf_backend_can_gc_sections): True. --- bfd/ChangeLog | 33 ++++++-------- bfd/elf-bfd.h | 123 ++++++++++++++++++++++++++++++++++++++++++-------- bfd/elf.c | 20 +++++++- 3 files changed, 138 insertions(+), 38 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 80c329cfdd4..fb569c25715 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,4 +1,15 @@ -start-sanitize-armelf +Fri Aug 28 19:38:53 1998 Richard Henderson + + * elf-bfd.h (_bfd_elf_rel_vtable_reloc_fn): Declare. + * elf.c (_bfd_elf_rel_vtable_reloc_fn): New. + + * elf32-i386.c (elf_howto_table): Add vtable relocs. + (elf_i386_reloc_type_lookup): Recognize them. + (elf_i386_check_relocs): Pass them off to generic code. + (elf_i386_relocate_section): Ignore them. + (elf_i386_gc_mark_hook, elf_i386_gc_sweep_hook): New. + (elf_backend_can_gc_sections): True. + Thu Aug 20 15:03:45 1998 Nick Clifton * elf32-arm.c (elf32_thumb_to_arm_stub): Check sym_sec is not NULL @@ -6,7 +17,7 @@ Thu Aug 20 15:03:45 1998 Nick Clifton (elf32_arm_to_thumb_stub): Ditto. (elf32_arm_relocate_section): Compute name before calling elf32_arm_final_link_relocate(). -end-sanitize-armelf + Wed Aug 19 15:43:26 1998 Michael Snyder * elfcode.h (elf_object_p): Reject files of header type ET_CORE @@ -37,12 +48,11 @@ Wed Aug 19 15:43:26 1998 Michael Snyder R_PPC_EMB_SDA21, R_PPC_EMB_RELSDA. In all these cases also ignore output_offset for correct evaluation of addend. -start-sanitize-armelf Tue Aug 18 11:48:12 1998 Catherine Moore * elf32-arm.c: Add prefix bfd_ to elf32_arm_get_bfd_for_interworking, - elf32_arm_allocate_interworking_sections and - elf32_arm_process_before_allocation. + elf32_arm_allocate_interworking_sections and + elf32_arm_process_before_allocation. Tue Aug 18 11:46:00 1998 Nick Clifton @@ -52,7 +62,6 @@ Tue Aug 18 11:46:00 1998 Nick Clifton * bfd-in2.h: Regenerate. -end-sanitize-armelf Sat Aug 15 20:55:08 1998 Richard Henderson * elf64-alpha.c (elf64_alpha_relax_section): Handle indirect symbols. @@ -62,7 +71,6 @@ Fri Aug 14 09:12:28 1998 Stan Cox * aoutx.h (aout_link_input_section_ext): Use the relocation already calculated for RELOC_SPARC_REV32 case. -start-sanitize-armelf Thu Aug 13 14:02:02 1998 Catherine Moore * bfd-in.h: Add prototypes for elf32_arm_get_bfd_for_interworking, @@ -88,7 +96,6 @@ Thu Aug 13 14:02:02 1998 Catherine Moore (elf32_arm_relocate_section): Pass symbol section to elf32_arm_final_link_relocate. -end-sanitize-armelf Wed Aug 12 19:00:39 1998 Geoff Keating * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Generate PLT @@ -99,14 +106,11 @@ Wed Aug 12 14:48:33 1998 Ian Lance Taylor * libaout.h: Remove nested comment to avoid warning. -start-sanitize-armelf Wed Aug 12 08:10:11 1998 Catherine Moore * elf32-arm.c (elf32_arm_final_link_relocate): Rework R_ARM_PC24 relocation. -end-sanitize-armelf -start-sanitize-armelf Tue Aug 11 14:42:26 1998 Catherine Moore * elf32-arm.c (elf32_arm_final_link_relocate): Remove unused @@ -115,7 +119,6 @@ Tue Aug 11 14:42:26 1998 Catherine Moore (elf32_arm_relocate_section): Don't pass local sym and pass sym_flags to elf32_arm_final_link_relocate. -end-sanitize-armelf Mon Aug 10 20:38:39 1998 Richard Henderson * elf64-alpha.c (elf64_alpha_calc_dynrel_sizes): Correct last change @@ -139,13 +142,11 @@ Mon Aug 10 17:31:21 1998 Ian Lance Taylor * ieee.c (ieee_write_processor): Correct the processor ID written out for bfd_arch_m68k, accommodating change of March 25. -start-sanitize-armelf Sun Aug 9 20:55:44 1998 Catherine Moore * elf32-arm.c (elf32_arm_final_link_relocate): Rework R_ARM_THM_RPC22 relocations. -end-sanitize-armelf Sat Aug 8 15:15:30 1998 Richard Henderson * elf64-alpha.c (alpha_elf_dynamic_symbol_p): Undef weak symbols @@ -153,7 +154,6 @@ Sat Aug 8 15:15:30 1998 Richard Henderson (elf64_alpha_calc_dynrel_sizes): Allow enough room for RELATIVE .got relocs in -Bsymbolic shared objects. -start-sanitize-armelf Wed Aug 5 15:48:08 1998 Nick Clifton * elf32-arm.c: Add private flags to ELF header. @@ -162,7 +162,6 @@ Wed Aug 5 15:48:08 1998 Nick Clifton (elf32_arm_copy_private_flags): New Function. (elf32_arm_merge_private_bfd_data): New Function. -end-sanitize-armelf Mon Aug 3 17:10:15 1998 Ian Lance Taylor * elf32-sparc.c (elf32_sparc_check_relocs): Permit WPLT30 against @@ -181,7 +180,6 @@ Sun Aug 2 03:19:23 1998 Richard Henderson * elf32-mips.c (_bfd_mips_elf_section_from_shdr): Don't pass ".liblist" string through gettext. -start-sanitize-armelf Fri Jul 31 16:38:14 1998 Catherine Moore * Makefile.am: Add support for elf32-arm.lo. @@ -195,7 +193,6 @@ Fri Jul 31 16:38:14 1998 Catherine Moore bfd_target bfd_elf32_littlearm_vec. * elf32-arm.c: New file. -end-sanitize-armelf Tue Jun 28 19:05:28 1998 Stan Cox * libaout.h (M_SPARCLITE_LE): New machine. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 455bc5c2ef8..252f02423ea 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1,5 +1,5 @@ /* BFD back-end data structures for ELF files. - Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. + Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -96,17 +96,24 @@ struct elf_link_hash_entry struct elf_link_hash_entry *weakdef; /* If this symbol requires an entry in the global offset table, the - processor specific backend uses this field to hold the offset - into the .got section. If this field is -1, then the symbol does - not require a global offset table entry. */ - bfd_vma got_offset; - - /* If this symbol requires an entry in the procedure linkage table, - the processor specific backend uses these two fields to hold the - offset into the procedure linkage section and the offset into the - .got section. If plt_offset is -1, then the symbol does not - require an entry in the procedure linkage table. */ - bfd_vma plt_offset; + processor specific backend uses this field to track usage and + final offset. We use a union and two names primarily to document + the intent of any particular piece of code. The field should be + used as a count until size_dynamic_sections, at which point the + contents of the .got is fixed. Afterward, if this field is -1, + then the symbol does not require a global offset table entry. */ + union + { + bfd_signed_vma refcount; + bfd_vma offset; + } got; + + /* Same, but tracks a procedure linkage table entry. */ + union + { + bfd_signed_vma refcount; + bfd_vma offset; + } plt; /* If this symbol is used in the linker created sections, the processor specific backend uses this field to map the field into the offset @@ -126,6 +133,14 @@ struct elf_link_hash_entry struct bfd_elf_version_tree *vertree; } verinfo; + /* Virtual table entry use information. This array is of size + size/sizeof(target_void_pointer), and indexed via + offset/sizeof(void*) as well. */ + boolean *vtable_entries_used; + + /* Virtual table derivation info. */ + struct elf_link_hash_entry *vtable_parent; + /* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */ char type; @@ -152,6 +167,10 @@ struct elf_link_hash_entry #define ELF_LINK_NON_ELF 0200 /* Symbol should be marked as hidden in the version information. */ #define ELF_LINK_HIDDEN 0400 + /* Symbol was forced to local scope due to a version script file. */ +#define ELF_LINK_FORCED_LOCAL 01000 + /* Symbol was marked during garbage collection. */ +#define ELF_LINK_HASH_MARK 02000 }; /* ELF linker hash table. */ @@ -471,6 +490,20 @@ struct elf_backend_data backend specific fashion. */ boolean (*elf_backend_modify_segment_map) PARAMS ((bfd *)); + /* This function is called during section gc to discover the section a + particular relocation refers to. It need not be defined for hosts + that have no queer relocation types. */ + asection * (*gc_mark_hook) + PARAMS ((bfd *abfd, struct bfd_link_info *, Elf_Internal_Rela *, + struct elf_link_hash_entry *h, Elf_Internal_Sym *)); + + /* This function, if defined, is called during the sweep phase of gc + in order that a backend might update any data structures it might + be maintaining. */ + boolean (*gc_sweep_hook) + PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *o, + const Elf_Internal_Rela *relocs)); + /* The swapping table to use when dealing with ECOFF information. Used for the MIPS ELF .mdebug section. */ const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap; @@ -481,9 +514,21 @@ struct elf_backend_data const struct elf_size_info *s; + /* offset of the _GLOBAL_OFFSET_TABLE_ symbol from the start of the + .got section */ + bfd_vma got_symbol_offset; + + /* The size in bytes of the headers for the GOT and PLT. This includes + the so-called reserved entries on some systems. */ + bfd_vma got_header_size; + bfd_vma plt_header_size; + unsigned want_got_plt : 1; unsigned plt_readonly : 1; unsigned want_plt_sym : 1; + unsigned plt_not_loaded : 1; + unsigned plt_alignment : 4; + unsigned can_gc_sections : 1; }; /* Information stored for each BFD section in an ELF file. This @@ -557,7 +602,7 @@ typedef struct elf_linker_section bfd_vma max_hole_offset; /* maximum offset for the hole */ elf_linker_section_enum_t which; /* which section this is */ boolean hole_written_p; /* whether the hole has been initialized */ - int alignment; /* alignment for the section */ + unsigned int alignment; /* alignment for the section */ flagword flags; /* flags to use to create the section */ } elf_linker_section_t; @@ -613,8 +658,17 @@ struct elf_obj_tdata struct elf_link_hash_entry **sym_hashes; /* A mapping from local symbols to offsets into the global offset - table, used when linking. This is indexed by the symbol index. */ - bfd_vma *local_got_offsets; + table, used when linking. This is indexed by the symbol index. + Like for the globals, we use a union and two names primarily to + document the intent of any particular piece of code. The field + should be used as a count until size_dynamic_sections, at which + point the contents of the .got is fixed. Afterward, if an entry + is -1, then the symbol does not require a global offset table entry. */ + union + { + bfd_signed_vma *refcounts; + bfd_vma *offsets; + } local_got; /* A mapping from local symbols to offsets into the various linker sections added. This is index by the symbol index. */ @@ -649,6 +703,9 @@ struct elf_obj_tdata find_nearest_line. */ struct mips_elf_find_line *find_line_info; + /* A place to stash dwarf2 info for this bfd. */ + struct dwarf2_debug *dwarf2_find_line_info; + /* An array of stub sections indexed by symbol number, used by the MIPS ELF linker. FIXME: We should figure out some way to only include this field for a MIPS ELF target. */ @@ -658,10 +715,10 @@ struct elf_obj_tdata boolean flags_init; /* Number of symbol version definitions we are about to emit. */ - int cverdefs; + unsigned int cverdefs; /* Number of symbol version references we are about to emit. */ - int cverrefs; + unsigned int cverrefs; /* Symbol version definitions in external objects. */ Elf_Internal_Verdef *verdef; @@ -690,7 +747,8 @@ struct elf_obj_tdata #define elf_gp(bfd) (elf_tdata(bfd) -> gp) #define elf_gp_size(bfd) (elf_tdata(bfd) -> gp_size) #define elf_sym_hashes(bfd) (elf_tdata(bfd) -> sym_hashes) -#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got_offsets) +#define elf_local_got_refcounts(bfd) (elf_tdata(bfd) -> local_got.refcounts) +#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets) #define elf_local_ptr_offsets(bfd) (elf_tdata(bfd) -> linker_section_pointers) #define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name) #define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab) @@ -742,6 +800,7 @@ extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *, bfd *, char **)); extern boolean bfd_elf_mkobject PARAMS ((bfd *)); +extern boolean bfd_elf_mkcorefile PARAMS ((bfd *)); extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *)); extern boolean _bfd_elf_make_section_from_shdr PARAMS ((bfd *abfd, Elf_Internal_Shdr *hdr, const char *name)); @@ -761,6 +820,7 @@ extern boolean _bfd_elf_copy_private_symbol_data extern boolean _bfd_elf_copy_private_section_data PARAMS ((bfd *, asection *, bfd *, asection *)); extern boolean _bfd_elf_write_object_contents PARAMS ((bfd *)); +extern boolean _bfd_elf_write_corefile_contents PARAMS ((bfd *)); extern boolean _bfd_elf_set_section_contents PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type)); @@ -962,6 +1022,33 @@ extern Elf_Internal_Rela *_bfd_elf64_link_read_relocs #define bfd_elf32_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol #define bfd_elf64_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol +extern boolean _bfd_elf_close_and_cleanup PARAMS ((bfd *)); +extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn + PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR, + asection *, bfd *, char **)); + +boolean _bfd_elf32_gc_sections + PARAMS ((bfd *abfd, struct bfd_link_info *info)); +boolean _bfd_elf32_gc_common_finalize_got_offsets + PARAMS ((bfd *abfd, struct bfd_link_info *info)); +boolean _bfd_elf32_gc_common_final_link + PARAMS ((bfd *, struct bfd_link_info *)); +boolean _bfd_elf32_gc_record_vtinherit + PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma)); +boolean _bfd_elf32_gc_record_vtentry + PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma)); + +boolean _bfd_elf64_gc_sections + PARAMS ((bfd *abfd, struct bfd_link_info *info)); +boolean _bfd_elf64_gc_common_finalize_got_offsets + PARAMS ((bfd *abfd, struct bfd_link_info *info)); +boolean _bfd_elf64_gc_common_final_link + PARAMS ((bfd *, struct bfd_link_info *)); +boolean _bfd_elf64_gc_record_vtinherit + PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma)); +boolean _bfd_elf64_gc_record_vtentry + PARAMS ((bfd *, asection *, struct elf_link_hash_entry *, bfd_vma)); + /* MIPS ELF specific routines. */ extern boolean _bfd_mips_elf_object_p PARAMS ((bfd *)); diff --git a/bfd/elf.c b/bfd/elf.c index 3e7c14504ff..c4417e2cb06 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3075,11 +3075,9 @@ prep_headers (abfd) case bfd_arch_arc: i_ehdrp->e_machine = EM_CYGNUS_ARC; break; -/* start-sanitize-armelf */ case bfd_arch_arm: i_ehdrp->e_machine = EM_ARM; break; -/* end-sanitize-armelf */ case bfd_arch_m32r: i_ehdrp->e_machine = EM_CYGNUS_M32R; break; @@ -4738,3 +4736,21 @@ _bfd_elf_close_and_cleanup (abfd) return _bfd_generic_close_and_cleanup (abfd); } + +/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY + in the relocation's offset. Thus we cannot allow any sort of sanity + range-checking to interfere. There is nothing else to do in processing + this reloc. */ + +bfd_reloc_status_type +_bfd_elf_rel_vtable_reloc_fn (abfd, re, symbol, data, is, obfd, errmsg) + bfd *abfd; + arelent *re; + struct symbol_cache_entry *symbol; + PTR data; + asection *is; + bfd *obfd; + char **errmsg; +{ + return bfd_reloc_ok; +} -- 2.30.2