aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2024-09-06 16:18:02 +0300
committerMartin Storsjö <martin@martin.st>2024-11-22 12:39:42 +0200
commit3c557e1ae9c320efcfd4a7a91b752413a7bfd280 (patch)
treef2dc4ad45a901f2064238def01dfcc1dc27d95d7
parent595e49a4b7c6769ef23a2573148db72872c61935 (diff)
downloadgdb-3c557e1ae9c320efcfd4a7a91b752413a7bfd280.zip
gdb-3c557e1ae9c320efcfd4a7a91b752413a7bfd280.tar.gz
gdb-3c557e1ae9c320efcfd4a7a91b752413a7bfd280.tar.bz2
ld/PE: Handle MS style import libraries for files named *.exe too
When handling MS style import libraries (also called short import libraries, or ILF), we need to detect the kind of library. So far, this has been done by looking at the member file names in the import library - in an MS style import library, all the member files for a specific library have the same member file name - the name of the runtime module to link against. Usually this is a DLL - thus we do a case insensitive comparison and check if the suffix is .dll. However, an .exe can also export symbols which can be linked against in the same way. In particular, if linking against WDK (Windows Driver Kit) import libraries, e.g. wdmsec.lib, the import libraries can provide imports for ntoskrnl.exe. Instead of specifically checking for *.dll (and *.exe, etc), invert the condition and skip archive members named *.o and *.obj. For any remaining archive members, that do contain .idata sections, apply the renaming. (The renaming is also mostly harmless if applied where it isn't needed; if archive members already have unique file names, their relative ordering should remain intact except for very contrieved cases.) Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--ld/emultempl/pe.em29
-rw-r--r--ld/emultempl/pep.em29
2 files changed, 44 insertions, 14 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 869ffd3..52f59b8 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1747,13 +1747,28 @@ gld${EMULATION_NAME}_after_open (void)
/* 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. */
+ The head and sentinels are regular COFF object files,
+ while the thunks are special ILF files that get synthesized
+ by bfd into COFF object files.
+
+ As Microsoft import libraries can be for a module with
+ almost any file name (*.dll, *.exe, etc), we can't easily
+ know which archive members to inspect.
+
+ Inspect all members, except ones named *.o or *.obj (which
+ is the case both for regular static libraries or for GNU
+ style import libraries). Archive members with file names other
+ than *.o or *.obj, that do contain .idata sections, are
+ considered to be Microsoft style import objects, and are
+ renamed accordingly.
+
+ If this heuristic is wrong and we apply this on archive members
+ that already have unique names, it shouldn't make any difference
+ as we only append a suffix on the names. */
pnt = strrchr (bfd_get_filename (is->the_bfd), '.');
- if (pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0))
+ if (pnt != NULL && (fileext_cmp (pnt + 1, "o") != 0 &&
+ fileext_cmp (pnt + 1, "obj") != 0))
{
int idata2 = 0, reloc_count = 0, idata = 0;
asection *sec;
@@ -1768,8 +1783,8 @@ gld${EMULATION_NAME}_after_open (void)
reloc_count += sec->reloc_count;
}
- /* An archive member named .dll, but not having any .idata
- sections - apparently not a Microsoft import object
+ /* An archive member not named .o or .obj, but not having any
+ .idata sections - apparently not a Microsoft import object
after all: Skip renaming it. */
if (!idata)
continue;
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index c225d05..a07403b 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -1730,13 +1730,28 @@ gld${EMULATION_NAME}_after_open (void)
/* 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. */
+ The head and sentinels are regular COFF object files,
+ while the thunks are special ILF files that get synthesized
+ by bfd into COFF object files.
+
+ As Microsoft import libraries can be for a module with
+ almost any file name (*.dll, *.exe, etc), we can't easily
+ know which archive members to inspect.
+
+ Inspect all members, except ones named *.o or *.obj (which
+ is the case both for regular static libraries or for GNU
+ style import libraries). Archive members with file names other
+ than *.o or *.obj, that do contain .idata sections, are
+ considered to be Microsoft style import objects, and are
+ renamed accordingly.
+
+ If this heuristic is wrong and we apply this on archive members
+ that already have unique names, it shouldn't make any difference
+ as we only append a suffix on the names. */
pnt = strrchr (bfd_get_filename (is->the_bfd), '.');
- if (pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0))
+ if (pnt != NULL && (fileext_cmp (pnt + 1, "o") != 0 &&
+ fileext_cmp (pnt + 1, "obj") != 0))
{
int idata2 = 0, reloc_count = 0, idata = 0;
asection *sec;
@@ -1751,8 +1766,8 @@ gld${EMULATION_NAME}_after_open (void)
reloc_count += sec->reloc_count;
}
- /* An archive member named .dll, but not having any .idata
- sections - apparently not a Microsoft import object
+ /* An archive member not named .o or .obj, but not having any
+ .idata sections - apparently not a Microsoft import object
after all: Skip renaming it. */
if (!idata)
continue;