diff options
author | DJ Delorie <dj@delorie.com> | 2000-09-28 20:53:40 +0000 |
---|---|---|
committer | DJ Delorie <dj@delorie.com> | 2000-09-28 20:53:40 +0000 |
commit | 3a847b910c4faaf8bb3ea380b3b3e9691ebf4ec2 (patch) | |
tree | 36034673d7a892d1ea6e73e5e4918c176004c10f | |
parent | d46e1575d6eab8e8667e847632f62b69bb768daa (diff) | |
download | binutils-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/ChangeLog | 10 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 21 | ||||
-rw-r--r-- | ld/pe-dll.c | 15 |
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++; } } } |