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 | 7fd9c191355658e46a200799e25042a5e492a4d2 (patch) | |
tree | 02aa1c842370517c2f48a438967c8ecfd8c89ff9 | |
parent | 7d923127c03bdb24c4aeeb07a4a9648aad823f5f (diff) | |
download | fsf-binutils-gdb-7fd9c191355658e46a200799e25042a5e492a4d2.zip fsf-binutils-gdb-7fd9c191355658e46a200799e25042a5e492a4d2.tar.gz fsf-binutils-gdb-7fd9c191355658e46a200799e25042a5e492a4d2.tar.bz2 |
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.
-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. */ |