diff options
author | Tamar Christina <tamar@zhox.com> | 2017-06-02 11:47:57 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-06-02 12:27:45 -0400 |
commit | 93489cd3b4c1b0d17506a12a9b964c0082ddb7a8 (patch) | |
tree | 3255cbf5caa2c71e094e9e8655c9f38d5da734c5 /rts/Linker.c | |
parent | 5164cce20bc6f09f55cf5c4d1797b72b7e85b176 (diff) | |
download | haskell-93489cd3b4c1b0d17506a12a9b964c0082ddb7a8.tar.gz |
Better import library support for Windows
The import library support added for 7.10.3 was only a partial one.
This support was predicated on using file extensions to determine
whether or not a library was an import library. It also couldn't handle
libraries with multiple dll pointers.
This is a rewrite of that patch and fully integrating it into the normal
archive parsing and loading routines. This solves a host of issues,
among others allowing us to finally use `-lgcc_s`.
This also fixes a problem with our previous implementation, where we
just loaded the DLL and moved on. Doing this had the potential of using
the wrong symbol at resolve time. Say a DLL already loaded (A.dll) has
symbol a exported (dependency of another dll perhaps).
We find an import library `B.lib` explicitly defining an export of `a`.
we load `B.dll` but this gets put after `A.dll`, at resolve time we
would use the value from `A` instead of `B` which is what we wanted.
Test Plan: ./valide and make test TEST=13606
Reviewers: austin, bgamari, erikd, simonmar
Reviewed By: bgamari
Subscribers: rwbarton, RyanGlScott, thomie, #ghc_windows_task_force
GHC Trac Issues: #13606, #12499, #12498
Differential Revision: https://phabricator.haskell.org/D3513
Diffstat (limited to 'rts/Linker.c')
-rw-r--r-- | rts/Linker.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/rts/Linker.c b/rts/Linker.c index 65caf89f6e..6e710a1431 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -230,6 +230,9 @@ static void ghciRemoveSymbolTable(HashTable *table, const SymbolName* key, RtsSymbolInfo *pinfo = lookupStrHashTable(table, key); if (!pinfo || owner != pinfo->owner) return; removeStrHashTable(table, key, NULL); + if (isSymbolImport (owner, key)) + stgFree(pinfo->value); + stgFree(pinfo); } @@ -731,7 +734,7 @@ addDLL( pathchar *dll_name ) return errmsg; # elif defined(OBJFORMAT_PEi386) - return addDLL_PEi386(dll_name); + return addDLL_PEi386(dll_name, NULL); # else barf("addDLL: not implemented on this platform"); |