diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/cofflink.c | 41 | ||||
-rw-r--r-- | bfd/libcoff-in.h | 5 | ||||
-rw-r--r-- | bfd/libcoff.h | 5 |
4 files changed, 52 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 53a08c4..e013fb5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 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. + * config.bfd (i[3456]86-*-interix*): New target. 1999-07-21 Mark Elbrecht <snowball3@bigfoot.com> diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 679e7a8..f874832 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 diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index 0dc2121..dae881f 100644 --- a/bfd/libcoff-in.h +++ b/bfd/libcoff-in.h @@ -249,6 +249,11 @@ struct coff_link_hash_entry /* Pointer to array of auxiliary entries, if any. */ union internal_auxent *aux; + + /* Flag word; legal values follow. */ + unsigned short coff_link_hash_flags; + /* Symbol is a PE section symbol. */ +#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01) }; /* COFF linker hash table. */ diff --git a/bfd/libcoff.h b/bfd/libcoff.h index c418a4d..0eebf5f 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -249,6 +249,11 @@ struct coff_link_hash_entry /* Pointer to array of auxiliary entries, if any. */ union internal_auxent *aux; + + /* Flag word; legal values follow. */ + unsigned short coff_link_hash_flags; + /* Symbol is a PE section symbol. */ +#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01) }; /* COFF linker hash table. */ |