[Git][ghc/ghc][wip/T22166] 2 commits: Windows: Remove mingwex dependency
Tamar Christina (@Phyx)
gitlab at gitlab.haskell.org
Sun Dec 4 16:29:37 UTC 2022
Tamar Christina pushed to branch wip/T22166 at Glasgow Haskell Compiler / GHC
Commits:
56dadd26 by Ryan Scott at 2022-12-04T16:28:58+00:00
Windows: Remove mingwex dependency
TODO: Write a commit message explaining why this is necessary. The proximal
reason is to make GHC's Clang toolchain work when `LIBRARY_PATH=/mingw64/lib`
is set, although I don't quite understand how everything interacts with each
other.
TODO: This isn't quite done yet, since running a test case involving Template
Haskell still results in some failures with `LIBRARY_PATH=/mingw64/lib` set:
```
$ LIBRARY_PATH=/mingw64/lib ghc/_build/stage1/bin/ghc Bug.hs -fforce-recomp && ./Bug.exe
[1 of 2] Compiling Main ( Bug.hs, Bug.o )
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `__imp___p__environ'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `__hscore_get_errno'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_ForeignziCziError_errnoToIOError_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziWindows_failIf2_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziIOziEncodingziCodePageziAPI_mkCodePageEncoding_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziIOziEncodingziCodePage_currentCodePage_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziIOziEncoding_getForeignEncoding_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_ForeignziCziString_withCStringLen1_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziIOziHandleziInternals_zdwflushCharReadBuffer_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziIOziHandleziText_hGetBuf1_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziFingerprint_fingerprintString_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_DataziTypeableziInternal_mkTrCon_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziException_errorCallWithCallStackException_closure'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\base-4.17.0.0\libHSbase-4.17.0.0.a: unknown symbol `base_GHCziErr_error_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\template-haskell-2.19.0.0\libHStemplate-haskell-2.19.0.0.a: unknown symbol `base_DataziMaybe_fromJust1_info'
ghc.exe: | C:\Users\winferno\Software\ghc\_build\stage1\lib\x86_64-windows-ghc-9.5.20220908\template-haskell-2.19.0.0\libHStemplate-haskell-2.19.0.0.a: unknown symbol `templatezmhaskell_LanguageziHaskellziTHziSyntax_IntPrimL_con_info'
ghc.exe: ^^ Could not load 'templatezmhaskell_LanguageziHaskellziTHziLibziInternal_stringL_closure', dependency unresolved. See top entry above.
<no location info>: error:
GHC.ByteCode.Linker.lookupCE
During interactive linking, GHCi couldn't find the following symbol:
templatezmhaskell_LanguageziHaskellziTHziLibziInternal_stringL_closure
This may be due to you not asking GHCi to load extra object files,
archives or DLLs needed by your current session. Restart GHCi, specifying
the missing library using the -L/path/to/object/dir and -lmissinglibname
flags, or simply by naming the relevant files on the GHCi command line.
Alternatively, this link failure might indicate a bug in GHCi.
If you suspect the latter, please report this as a GHC bug:
https://www.haskell.org/ghc/reportabug
```
I haven't been able to figure out why yet, but I'm pushing the current state of
the work so that Phyx can look at it.
TODO: Cite T22166
[ci skip]
- - - - -
3e8ae3f8 by Tamar Christina at 2022-12-04T16:29:22+00:00
linker: Fix BFD import libraries
- - - - -
28 changed files:
- configure.ac
- hadrian/cfg/system.config.in
- hadrian/src/Oracles/Flag.hs
- hadrian/src/Settings/Packages.hs
- libraries/Cabal
- libraries/Win32
- libraries/array
- libraries/base/System/Posix/Internals.hs
- libraries/base/base.cabal
- libraries/base/configure.ac
- libraries/base/include/HsBase.h
- libraries/deepseq
- libraries/filepath
- libraries/ghc-bignum/gmp/gmp-tarballs
- libraries/ghc-prim/ghc-prim.cabal
- libraries/haskeline
- libraries/process
- libraries/text
- libraries/unix
- rts/Linker.c
- rts/LinkerInternals.h
- rts/RtsSymbols.c
- rts/linker/PEi386.c
- rts/package.conf.in
- rts/rts.cabal.in
- testsuite/tests/ghci/linking/dyn/Makefile
- testsuite/tests/ghci/linking/dyn/all.T
- utils/haddock
Changes:
=====================================
configure.ac
=====================================
@@ -927,17 +927,6 @@ AC_CHECK_DECLS([program_invocation_short_name], , ,
[#define _GNU_SOURCE 1
#include <errno.h>])
-dnl ** check for mingwex library
-AC_CHECK_LIB(
- [mingwex],
- [closedir],
- [AC_SUBST([HaveLibMingwEx],[YES])] [AC_SUBST([CabalMingwex],[True])],
- [AC_SUBST([HaveLibMingwEx],[NO])] [AC_SUBST([CabalMingwex],[False])])
-
-if test $HaveLibMingwEx = YES ; then
- AC_DEFINE([HAVE_MINGWEX], [1], [Define to 1 if you have the mingwex library.])
-fi
-
dnl ** check for math library
dnl Keep that check as early as possible.
dnl as we need to know whether we need libm
=====================================
hadrian/cfg/system.config.in
=====================================
@@ -204,7 +204,6 @@ libnuma-lib-dir = @LibNumaLibDir@
use-lib-dw = @UseLibdw@
use-lib-numa = @UseLibNuma@
-use-lib-mingw-ex = @HaveLibMingwEx@
use-lib-m = @UseLibm@
use-lib-rt = @UseLibrt@
use-lib-dl = @UseLibdl@
=====================================
hadrian/src/Oracles/Flag.hs
=====================================
@@ -33,7 +33,6 @@ data Flag = ArSupportsAtFile
| UseLibffiForAdjustors
| UseLibdw
| UseLibnuma
- | UseLibmingwex
| UseLibm
| UseLibrt
| UseLibdl
@@ -63,7 +62,6 @@ flag f = do
UseLibffiForAdjustors -> "use-libffi-for-adjustors"
UseLibdw -> "use-lib-dw"
UseLibnuma -> "use-lib-numa"
- UseLibmingwex -> "use-lib-mingw-ex"
UseLibm -> "use-lib-m"
UseLibrt -> "use-lib-rt"
UseLibdl -> "use-lib-dl"
=====================================
hadrian/src/Settings/Packages.hs
=====================================
@@ -404,7 +404,6 @@ rtsPackageArgs = package rts ? do
[ "-DTOP=" ++ show top ]
, builder HsCpp ? flag UseLibdw ? arg "-DUSE_LIBDW"
- , builder HsCpp ? flag UseLibmingwex ? arg "-DHAVE_LIBMINGWEX" ]
-- Compile various performance-critical pieces *without* -fPIC -dynamic
-- even when building a shared library. If we don't do this, then the
=====================================
libraries/Cabal
=====================================
@@ -1 +1 @@
-Subproject commit 410f871df899e5af0847089354e0031fe051551d
+Subproject commit dac10555299fa0d750838529a67598821264e5e3
=====================================
libraries/Win32
=====================================
@@ -1 +1 @@
-Subproject commit 931497f7052f63cb5cfd4494a94e572c5c570642
+Subproject commit e6c0c0f44f6dfc2f8255fc4a5017f4ab67cd0242
=====================================
libraries/array
=====================================
@@ -1 +1 @@
-Subproject commit acd92ba77c205a039d9c6eaabb3e35d09e330160
+Subproject commit 77990b2132ba688f6282822891da2b9455e33c2f
=====================================
libraries/base/System/Posix/Internals.hs
=====================================
@@ -452,7 +452,6 @@ foreign import ccall unsafe "HsBase.h __hscore_fstat"
foreign import ccall unsafe "HsBase.h __hscore_lstat"
lstat :: CFilePath -> Ptr CStat -> IO CInt
-
#endif
#if defined(js_HOST_ARCH)
@@ -592,83 +591,74 @@ foreign import javascript unsafe "(($1,$2,$3_1,$3_2) => { return h$base_c_fcntl_
#else
-{- Note: Win32 POSIX functions
-Functions that are not part of the POSIX standards were
-at some point deprecated by Microsoft. This deprecation
-was performed by renaming the functions according to the
-C++ ABI Section 17.6.4.3.2b. This was done to free up the
-namespace of normal Windows programs since Windows isn't
-POSIX compliant anyway.
+#if defined(mingw32_HOST_OS)
+-- See Note: Windows types
+foreign import capi unsafe "HsBase.h _read"
+ c_read :: CInt -> Ptr Word8 -> CUInt -> IO CInt
-These were working before since the RTS was re-exporting
-these symbols under the undeprecated names. This is no longer
-being done. See #11223
+-- See Note: Windows types
+foreign import capi safe "HsBase.h _read"
+ c_safe_read :: CInt -> Ptr Word8 -> CUInt -> IO CInt
-See https://msdn.microsoft.com/en-us/library/ms235384.aspx
-for more.
+foreign import ccall unsafe "HsBase.h _umask"
+ c_umask :: CMode -> IO CMode
-However since we can't hope to get people to support Windows
-packages we should support the deprecated names. See #12497
--}
-foreign import capi unsafe "unistd.h lseek"
- c_lseek :: CInt -> COff -> CInt -> IO COff
+-- See Note: Windows types
+foreign import capi unsafe "HsBase.h _write"
+ c_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
-foreign import ccall unsafe "HsBase.h access"
+-- See Note: Windows types
+foreign import capi safe "HsBase.h _write"
+ c_safe_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
+
+foreign import ccall unsafe "HsBase.h _pipe"
+ c_pipe :: Ptr CInt -> IO CInt
+
+foreign import capi unsafe "HsBase.h _lseeki64"
+ c_lseek :: CInt -> Int64 -> CInt -> IO Int64
+
+foreign import capi unsafe "HsBase.h _access"
c_access :: CString -> CInt -> IO CInt
#if !defined(HAVE_CHMOD)
c_chmod :: CString -> CMode -> IO CInt
-c_chmod _ _ = ioError (ioeSetLocation unsupportedOperation "chmod")
+c_chmod _ _ = ioError (ioeSetLocation unsupportedOperation "_chmod")
#else
-foreign import ccall unsafe "HsBase.h chmod"
+foreign import ccall unsafe "HsBase.h _chmod"
c_chmod :: CString -> CMode -> IO CInt
#endif
-foreign import ccall unsafe "HsBase.h close"
+foreign import capi unsafe "HsBase.h _close"
c_close :: CInt -> IO CInt
-foreign import ccall unsafe "HsBase.h creat"
+foreign import capi unsafe "HsBase.h _creat"
c_creat :: CString -> CMode -> IO CInt
#if !defined(HAVE_DUP)
c_dup :: CInt -> IO CInt
-c_dup _ = ioError (ioeSetLocation unsupportedOperation "dup")
+c_dup _ = ioError (ioeSetLocation unsupportedOperation "_dup")
c_dup2 :: CInt -> CInt -> IO CInt
-c_dup2 _ _ = ioError (ioeSetLocation unsupportedOperation "dup2")
+c_dup2 _ _ = ioError (ioeSetLocation unsupportedOperation "_dup2")
#else
-foreign import ccall unsafe "HsBase.h dup"
+foreign import ccall unsafe "HsBase.h _dup"
c_dup :: CInt -> IO CInt
-foreign import ccall unsafe "HsBase.h dup2"
+foreign import ccall unsafe "HsBase.h _dup2"
c_dup2 :: CInt -> CInt -> IO CInt
#endif
-foreign import ccall unsafe "HsBase.h isatty"
+foreign import capi unsafe "HsBase.h _isatty"
c_isatty :: CInt -> IO CInt
-#if defined(mingw32_HOST_OS)
--- See Note: Windows types
-foreign import capi unsafe "HsBase.h _read"
- c_read :: CInt -> Ptr Word8 -> CUInt -> IO CInt
-
--- See Note: Windows types
-foreign import capi safe "HsBase.h _read"
- c_safe_read :: CInt -> Ptr Word8 -> CUInt -> IO CInt
-
-foreign import ccall unsafe "HsBase.h _umask"
- c_umask :: CMode -> IO CMode
-
--- See Note: Windows types
-foreign import capi unsafe "HsBase.h _write"
- c_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
+foreign import capi unsafe "HsBase.h _unlink"
+ c_unlink :: CString -> IO CInt
--- See Note: Windows types
-foreign import capi safe "HsBase.h _write"
- c_safe_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
+foreign import capi unsafe "HsBase.h _utime"
+ c_utime :: CString -> Ptr CUtimbuf -> IO CInt
-foreign import ccall unsafe "HsBase.h _pipe"
- c_pipe :: Ptr CInt -> IO CInt
+foreign import capi unsafe "HsBase.h _getpid"
+ c_getpid :: IO CPid
#else
-- We use CAPI as on some OSs (eg. Linux) this is wrapped by a macro
-- which redirects to the 64-bit-off_t versions when large file
@@ -700,8 +690,44 @@ c_pipe _ = ioError (ioeSetLocation unsupportedOperation "pipe")
foreign import ccall unsafe "HsBase.h pipe"
c_pipe :: Ptr CInt -> IO CInt
#endif
+
+foreign import capi unsafe "unistd.h lseek"
+ c_lseek :: CInt -> COff -> CInt -> IO COff
+
+foreign import ccall unsafe "HsBase.h access"
+ c_access :: CString -> CInt -> IO CInt
+
+#if !defined(HAVE_CHMOD)
+c_chmod :: CString -> CMode -> IO CInt
+c_chmod _ _ = ioError (ioeSetLocation unsupportedOperation "chmod")
+#else
+foreign import ccall unsafe "HsBase.h chmod"
+ c_chmod :: CString -> CMode -> IO CInt
#endif
+foreign import ccall unsafe "HsBase.h close"
+ c_close :: CInt -> IO CInt
+
+foreign import ccall unsafe "HsBase.h creat"
+ c_creat :: CString -> CMode -> IO CInt
+
+#if !defined(HAVE_DUP)
+c_dup :: CInt -> IO CInt
+c_dup _ = ioError (ioeSetLocation unsupportedOperation "dup")
+
+c_dup2 :: CInt -> CInt -> IO CInt
+c_dup2 _ _ = ioError (ioeSetLocation unsupportedOperation "dup2")
+#else
+foreign import ccall unsafe "HsBase.h dup"
+ c_dup :: CInt -> IO CInt
+
+foreign import ccall unsafe "HsBase.h dup2"
+ c_dup2 :: CInt -> CInt -> IO CInt
+#endif
+
+foreign import ccall unsafe "HsBase.h isatty"
+ c_isatty :: CInt -> IO CInt
+
foreign import ccall unsafe "HsBase.h unlink"
c_unlink :: CString -> IO CInt
@@ -715,6 +741,7 @@ c_getpid = pure 1
foreign import ccall unsafe "HsBase.h getpid"
c_getpid :: IO CPid
#endif
+#endif
#if !defined(js_HOST_ARCH)
foreign import ccall unsafe "HsBase.h __hscore_stat"
=====================================
libraries/base/base.cabal
=====================================
@@ -396,7 +396,6 @@ Library
if os(windows)
-- Windows requires some extra libraries for linking because the RTS
-- is no longer re-exporting them.
- -- mingwex: provides C99 compatibility. libm is a stub on MingW.
-- mingw32: Unfortunately required because of a resource leak between
-- mingwex and mingw32. the __math_err symbol is defined in
-- mingw32 which is required by mingwex.
@@ -409,7 +408,7 @@ Library
-- advapi32: provides advanced kernel functions
extra-libraries:
wsock32, user32, shell32, mingw32, kernel32, advapi32,
- mingwex, ws2_32, shlwapi, ole32, rpcrt4, ntdll
+ ws2_32, shlwapi, ole32, rpcrt4, ntdll
-- Minimum supported Windows version.
-- These numbers can be found at:
-- https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx
=====================================
libraries/base/configure.ac
=====================================
@@ -39,7 +39,7 @@ AC_CHECK_LIB([rt], [clock_gettime])
AC_CHECK_FUNCS([clock_gettime])
AC_CHECK_DECLS([CLOCK_PROCESS_CPUTIME_ID], [], [], [[#include <time.h>]])
AC_CHECK_FUNCS([getclock getrusage times])
-AC_CHECK_FUNCS([_chsize ftruncate])
+AC_CHECK_FUNCS([_chsize_s ftruncate])
# event-related fun
# The line below already defines HAVE_KQUEUE and HAVE_POLL, so technically some of the
=====================================
libraries/base/include/HsBase.h
=====================================
@@ -280,15 +280,12 @@ __hscore_o_nonblock( void )
INLINE int
__hscore_ftruncate( int fd, off_t where )
{
-#if defined(HAVE_FTRUNCATE)
+#if defined(HAVE__CHSIZE_S)
+ return _chsize_s(fd,where);
+#elif defined(HAVE_FTRUNCATE)
return ftruncate(fd,where);
-#elif defined(HAVE__CHSIZE)
- return _chsize(fd,where);
#else
-// ToDo: we should use _chsize_s() on Windows which allows a 64-bit
-// offset, but it doesn't seem to be available from mingw at this time
-// --SDM (01/2008)
-#error at least ftruncate or _chsize functions are required to build
+#error at least _chsize_s or ftruncate functions are required to build
#endif
}
=====================================
libraries/deepseq
=====================================
@@ -1 +1 @@
-Subproject commit 28f4d5b00448239581ead0de9140ff4a6847c806
+Subproject commit 38ab699cd5e08a85fdc9ac27f1612ce130e98a5a
=====================================
libraries/filepath
=====================================
@@ -1 +1 @@
-Subproject commit 872e19fce06ddd40bd0771dbd3cad2c3c6ed5e7d
+Subproject commit 4d7092ad3a8357b18a8fcbeb6fcf38045460eb98
=====================================
libraries/ghc-bignum/gmp/gmp-tarballs
=====================================
@@ -1 +1 @@
-Subproject commit 6bbea995472b6f4db172c3cd50aa3f515ddd221c
+Subproject commit 31f9909680ba8fe00d27fd8a6f5d198a0a96c1ac
=====================================
libraries/ghc-prim/ghc-prim.cabal
=====================================
@@ -66,15 +66,14 @@ Library
if os(windows)
-- Windows requires some extra libraries for linking because the RTS
-- is no longer re-exporting them (see #11223)
- -- msvcrt: standard C library. The RTS will automatically include this,
- -- but is added for completeness.
- -- mingwex: provides C99 compatibility. libm is a stub on MingW.
+ -- ucrt: standard C library. The RTS will automatically include this,
+ -- but is added for completeness.
-- mingw32: Unfortunately required because of a resource leak between
-- mingwex and mingw32. the __math_err symbol is defined in
-- mingw32 which is required by mingwex.
-- user32: provides access to apis to modify user components (UI etc)
-- on Windows. Required because of mingw32.
- extra-libraries: user32, mingw32, mingwex, ucrt
+ extra-libraries: user32, mingw32, ucrt
if os(linux)
-- we need libm, but for musl and other's we might need libc, as libm
=====================================
libraries/haskeline
=====================================
@@ -1 +1 @@
-Subproject commit d4f343509e905a717ea463ad84462c126d8990d8
+Subproject commit aae0bfeec7ae767e3c30844ca2f99b6825185467
=====================================
libraries/process
=====================================
@@ -1 +1 @@
-Subproject commit cb89d5079d29c38683bcb6feec7dc53ad3836ed0
+Subproject commit 2ac3ff366631a36d84101000045abbefa4415b15
=====================================
libraries/text
=====================================
@@ -1 +1 @@
-Subproject commit 5558730e76923f2d5d7fbc8783ab1ecc25bfe15d
+Subproject commit fdb06ff327519f3c0fc6cc9997b7cb7fe8ab8178
=====================================
libraries/unix
=====================================
@@ -1 +1 @@
-Subproject commit 3be0223cee7395410915a127eba3acae5ff0b2f2
+Subproject commit 2a6079a2b76adf29d3e3ff213dffe66cabcb76c3
=====================================
rts/Linker.c
=====================================
@@ -135,7 +135,8 @@ extern void iconv();
This is to enable lazy loading of symbols. Eager loading is problematic
as it means that all symbols must be available, even those which we will
never use. This is especially painful on Windows, where the number of
- libraries required to link things like mingwex grows to be quite high.
+ libraries required to link things like mingwex (TODO: We no longer depend
+ on mingwex, so think of a different example here) grows to be quite high.
We proceed through these stages as follows,
@@ -193,7 +194,8 @@ extern void iconv();
1) Dependency chains, if A.o required a .o in libB but A.o isn't required to link
then we don't need to load libB. This means the dependency chain for libraries
- such as mingw32 and mingwex can be broken down.
+ such as mingw32 and mingwex (TODO: We no longer depend on mingwex, so think of
+ a different example here) can be broken down.
2) The number of duplicate symbols, since now only symbols that are
true duplicates will display the error.
@@ -226,7 +228,7 @@ static void ghciRemoveSymbolTable(StrHashTable *table, const SymbolName* key,
static const char *
symbolTypeString (SymType type)
{
- switch (type) {
+ switch (type & ~SYM_TYPE_DUP_DISCARD) {
case SYM_TYPE_CODE: return "code";
case SYM_TYPE_DATA: return "data";
case SYM_TYPE_INDIRECT_DATA: return "indirect-data";
@@ -275,14 +277,19 @@ int ghciInsertSymbolTable(
insertStrHashTable(table, key, pinfo);
return 1;
}
- else if (pinfo->type != type)
+ else if (pinfo->type ^ type)
{
- debugBelch("Symbol type mismatch.\n");
- debugBelch("Symbol %s was defined by %" PATH_FMT " to be a %s symbol.\n",
- key, obj_name, symbolTypeString(type));
- debugBelch(" yet was defined by %" PATH_FMT " to be a %s symbol.\n",
- pinfo->owner ? pinfo->owner->fileName : WSTR("<builtin>"),
- symbolTypeString(pinfo->type));
+ /* We were asked to discard the symbol on duplicates, do so quietly. */
+ if (!(type & SYM_TYPE_DUP_DISCARD))
+ {
+ DebugBreak ();
+ debugBelch("Symbol type mismatch.\n");
+ debugBelch("Symbol %s was defined by %" PATH_FMT " to be a %s symbol.\n",
+ key, obj_name, symbolTypeString(type));
+ debugBelch(" yet was defined by %" PATH_FMT " to be a %s symbol.\n",
+ pinfo->owner ? pinfo->owner->fileName : WSTR("<builtin>"),
+ symbolTypeString(pinfo->type));
+ }
return 1;
}
else if (pinfo->strength == STRENGTH_STRONG)
=====================================
rts/LinkerInternals.h
=====================================
@@ -56,9 +56,12 @@ typedef struct _Section Section;
/* What kind of thing a symbol identifies. We need to know this to determine how
* to process overflowing relocations. See Note [Processing overflowed relocations]. */
typedef enum _SymType {
- SYM_TYPE_CODE, /* the symbol is a function and can be relocated via a jump island */
- SYM_TYPE_DATA, /* the symbol is data */
- SYM_TYPE_INDIRECT_DATA, /* see Note [_iob_func symbol] */
+ SYM_TYPE_CODE = 1 << 0, /* the symbol is a function and can be relocated via a jump island */
+ SYM_TYPE_DATA = 1 << 1, /* the symbol is data */
+ SYM_TYPE_INDIRECT_DATA = 1 << 2, /* see Note [_iob_func symbol] */
+ SYM_TYPE_DUP_DISCARD = 1 << 3, /* the symbol is a symbol in a BFD import library
+ however if a duplicate is found with a mismatching
+ SymType then discard this one. */
} SymType;
=====================================
rts/RtsSymbols.c
=====================================
@@ -113,26 +113,6 @@ extern char **environ;
* by the RtsSymbols entry. To avoid this we introduce a horrible special case
* in `ghciInsertSymbolTable`, ensure that `atexit` is never overridden.
*/
-/*
- * Note [Symbols for MinGW's printf]
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * The printf offered by Microsoft's libc implementation, msvcrt, is quite
- * incomplete, lacking support for even %ull. Consequently mingw-w64 offers its
- * own implementation which we enable. However, to be thread-safe the
- * implementation uses _lock_file. This would be fine except msvcrt.dll doesn't
- * export _lock_file, only numbered versions do (e.g. msvcrt90.dll).
- *
- * To work around this mingw-w64 packages a static archive of msvcrt which
- * includes their own implementation of _lock_file. However, this means that
- * the archive contains things which the dynamic library does not; consequently
- * we need to ensure that the runtime linker provides this symbol.
- *
- * It's all just so terrible.
- *
- * See also:
- * https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/
- * https://sourceforge.net/p/mingw-w64/discussion/723797/thread/55520785/
- */
/* Note [_iob_func symbol]
* ~~~~~~~~~~~~~~~~~~~~~~~
* Microsoft in VS2013 to VS2015 transition made a backwards incompatible change
@@ -170,12 +150,6 @@ extern char **environ;
SymI_NeedsProto(__mingw_module_is_dll) \
RTS_WIN32_ONLY(SymI_NeedsProto(___chkstk_ms)) \
RTS_WIN64_ONLY(SymI_NeedsProto(___chkstk_ms)) \
- RTS_WIN64_ONLY(SymI_HasProto(__stdio_common_vswprintf_s)) \
- RTS_WIN64_ONLY(SymI_HasProto(__stdio_common_vswprintf)) \
- RTS_WIN64_ONLY(SymI_HasProto(_errno)) \
- /* see Note [Symbols for MinGW's printf] */ \
- SymI_HasProto(_lock_file) \
- SymI_HasProto(_unlock_file) \
SymI_HasProto(__mingw_vsnwprintf) \
/* ^^ Need to figure out why this is needed. */ \
/* See Note [_iob_func symbol] */ \
@@ -187,120 +161,8 @@ extern char **environ;
/* ^^ Need to figure out why this is needed. */ \
SymI_HasProto(__mingw_vfprintf) \
/* ^^ Need to figure out why this is needed. */
-
-#define RTS_MINGW_COMPAT_SYMBOLS \
- SymI_HasProto_deprecated(access) \
- SymI_HasProto_deprecated(cabs) \
- SymI_HasProto_deprecated(cgets) \
- SymI_HasProto_deprecated(chdir) \
- SymI_HasProto_deprecated(chmod) \
- SymI_HasProto_deprecated(chsize) \
- SymI_HasProto_deprecated(close) \
- SymI_HasProto_deprecated(cprintf) \
- SymI_HasProto_deprecated(cputs) \
- SymI_HasProto_deprecated(creat) \
- SymI_HasProto_deprecated(cscanf) \
- SymI_HasProto_deprecated(cwait) \
- SymI_HasProto_deprecated(dup) \
- SymI_HasProto_deprecated(dup2) \
- SymI_HasProto_deprecated(ecvt) \
- SymI_HasProto_deprecated(eof) \
- SymI_HasProto_deprecated(execl) \
- SymI_HasProto_deprecated(execle) \
- SymI_HasProto_deprecated(execlp) \
- SymI_HasProto_deprecated(execlpe) \
- SymI_HasProto_deprecated(execv) \
- SymI_HasProto_deprecated(execve) \
- SymI_HasProto_deprecated(execvp) \
- SymI_HasProto_deprecated(execvpe) \
- SymI_HasProto_deprecated(fcloseall) \
- SymI_HasProto_deprecated(fcvt) \
- SymI_HasProto_deprecated(fdopen) \
- SymI_HasProto_deprecated(fgetchar) \
- SymI_HasProto_deprecated(filelength) \
- SymI_HasProto_deprecated(fileno) \
- SymI_HasProto_deprecated(flushall) \
- SymI_HasProto_deprecated(fputchar) \
- SymI_HasProto_deprecated(gcvt) \
- SymI_HasProto_deprecated(getch) \
- SymI_HasProto_deprecated(getche) \
- SymI_HasProto_deprecated(getcwd) \
- SymI_HasProto_deprecated(getpid) \
- SymI_HasProto_deprecated(getw) \
- SymI_HasProto_deprecated(hypot) \
- SymI_HasProto_deprecated(inp) \
- SymI_HasProto_deprecated(inpw) \
- SymI_HasProto_deprecated(isascii) \
- SymI_HasProto_deprecated(isatty) \
- SymI_HasProto_deprecated(iscsym) \
- SymI_HasProto_deprecated(iscsymf) \
- SymI_HasProto_deprecated(itoa) \
- SymI_HasProto_deprecated(j0) \
- SymI_HasProto_deprecated(j1) \
- SymI_HasProto_deprecated(jn) \
- SymI_HasProto_deprecated(kbhit) \
- SymI_HasProto_deprecated(lfind) \
- SymI_HasProto_deprecated(locking) \
- SymI_HasProto_deprecated(lsearch) \
- SymI_HasProto_deprecated(lseek) \
- SymI_HasProto_deprecated(ltoa) \
- SymI_HasProto_deprecated(memccpy) \
- SymI_HasProto_deprecated(memicmp) \
- SymI_HasProto_deprecated(mkdir) \
- SymI_HasProto_deprecated(mktemp) \
- SymI_HasProto_deprecated(open) \
- SymI_HasProto_deprecated(outp) \
- SymI_HasProto_deprecated(outpw) \
- SymI_HasProto_deprecated(putch) \
- SymI_HasProto_deprecated(putenv) \
- SymI_HasProto_deprecated(putw) \
- SymI_HasProto_deprecated(read) \
- SymI_HasProto_deprecated(rmdir) \
- SymI_HasProto_deprecated(rmtmp) \
- SymI_HasProto_deprecated(setmode) \
- SymI_HasProto_deprecated(sopen) \
- SymI_HasProto_deprecated(spawnl) \
- SymI_HasProto_deprecated(spawnle) \
- SymI_HasProto_deprecated(spawnlp) \
- SymI_HasProto_deprecated(spawnlpe) \
- SymI_HasProto_deprecated(spawnv) \
- SymI_HasProto_deprecated(spawnve) \
- SymI_HasProto_deprecated(spawnvp) \
- SymI_HasProto_deprecated(spawnvpe) \
- SymI_HasProto_deprecated(strcmpi) \
- SymI_HasProto_deprecated(strdup) \
- SymI_HasProto_deprecated(stricmp) \
- SymI_HasProto_deprecated(strlwr) \
- SymI_HasProto_deprecated(strnicmp) \
- SymI_HasProto_deprecated(strnset) \
- SymI_HasProto_deprecated(strrev) \
- SymI_HasProto_deprecated(strset) \
- SymI_HasProto_deprecated(strupr) \
- SymI_HasProto_deprecated(swab) \
- SymI_HasProto_deprecated(tell) \
- SymI_HasProto_deprecated(tempnam) \
- SymI_HasProto_deprecated(toascii) \
- SymI_HasProto_deprecated(tzset) \
- SymI_HasProto_deprecated(ultoa) \
- SymI_HasProto_deprecated(umask) \
- SymI_HasProto_deprecated(ungetch) \
- SymI_HasProto_deprecated(unlink) \
- SymI_HasProto_deprecated(wcsdup) \
- SymI_HasProto_deprecated(wcsicmp) \
- SymI_HasProto_deprecated(wcsicoll) \
- SymI_HasProto_deprecated(wcslwr) \
- SymI_HasProto_deprecated(wcsnicmp) \
- SymI_HasProto_deprecated(wcsnset) \
- SymI_HasProto_deprecated(wcsrev) \
- SymI_HasProto_deprecated(wcsset) \
- SymI_HasProto_deprecated(wcsupr) \
- SymI_HasProto_deprecated(write) \
- SymI_HasProto_deprecated(y0) \
- SymI_HasProto_deprecated(y1) \
- SymI_HasProto_deprecated(yn)
#else
#define RTS_MINGW_ONLY_SYMBOLS /**/
-#define RTS_MINGW_COMPAT_SYMBOLS /**/
#endif
@@ -1181,7 +1043,6 @@ RtsSymbolVal rtsSyms[] = {
RTS_RET_SYMBOLS
RTS_POSIX_ONLY_SYMBOLS
RTS_MINGW_ONLY_SYMBOLS
- RTS_MINGW_COMPAT_SYMBOLS
RTS_DARWIN_ONLY_SYMBOLS
RTS_OPENBSD_ONLY_SYMBOLS
RTS_LIBGCC_SYMBOLS
=====================================
rts/linker/PEi386.c
=====================================
@@ -261,6 +261,54 @@
.asciiz "libfoo_data"
+ Note [GHC Linking model and import libraries]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ The above describes how import libraries work for static linking.
+ Fundamentally this does not apply to Dynamic linknig as we do in GHC.
+ The issue is two folds:
+
+ 1. In the linking model above it is expected that the .idata sections be
+ materialized into PLTs during linking. However in GHC we never create
+ PLTs, but have out own mechanism for this which is the jump island
+ machinery. This is required for efficiency. For one materializing the
+ idata sections would result in wasting pages. We'd use one page for
+ every ~100 bytes. This is extremely wasteful and also fragments the
+ memory. Secondly the dynamic linker is lazy. We only perform the final
+ loading if the symbol is used, however with an import library we can
+ discard the actual OC immediately after reading it. This prevents us from
+ keeping ~1k in memory per symbol for no reason.
+
+ 2. GHC itself does not observ symbol visibility correctly during NGC. This
+ in itself isn't an academic exercise. The issue stems from GHC using one
+ mechanism for providing two incompatible linking modes:
+ a) The first mode is generating Haskell shared libraries which are
+ intended to be used by other Haskell code. This requires us to
+ export the info, data and closures. For this GHC just re-exports
+ all symbols. But it doesn't correcly mark data/code. Symbol
+ visibility is overwritten by telling the linker to export all
+ symbols.
+ b) The second code is producing code that's supposed to be call-able
+ through a C insterface. This in reality does not require the
+ export of closures and info tables. But also does not require the
+ inclusion of the RTS inside the DLL. Hover this is done today
+ because we don't properly have the RTS as a dynamic library.
+ i.e. GHC does not only export symbols denoted by foreign export.
+ Also GHC should depend on an RTS library, but at the moment it
+ cannot because of TNTC is incompatible with dynamic linking.
+
+ These two issues mean that for GHC we need to take a different approach
+ to handling import libraries. For normal C libraries we have proper
+ differentiation between CODE and DATA. For GHC produced import libraries
+ we do not. As such the SYM_TYPE_DUP_DISCARD tells the linker that if a
+ duplictae symbol is found, and we were going to discard it anyway, just do
+ so quitely. This works because the RTS symbols themselves are provided by
+ the currently loaded RTS as built-in symbols.
+
+ Secondly we cannot rely on a text symbol being available. As such we
+ should only depend on the symbols as definited in the .idata sections,
+ otherwise we would not be able to correctly link against GHC produced
+ import libraries.
+
Note [Memory allocation]
~~~~~~~~~~~~~~~~~~~~~~~~
The loading of an object begins in `preloadObjectFile`, which allocates a buffer,
@@ -1658,7 +1706,10 @@ ocGetNames_PEi386 ( ObjectCode* oc )
if ( secNumber != IMAGE_SYM_UNDEFINED
&& secNumber > 0
&& section
- && section->kind != SECTIONKIND_BFD_IMPORT_LIBRARY) {
+ /* Skip all BFD import sections. */
+ && section->kind != SECTIONKIND_IMPORT
+ && section->kind != SECTIONKIND_BFD_IMPORT_LIBRARY
+ && section->kind != SECTIONKIND_BFD_IMPORT_LIBRARY_HEAD) {
/* This symbol is global and defined, viz, exported */
/* for IMAGE_SYMCLASS_EXTERNAL
&& !IMAGE_SYM_UNDEFINED,
@@ -1691,12 +1742,49 @@ ocGetNames_PEi386 ( ObjectCode* oc )
IF_DEBUG(linker_verbose, debugBelch("bss symbol @ %p %u\n", addr, symValue));
}
else if (section && section->kind == SECTIONKIND_BFD_IMPORT_LIBRARY) {
- setImportSymbol(oc, sname);
+ /* Disassembly of section .idata$5:
+
+ 0000000000000000 <__imp_Insert>:
+ ...
+ 0: IMAGE_REL_AMD64_ADDR32NB .idata$6
+
+ The first two bytes contain the ordinal of the function
+ in the format of lowpart highpart. The two bytes combined
+ for the total range of 16 bits which is the function export limit
+ of DLLs. See note [GHC Linking model and import libraries]. */
+ sname = (SymbolName*)section->start+2;
+ COFF_symbol* sym = &oc->info->symbols[info->numberOfSymbols-1];
+ addr = get_sym_name( getSymShortName (info, sym), oc);
+
+ IF_DEBUG(linker,
+ debugBelch("addImportSymbol `%s' => `%s'\n",
+ sname, (char*)addr));
+ /* We're going to free the any data associated with the import
+ library without copying the sections. So we have to duplicate
+ the symbol name and values before the pointers become invalid. */
+ sname = strdup (sname);
+ addr = strdup (addr);
+ type = has_code_section ? SYM_TYPE_CODE : SYM_TYPE_DATA;
+ type |= SYM_TYPE_DUP_DISCARD;
+ if (!ghciInsertSymbolTable(oc->fileName, symhash, sname,
+ addr, false, type, oc)) {
+ releaseOcInfo (oc);
+ stgFree (oc->image);
+ oc->image = NULL;
+ return false;
+ }
+ setImportSymbol (oc, sname);
+
+ /* Don't process this oc any further. Just exit. */
+ oc->n_symbols = 0;
+ oc->symbols = NULL;
+ stgFree (oc->image);
+ oc->image = NULL;
+ releaseOcInfo (oc);
// There is nothing that we need to resolve in this object since we
// will never call the import stubs in its text section
oc->status = OBJECT_DONT_RESOLVE;
-
- IF_DEBUG(linker_verbose, debugBelch("import symbol %s\n", sname));
+ return true;
}
else if (secNumber > 0
&& section
=====================================
rts/package.conf.in
=====================================
@@ -54,11 +54,6 @@ extra-libraries:
#if defined(DEBUG) && defined(HAVE_LIBBFD)
,"bfd", "iberty" /* for debugging */
#endif
-#if defined(HAVE_LIBMINGWEX)
-# if !defined(INSTALLING) /* Bundled Mingw is behind */
- ,"mingwex"
-# endif
-#endif
#if USE_LIBDW
, "elf"
, "dw" /* for backtraces */
=====================================
rts/rts.cabal.in
=====================================
@@ -24,8 +24,6 @@ flag need-pthread
default: @CabalNeedLibpthread@
flag libbfd
default: @CabalHaveLibbfd@
-flag mingwex
- default: @CabalMingwex@
flag need-atomic
default: @CabalNeedLibatomic@
flag libdw
@@ -68,7 +66,6 @@ library
exposed: True
exposed-modules:
-
if os(ghcjs)
include-dirs: include
@@ -194,8 +191,6 @@ library
if flag(libbfd)
-- for debugging
extra-libraries: bfd iberty
- if flag(mingwex)
- extra-libraries: mingwex
if flag(libdw)
-- for backtraces
extra-libraries: elf dw
=====================================
testsuite/tests/ghci/linking/dyn/Makefile
=====================================
@@ -88,10 +88,6 @@ compile_libAB_dyn:
.PHONY: compile_libAS_impl_gcc
compile_libAS_impl_gcc:
- rm -rf bin_impl_gcc
- mkdir bin_impl_gcc
- '$(TEST_HC)' $(MY_TEST_HC_OPTS) -odir "bin_impl_gcc" -shared A.c -o "bin_impl_gcc/$(call DLL,ASimpL)"
- mv bin_impl_gcc/libASimpL.dll.a bin_impl_gcc/libASx.dll.a
echo "main" | '$(TEST_HC)' $(TEST_HC_OPTS_INTERACTIVE) T11072.hs -lASx -L./bin_impl_gcc
.PHONY: compile_libAS_impl_msvc
=====================================
testsuite/tests/ghci/linking/dyn/all.T
=====================================
@@ -41,9 +41,9 @@ test('T10458',
extra_hc_opts('-L"$PWD/T10458dir" -lAS')],
ghci_script, ['T10458.script'])
-test('T11072gcc', [extra_files(['A.c', 'T11072.hs']),
- expect_broken(18718),
- unless(doing_ghci, skip), unless(opsys('mingw32'), skip)],
+test('T11072gcc', [extra_files(['A.c', 'T11072.hs', 'bin_impl_gcc/']),
+ unless(doing_ghci, skip), unless(opsys('mingw32'), skip),
+ unless(arch('x86_64'), skip)],
makefile_test, ['compile_libAS_impl_gcc'])
test('T11072msvc', [extra_files(['A.c', 'T11072.hs', 'libAS.def', 'i686/', 'x86_64/']),
=====================================
utils/haddock
=====================================
@@ -1 +1 @@
-Subproject commit edc72530978d8a9ec92f51d288484986ec0051e3
+Subproject commit a9a312991e55ab99a8dee36a6747f4fc5d5b7c67
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3a21290e230520b342a301c1e8a9aad6c312c45a...3e8ae3f83f6047ef5de9bee1d288810672f9c80f
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3a21290e230520b342a301c1e8a9aad6c312c45a...3e8ae3f83f6047ef5de9bee1d288810672f9c80f
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20221204/cda8a1b1/attachment-0001.html>
More information about the ghc-commits
mailing list