aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>1999-09-29 00:31:40 +0000
committerDJ Delorie <dj@redhat.com>1999-09-29 00:31:40 +0000
commit8a5b676cd20d44969c9d797e5b522b673acd6963 (patch)
tree662c00b9ab35af85931d12bc62b936671e71cbb5 /ld/pe-dll.c
parentimport gdb-1999-09-28 snapshot (diff)
downloadbinutils-gdb-8a5b676cd20d44969c9d797e5b522b673acd6963.tar.gz
binutils-gdb-8a5b676cd20d44969c9d797e5b522b673acd6963.tar.bz2
binutils-gdb-8a5b676cd20d44969c9d797e5b522b673acd6963.zip
* pe-dll.c (process_def_file): Move the offset lookup from here to
(fill_exported_offsets): here. New static function. (fill_edata): Use.
Diffstat (limited to 'ld/pe-dll.c')
-rw-r--r--ld/pe-dll.c54
1 files changed, 51 insertions, 3 deletions
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index 61f57f0989e..657f41dae3a 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -384,13 +384,22 @@ process_def_file (abfd, info)
name,
false, false, true);
- if (blhe && (blhe->type == bfd_link_hash_defined))
+ if (blhe
+ && (blhe->type == bfd_link_hash_defined
+ || (blhe->type == bfd_link_hash_common)))
{
count_exported++;
if (!pe_def_file->exports[i].flag_noname)
count_exported_byname++;
- exported_symbol_offsets[i] = blhe->u.def.value;
- exported_symbol_sections[i] = blhe->u.def.section;
+
+ /* Only fill in the sections. The actual offsets are computed
+ in fill_exported_offsets() after common symbols are laid
+ out. */
+ if (blhe->type == bfd_link_hash_defined)
+ exported_symbol_sections[i] = blhe->u.def.section;
+ else
+ exported_symbol_sections[i] = blhe->u.c.p->section;
+
if (pe_def_file->exports[i].ordinal != -1)
{
if (max_ordinal < pe_def_file->exports[i].ordinal)
@@ -572,6 +581,43 @@ generate_edata (abfd, info)
+ name_table_size + strlen (dll_name) + 1);
}
+/* Fill the exported symbol offsets. The preliminary work has already
+ been done in process_def_file(). */
+
+static void
+fill_exported_offsets (abfd, info)
+ bfd *abfd;
+ struct bfd_link_info *info;
+{
+ int i, j;
+ struct bfd_link_hash_entry *blhe;
+ bfd *b;
+ struct sec *s;
+ def_file_export *e=0;
+
+ for (i = 0; i < pe_def_file->num_exports; i++)
+ {
+ char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
+ if (pe_details->underscored)
+ {
+ *name = '_';
+ strcpy (name + 1, pe_def_file->exports[i].internal_name);
+ }
+ else
+ strcpy (name, pe_def_file->exports[i].internal_name);
+
+ blhe = bfd_link_hash_lookup (info->hash,
+ name,
+ false, false, true);
+
+ if (blhe && (blhe->type == bfd_link_hash_defined))
+ {
+ exported_symbol_offsets[i] = blhe->u.def.value;
+ }
+ free (name);
+ }
+}
+
static void
fill_edata (abfd, info)
bfd *abfd;
@@ -615,6 +661,8 @@ fill_edata (abfd, info)
bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
+ fill_exported_offsets (abfd, info);
+
/* Ok, now for the filling in part */
hint = 0;
for (i = 0; i < export_table_size; i++)