From 45b1f63c8cdded5c3b874abc87b02ee079ac4e93 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Thu, 28 Sep 2000 20:53:40 +0000 Subject: [PATCH] * 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. --- ld/ChangeLog | 10 ++++++++++ ld/emultempl/pe.em | 21 +++++++++++++++++++++ ld/pe-dll.c | 15 ++++++++++----- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index c4b2a3a..0c72cac 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2000-09-28 Paul Sokolovsky + + * pe-dll.c (process_def_file): Uninitialized data wasn't + exported with --export-all-symbols switch. + +2000-09-28 DJ Delorie + + * pe-dll.c (fill_edata): rearrange the data so that ordinals and + noname work properly. + 2000-09-28 Alan Modra * ld.texinfo (HPPA ELF32): New section. diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 0ffeffc..b556fac 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 cbd0c49..99ca312 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++; } } } -- 2.7.4