summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/cofflink.c41
-rw-r--r--bfd/libcoff-in.h5
-rw-r--r--bfd/libcoff.h5
4 files changed, 52 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 53a08c4532..e013fb5d4e 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 679e7a84d8..f8748327f3 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 0dc2121c98..dae881f288 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 c418a4d466..0eebf5ffb9 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. */