diff options
author | Ian Lance Taylor <ian@airs.com> | 1999-07-24 03:16:50 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1999-07-24 03:16:50 +0000 |
commit | 3f18bf53f6f3910e3ccec25fcb1acf27e6afd7ef (patch) | |
tree | 0771c8111fcc71ffe5a13beca9d52d93c3dec6bf /bfd/cofflink.c | |
parent | 8f22cf1e6910a17be6f0266b836b526f98f88192 (diff) | |
download | gdb-3f18bf53f6f3910e3ccec25fcb1acf27e6afd7ef.tar.gz |
1999-07-23 Donn Terry <donn@interix.com>
* libcoff-in.h (coff_link_hash_entry): Add coff_link_hash_flags
field, and define COFF_LINK_HASH_PE_SECTION_SYMBOL.
* cofflink.c (coff_link_add_symbols): If PE, handle section
symbols specially.
* libcoff.h: Rebuild.
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r-- | bfd/cofflink.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 679e7a84d87..f8748327f33 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -351,6 +351,7 @@ coff_link_add_symbols (abfd, info) flagword flags; asection *section; bfd_vma value; + boolean addit; /* This symbol is externally visible. */ @@ -392,11 +393,41 @@ coff_link_add_symbols (abfd, info) || (obj_pe (abfd) && sym.n_sclass == C_NT_WEAK)) flags = BSF_WEAK; - if (! (bfd_coff_link_add_one_symbol - (info, abfd, name, flags, section, value, - (const char *) NULL, copy, false, - (struct bfd_link_hash_entry **) sym_hash))) - goto error_return; + addit = true; + + /* In the PE format, section symbols actually refer to the + start of the output section. We handle them specially + here. */ + if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0) + { + *sym_hash = coff_link_hash_lookup (coff_hash_table (info), + name, false, copy, false); + if (*sym_hash != NULL) + { + if (((*sym_hash)->coff_link_hash_flags + & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0 + && (*sym_hash)->root.type != bfd_link_hash_undefined + && (*sym_hash)->root.type != bfd_link_hash_undefweak) + (*_bfd_error_handler) + ("Warning: symbol `%s' is both section and non-section", + name); + + addit = false; + } + } + + if (addit) + { + if (! (bfd_coff_link_add_one_symbol + (info, abfd, name, flags, section, value, + (const char *) NULL, copy, false, + (struct bfd_link_hash_entry **) sym_hash))) + goto error_return; + } + + if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0) + (*sym_hash)->coff_link_hash_flags |= + COFF_LINK_HASH_PE_SECTION_SYMBOL; if (section == bfd_com_section_ptr && (*sym_hash)->root.type == bfd_link_hash_common |