summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@delorie.com>2000-09-28 20:53:40 +0000
committerDJ Delorie <dj@delorie.com>2000-09-28 20:53:40 +0000
commit3a847b910c4faaf8bb3ea380b3b3e9691ebf4ec2 (patch)
tree36034673d7a892d1ea6e73e5e4918c176004c10f
parentd46e1575d6eab8e8667e847632f62b69bb768daa (diff)
downloadbinutils-redhat-3a847b910c4faaf8bb3ea380b3b3e9691ebf4ec2.tar.gz
* pe-dll.c (process_def_file): Uninitialized data wasn't
exported with --export-all-symbols switch. * pe-dll.c (fill_edata): rearrange the data so that ordinals and noname work properly.
-rw-r--r--ld/ChangeLog10
-rw-r--r--ld/emultempl/pe.em21
-rw-r--r--ld/pe-dll.c15
3 files changed, 41 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c4b2a3ae8d..0c72cac90b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2000-09-28 Paul Sokolovsky <Paul.Sokolovsky@technologist.com>
+
+ * pe-dll.c (process_def_file): Uninitialized data wasn't
+ exported with --export-all-symbols switch.
+
+2000-09-28 DJ Delorie <dj@redhat.com>
+
+ * pe-dll.c (fill_edata): rearrange the data so that ordinals and
+ noname work properly.
+
2000-09-28 Alan Modra <alan@linuxcare.com.au>
* ld.texinfo (HPPA ELF32): New section.
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 0ffeffc061..b556fac90d 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -876,6 +876,27 @@ gld_${EMULATION_NAME}_after_open ()
}
}
}
+
+ {
+ LANG_FOR_EACH_INPUT_STATEMENT (is)
+ {
+ asection *sec;
+ char *new_name, seq;
+
+
+ if (is->the_bfd->my_archive)
+ for (sec = is->the_bfd->sections; sec; sec = sec->next)
+ if (strcmp (sec->name, ".idata\$7") == 0
+ && sec->reloc_count == 0)
+ {
+ char *name = xmalloc (sec->_raw_size + 1);
+ bfd_get_section_contents (is->the_bfd, sec, name, 0, sec->_raw_size);
+ name[sec->_raw_size] = 0;
+ printf ("dj: implib \"%s\" for dll \"%s\" %d\n",
+ is->the_bfd->my_archive->filename, name, sec->_raw_size);
+ }
+ }
+ }
}
static void
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index cbd0c495a4..99ca312584 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -302,7 +302,10 @@ process_def_file (abfd, info)
for (j = 0; j < nsyms; j++)
{
- if (symbols[j]->flags & BSF_GLOBAL)
+ /* We should export symbols which are either global or not
+ anything at all (.bss data is the latter) */
+ if ((symbols[j]->flags & BSF_GLOBAL)
+ || (symbols[j]->flags == BSF_NO_FLAGS))
{
const char *sn = symbols[j]->name;
if (*sn == '_')
@@ -703,19 +706,21 @@ fill_edata (abfd, info)
unsigned long srva = (exported_symbol_offsets[s]
+ ssec->output_section->vma
+ ssec->output_offset);
+ int ord = pe_def_file->exports[s].ordinal;
- bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
+ bfd_put_32 (abfd, srva - image_base,
+ (void *) (eaddresses + ord - min_ordinal));
if (!pe_def_file->exports[s].flag_noname)
{
char *ename = pe_def_file->exports[s].name;
bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
+ enameptrs++;
strcpy (enamestr, ename);
enamestr += strlen (enamestr) + 1;
- bfd_put_16 (abfd, i, (void *) eordinals);
- enameptrs++;
+ bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
+ eordinals++;
pe_def_file->exports[s].hint = hint++;
}
- eordinals++;
}
}
}