diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-02-06 20:01:08 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-02-06 20:01:08 +0000 |
commit | 6c97aedf2686633d3e837802ce51ebe630f64056 (patch) | |
tree | bb409db186375bad6ede2a558c8a29d9dd1cb950 /bfd/ecoff.c | |
parent | ebc4ca90f97420f225f48141c631405357b58c16 (diff) | |
download | binutils-gdb-6c97aedf2686633d3e837802ce51ebe630f64056.tar.gz |
Distinguish a weak defined symbol from a regular defined symbol.
* linker.c (enum link_action): Add DEFW.
(link_action): Add bfd_link_hash_defweak column.
(_bfd_generic_link_add_one_symbol): Add DEFW case. Handle
bfd_link_hash_defweak in a few other cases.
* Many files (bfd_link_hash_undefweak): Renamed from
bfd_link_hash_weak.
* aoutx.h (aout_link_write_symbols): Handle bfd_link_hash_defweak.
(aout_link_write_other_symbol): Likewise.
(aout_link_input_section_std): Likewise.
(aout_link_input_section_ext): Likewise.
* bout.c (get_value): Likewise.
* coff-a29k.c (coff_a29k_relocate_section): Likewise.
* coff-alpha.c (alpha_convert_external_reloc): Likewise.
(alpha_relocate_section): Likewise.
* coff-mips.c (mips_relocate_section): Likewise.
(mips_relax_section): Likewise.
(bfd_mips_ecoff_create_embedded_relocs): Likewise.
* cofflink.c (coff_write_global_sym): Likewise.
(_bfd_coff_generic_relocate_section): Likewise.
* ecoff.c (ecoff_link_add_externals): Likewise.
(ecoff_link_write_external): LIkewise.
* elf32-hppa.c (elf32_hppa_relocate_section): Likewise.
(elf32_hppa_size_stubs): Likewise.
* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Likewise.
(elf_i386_relocate_section): Likewise.
(elf_i386_finish_dynamic_symbol): Likewise.
* elf32-mips.c (mips_elf_output_extsym): Likewise.
(mips_elf_relocate_section): Likewise.
* elf32-sparc.c (elf32_sparc_adjust_dynamic_symbol): Likewise.
(elf32_sparc_relocate_section): Likewise.
* elfcode.h (elf_link_add_object_symbols): Likewise.
(elf_adjust_dynamic_symbol): Likewise.
(elf_bfd_final_link): Likewise.
(elf_link_output_extsym): Likewise.
* i386linux.c (linux_add_one_symbol): Likewise.
(linux_tally_symbols): Likewise.
(linux_finish_dynamic_link): Likewise.
* linker.c (_bfd_generic_link_output_symbols): Likewise.
(set_symbol_from_hash): Likewise.
* reloc16.c (bfd_coff_reloc16_get_value): Likewise.
(bfd_perform_slip): Likewise.
* sunos.c (sunos_add_one_symbol): Likewise.
(sunos_scan_std_relocs): Likewise.
(sunos_scan_ext_relocs): Likewise.
(sunos_scan_dynamic_symbol): Likewise.
(sunos_write_dynamic_symbol): Likewise.
Diffstat (limited to 'bfd/ecoff.c')
-rw-r--r-- | bfd/ecoff.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/bfd/ecoff.c b/bfd/ecoff.c index 0875a95d400..d6fbea93581 100644 --- a/bfd/ecoff.c +++ b/bfd/ecoff.c @@ -1,5 +1,5 @@ /* Generic ECOFF (Extended-COFF) routines. - Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. Original version by Per Bothner. Full support added by Ian Lance Taylor, ian@cygnus.com. @@ -1358,7 +1358,7 @@ ecoff_type_to_string (abfd, fdr, indx) } qualifiers[7]; unsigned int basic_type; int i; - static char buffer1[1024]; + char buffer1[1024]; static char buffer2[1024]; char *p1 = buffer1; char *p2 = buffer2; @@ -2027,6 +2027,8 @@ _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset, FDR *fdr_hold; boolean stabs; + offset += section->vma; + /* If we're not in the .text section, we don't have any line numbers. */ if (strcmp (section->name, _TEXT) != 0 @@ -2091,14 +2093,14 @@ _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset, list of procedure descriptors (PDR). PDR's also have an address, which is relative to the FDR address, and are also stored in increasing memory order. */ + if (offset < fdr_ptr->adr) + return false; offset -= fdr_ptr->adr; external_pdr_size = debug_swap->external_pdr_size; pdr_ptr = ((char *) debug_info->external_pdr + fdr_ptr->ipdFirst * external_pdr_size); pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size; (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr); - if (offset < pdr.adr) - return false; /* The address of the first PDR is an offset which applies to the addresses of all the PDR's. */ @@ -2109,7 +2111,7 @@ _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset, pdr_ptr += external_pdr_size) { (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr); - if (offset < pdr.adr) + if (offset < pdr.adr - first_off) break; } @@ -3860,6 +3862,9 @@ ecoff_link_add_archive_symbols (abfd, info) if (! bfd_has_map (abfd)) { + /* An empty archive is a special case. */ + if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL) + return true; bfd_set_error (bfd_error_no_symbols); return false; } @@ -4360,7 +4365,8 @@ ecoff_link_add_externals (abfd, info, external_ext, ssext) if (h->abfd == (bfd *) NULL || (! bfd_is_und_section (section) && (! bfd_is_com_section (section) - || h->root.type != bfd_link_hash_defined))) + || (h->root.type != bfd_link_hash_defined + && h->root.type != bfd_link_hash_defweak)))) { h->abfd = abfd; h->esym = esym; @@ -4732,7 +4738,8 @@ ecoff_link_write_external (h, data) h->esym.asym.value = 0; h->esym.asym.st = stGlobal; - if (h->root.type != bfd_link_hash_defined) + if (h->root.type != bfd_link_hash_defined + && h->root.type != bfd_link_hash_defweak) h->esym.asym.sc = scAbs; else { @@ -4787,12 +4794,13 @@ ecoff_link_write_external (h, data) case bfd_link_hash_new: abort (); case bfd_link_hash_undefined: - case bfd_link_hash_weak: + case bfd_link_hash_undefweak: if (h->esym.asym.sc != scUndefined && h->esym.asym.sc != scSUndefined) h->esym.asym.sc = scUndefined; break; case bfd_link_hash_defined: + case bfd_link_hash_defweak: if (h->esym.asym.sc == scUndefined || h->esym.asym.sc == scSUndefined) h->esym.asym.sc = scAbs; @@ -4979,7 +4987,7 @@ ecoff_reloc_link_order (output_bfd, info, output_section, link_order) rel.address = link_order->offset; rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); - if (rel.howto == (const reloc_howto_type *) NULL) + if (rel.howto == 0) { bfd_set_error (bfd_error_bad_value); return false; |