relocation, do not continue processing it. Ignore R_XTENSA_ASM_EXPAND
relocations against dynamic symbols.
(elf_xtensa_finish_dynamic_sections): Do not fail if there is no
.xt.lit section.
overlays where possible. Use a faster call stub, or optionally at
compile time, a more compact stub. Double size of _ovly_buf_table
so that low bit of _ovly_table.buf can be used as a "present" bit.
Reserve an extra _ovly_table entry for index zero.
PR 5604
* elf-bfd.h (struct elf_backend_data): Add gc_keep. Remove param
names from others.
(_bfd_elf_gc_keep): Declare.
* elfxx-target.h (elf_backend_gc_keep): Define.
(elfNN_bed): Init new field.
* elflink.c (_bfd_elf_gc_keep): New function.
(bfd_elf_gc_sections): Call gc_keep.
* elf64-ppc.c (elf_backend_gc_keep): Define.
(struct _ppc64_elf_section_data): Move .opd related fields to
a struct so they don't occupy the same storage. Adjust accesses
throughout file.
(ppc64_elf_gc_keep): New function, split out from..
(ppc64_elf_gc_mark_hook): ..here. Don't call _bfd_elf_gc_mark
to mark .opd section, just set gc_mark.
(ppc64_elf_edit_opd): Remove no_opd_opt parm. Don't set opd->adjust
unless we are changing .opd. Test non-NULL opd->adjust at all
accesses throughout file.
* elf64-ppc.h (ppc64_elf_edit_opd): Update prototype.
ld/
PR 5604
* ldlang.c (lang_gc_sections): Move code to set SEC_KEEP on entry
syms to _bfd_elf_gc_keep.
* emultempl/ppc64elf.em (ppc_before_allocation): Don't call
ppc64_elf_edit_opd if no_opd_opt.
PR ld/5526
* elf-bfd.h (eh_cie_fde): Add u.cie.u.full_cie and u.cie.merged
fields. Rename u.cie.u.merged to u.cie.u.merged_with.
(eh_frame_sec_info): Add a cies field.
(eh_frame_hdr_info): Add a merge_cies field.
* elf-eh-frame.c (cie): Add a reloc_index member to the personality
union.
(_bfd_elf_begin_eh_frame_parsing): Set hdr_info->merge_cies instead
of hdr_info->cies.
(_bfd_elf_parse_eh_frame): Remove tmp_cie. Ccreate an array of
cie structures in all cases and use it instead of extended_cies.
If merging, store the cie array in sec_info->cies and point each
CIE's eh_fde_cie at the associated element. Do not try to
calculate the value of the personality routine here; record the
offset of the relocation instead. Do not merge CIEs here.
(_bfd_elf_end_eh_frame_parsing): Do not free hdr_info->cies here...
(_bfd_elf_discard_section_eh_frame_hdr): ...do it here instead.
(_bfd_elf_gc_mark_fdes): Mark the original (unmerged) CIE.
(find_merged_cie): New function.
(_bfd_elf_gc_mark_fdes): Use it. Free sec_info->cies.
ld/testsuite/
PR ld/5526
* ld-elf/eh6.s, ld-elf/eh6.d: New test.
2008-01-07 H.J. Lu <hongjiu.lu@intel.com>
PR ld/5522
* elflink.c (elf_link_input_bfd): Don't write out a section if
its output section is marked with SEC_NEVER_LOAD.
ld/testsuite/
2008-01-07 H.J. Lu <hongjiu.lu@intel.com>
PR ld/5522
* ld-elf/noload-3.d: New file.
* ld-elf/noload-3.s: Likewise.
* ld-elf/noload-3.t: Likewise.
Scan the segment map looking for the segment containing a
specified function.
* elf-bfd.h: Prototype the new function.
* elf-hppa.h (elf_hppa_osec_to_segment): Delete.
(elf_hppa_record_segment_addrs): Use new function.
* elf32-bfin.c (_bfdfdpic_osec_to_segment): Use new function.
* elf32-frv.c (_frvfdpic_osec_to_segment): Use new function.
* elf32-hppa.c (hppa_record_segment_addr): Use new function.
* elfxx-ia64.c (elfNN_ia64_relocate_section): Use new function.
PR binutils/5449
* elf.c (rewrite_elf_program_header): Don't adjust p_paddr if
p_paddr is set to 0.
(copy_private_bfd_data): Call rewrite_elf_program_header if
p_paddr is set to 0.
* elfcode.h (elf_swap_phdr_out): Set p_paddr to 0 if needed.
* elfxx-ia64.c (ELF_MAXPAGESIZE): Don't redefine it for HPUX.
* elf-bfd.h (eh_cie_fde): Replace u.cie.merged with a union of
a merged field and a sec field.
(eh_frame_hdr_info): Remove offsets_adjusted.
* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Update accesses to
the CIE merged field.
(_bfd_elf_gc_mark_fdes): Likewise.
(_bfd_elf_discard_section_eh_frame): Likewise. Set u.cie.u.sec
when clearing the removed flag.
(_bfd_elf_eh_frame_section_offset): Remove offsets_adjusted handling.
(_bfd_elf_write_section_eh_frame): Likewise. Apply output_offsets
where appropriate.
* elf-bfd.h (eh_cie_fde): Move add_fde_encoding and
per_encoding_relative to u.cie. Add commentary.
* elf-eh-frame.c (cie): Remove make_relative.
(extra_augmentation_string_bytes): Update use of add_fde_encoding.
(extra_augmentation_data_bytes): Likewise. Use an FDE's own
add_augmentation_size field, rather than referring to the CIE.
(_bfd_elf_parse_eh_frame): Don't set the struct cie
make_relative field; set the eh_cie_fde field directly.
Update setting of add_fde_encoding and per_encoding_relative.
Copy make_relative and add_augmentation_size from the CIE
to the FDE.
(_bfd_elf_discard_section_eh_frame): Use the FDE's own
make_relative field.
(_bfd_elf_eh_frame_section_offset): Likewise.
(_bfd_elf_write_section_eh_frame): Update accesses to
add_fde_encoding and per_encoding_relative. Use the FDE's
own make_relative and add_augmentation_size fields.
* elf-bfd.h (eh_cie_fde): Remove need_lsda_relative.
Move make_lsda_relative to u.cie.
* elf-eh-frame.c (cie): Rename make_lsda_relative to
can_make_lsda_relative.
(_bfd_elf_parse_eh_frame): Don't set the old eh_cie_fde
make_lsda_relative field. Update after cie renaming.
Set u.cie.make_lsda_relative if can_make_lsda_relative
and if we find a relocation against the LSDA.
(_bfd_elf_discard_section_eh_frame): Copy make_lsda_relative when
changing a CIE's group representative.
(_bfd_elf_eh_frame_section_offset): Don't set need_ldsa_relative here.
(_bfd_elf_write_section_eh_frame): Check u.cie.make_lsda_relative
rather than need_lsda_relative.
* elf-bfd.h (eh_cie_fde): Add u.fde.next_for_section and
u.cie.gc_mark.
(bfd_elf_section_data): Add fde_list.
(elf_fde_list): New macro.
(elf_obj_tdata): Add eh_frame_section.
(elf_eh_frame_section): New macro.
(_bfd_elf_gc_mark_reloc): Remove last parameter.
(_bfd_elf_gc_mark_fdes): Declare.
* elf-eh-frame.c (_bfd_elf_get_eh_frame_sec_info): Chain the FDEs
for each input section.
(mark_entry, _bfd_elf_gc_mark_fdes): New functions.
* elflink.c (_bfd_elf_gc_mark_reloc): Remove is_eh parameter.
(_bfd_elf_gc_mark): Update call accordingly. Mark the relocations
againts the section's FDEs. Don't mark the bfd's elf_eh_frame_section.
(bfd_elf_gc_sections): Parse each input bfd's .eh_frame before
marking any input sections. Remove the current EH handling.
* section.c (bfd_section): Remove gc_mark_from_eh.
* ecoff.c (bfd_debug_section): Update initializer accordingly.
* elf-bfd.h (eh_cie_fde): Add u.cie. Document how u.fde.cie_inf
changes when removed == 0.
(eh_frame_hdr_info): Add parsed_eh_frames.
(_bfd_elf_begin_eh_frame_parsing): Declare.
(_bfd_elf_parse_eh_frame): Declare.
(_bfd_elf_end_eh_frame_parsing): Declare.
* elf-eh-frame.c (_bfd_elf_begin_eh_frame_parsing): New function.
(_bfd_elf_parse_eh_frame): New function, split out from
_bfd_elf_discard_section_eh_frame. Make a first pass through the
buffer to calculate the number of entries and CIEs. Allocate memory
for them before the main loop. Replace current extended cie
representation with a pair of pointers, one to the local eh_cie_fde
and one to the full struct cie. Allocate a separate array of struct
cies if not merging. Merge CIEs during the main loop and set up each
u.cie.merged field. Point an FDE's cie_inf field directly at the
local CIE. Initially assume that all entries should be removed.
(_bfd_elf_end_eh_frame_parsing): New function.
(_bfd_elf_discard_section_eh_frame): Assume that the section has
already been parsed. Use a separate pass to mark entries that
need to be kept. Use the u.cie.merged field to track a CIE's
group representative.
* elflink.c (bfd_elf_discard_info): Call _bfd_elf_parse_eh_frame
before _bfd_elf_discard_section_eh_frame. Wrap loop with calls to
_bfd_elf_begin_eh_frame_parsing and _bfd_elf_end_eh_frame_parsing.
* elf-bfd.h (eh_cie_fde): Put cie_inf in a union. Add a reloc_index
field. Use bitfields for fde_encoding, lsda_encoding and lsda_offset.
* elf-eh-frame.c (extra_augmentation_data_bytes): Adjust cie_inf
accesses after the above change.
(_bfd_elf_eh_frame_section_offset): Likewise.
(_bfd_elf_write_section_eh_frame): Likewise.
(_bfd_elf_discard_section_eh_frame): Likewise. Set up reloc_index.
* elf-bfd.h (_bfd_elf_gc_mark_rsec, _bfd_elf_gc_mark_reloc): Declare.
(_bfd_elf_gc_mark): Use elf_gc_mark_hook_fn.
* elflink.c (init_reloc_cookie, fini_reloc_cookie)
(init_reloc_cookie_rels, fini_reloc_cookie_rels): New functions,
split out from...
(bfd_elf_discard_info): ...here.
(init_reloc_cookie_for_section): New function.
(fini_reloc_cookie_for_section): Likewise.
(_bfd_elf_gc_mark_rsec, _bfd_elf_gc_mark_reloc): New functions,
split out from...
(_bfd_elf_gc_mark): ...here. Use init_reloc_cookie_for_section
and fini_reloc_cookie_for_section.
the symbol's section is the undefined section.
* gas/testsuite/gas/elf/symtab.s: New test.
gas/testsuite/gas/elf/symtab.d: New expected output.
gas/testsuite/gas/elf/elf.exp: Run the new symbtab test.