diff options
Diffstat (limited to 'ld/emultempl/pe.em')
-rw-r--r-- | ld/emultempl/pe.em | 70 |
1 files changed, 16 insertions, 54 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 665c02c..c018296 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -1649,10 +1649,6 @@ gld${EMULATION_NAME}_after_open (void) } { - int is_ms_arch = 0; - bfd *cur_arch = 0; - lang_input_statement_type *is2; - lang_input_statement_type *is3; /* Careful - this is a shell script. Watch those dollar signs! */ /* Microsoft import libraries have every member named the same, @@ -1668,60 +1664,18 @@ gld${EMULATION_NAME}_after_open (void) if (is->the_bfd->my_archive) { char *pnt; - bfd *arch = is->the_bfd->my_archive; - if (cur_arch != arch) - { - cur_arch = arch; - is_ms_arch = 1; - - for (is3 = is; - is3 && is3->the_bfd->my_archive == arch; - is3 = (lang_input_statement_type *) is3->next) - { - /* A MS dynamic import library can also contain static - members, so look for the first element with a .dll - extension, and use that for the remainder of the - comparisons. */ - pnt = strrchr (bfd_get_filename (is3->the_bfd), '.'); - if (pnt != NULL && fileext_cmp (pnt + 1, "dll") == 0) - break; - } - - if (is3 == NULL) - is_ms_arch = 0; - else - { - /* OK, found one. Now look to see if the remaining - (dynamic import) members use the same name. */ - for (is2 = is; - is2 && is2->the_bfd->my_archive == arch; - is2 = (lang_input_statement_type *) is2->next) - { - /* Skip static members, ie anything with a .obj - extension. */ - pnt = strrchr (bfd_get_filename (is2->the_bfd), '.'); - if (pnt != NULL && fileext_cmp (pnt + 1, "obj") == 0) - continue; - - if (filename_cmp (bfd_get_filename (is3->the_bfd), - bfd_get_filename (is2->the_bfd))) - { - is_ms_arch = 0; - break; - } - } - } - } - - /* This fragment might have come from an .obj file in a Microsoft - import, and not an actual import record. If this is the case, - then leave the filename alone. */ + /* Microsoft import libraries may contain archive members for + one or more DLLs, together with static object files. + Inspect all members that are named *.dll - check whether + they contain .idata sections. Do the renaming of all + archive members that seem to be Microsoft style import + objects. */ pnt = strrchr (bfd_get_filename (is->the_bfd), '.'); - if (is_ms_arch && pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0)) + if (pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0)) { - int idata2 = 0, reloc_count=0; + int idata2 = 0, reloc_count = 0, idata = 0; asection *sec; char *new_name, seq; @@ -1729,9 +1683,17 @@ gld${EMULATION_NAME}_after_open (void) { if (strcmp (sec->name, ".idata\$2") == 0) idata2 = 1; + if (strncmp (sec->name, ".idata\$", 6) == 0) + idata = 1; reloc_count += sec->reloc_count; } + /* An archive member named .dll, but not having any .idata + sections - apparently not a Microsoft import object + after all: Skip renaming it. */ + if (!idata) + continue; + if (idata2) /* .idata2 is the TOC */ seq = 'a'; else if (reloc_count > 0) /* thunks */ |