From: sof Date: Thu, 27 Oct 2005 01:39:40 +0000 (+0000) Subject: [project @ 2005-10-27 01:39:40 by sof] X-Git-Tag: Initial_conversion_from_CVS_complete~116 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=2909e6fb2223bd303e00b34d3a04466474c53f03 [project @ 2005-10-27 01:39:40 by sof] [mingw/msys only] Undo long-standing workaround for buggy GNU ld's on mingw/msys; i.e., the linker wasn't correctly generating relocatable object files when the number of relocs exceeded 2^16. Worked around the issue by hackily splitting up the GHCi object file for the larger packages ('base', 'ObjectIO' and 'win32') into a handful of object files, each with a manageable number of relocs. Tiresome and error-prone (but the hack has served us well!) This commit imposes a restriction on the 'ld' you use to compile up GHC with; it now has to be ld-2.15.x or later (something GHC binary dists have shipped with since 6.2.2) --- diff --git a/aclocal.m4 b/aclocal.m4 index 3937ac8..858a3f0 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -363,6 +363,12 @@ case $HostPlatform in LdCmd="`cygpath -w ${fp_prog_ld_raw} | sed -e 's@\\\\@/@g'`" AC_MSG_NOTICE([normalized ld command to $LdCmd]) fi + # Insist on >= ld-2.15.x, since earlier versions doesn't handle + # the generation of relocatable object files with large amounts + # of relocations correctly. (cf. HSbase.o splittage-hack) + fp_prog_ld_version=`${LdCmd} --version | sed -n '/GNU ld/p' | tr -cd 0-9 | cut -b1-3` + FP_COMPARE_VERSIONS([$fp_prog_ld_version],[-lt],[214], + [AC_MSG_ERROR([GNU ld version later than 2.14 required to compile GHC on Windows.])])[]dnl ;; esac AC_SUBST([LdCmd]) diff --git a/ghc/compiler/main/Packages.lhs b/ghc/compiler/main/Packages.lhs index 5f32acc..1ab814b 100644 --- a/ghc/compiler/main/Packages.lhs +++ b/ghc/compiler/main/Packages.lhs @@ -559,7 +559,7 @@ getPackageLinkOpts dflags pkgs = do rts_tag = rtsBuildTag dflags let imp = if opt_Static then "" else "_dyn" - libs p = map ((++imp) . addSuffix) (hACK (hsLibraries p)) + libs p = map ((++imp) . addSuffix) (hsLibraries p) ++ hACK_dyn (extraLibraries p) all_opts p = map ("-l" ++) (libs p) ++ ldOptions p @@ -570,7 +570,8 @@ getPackageLinkOpts dflags pkgs = do addSuffix other_lib = other_lib ++ suffix -- This is a hack that's even more horrible (and hopefully more temporary) - -- than the one below. HSbase_cbits and friends require the _dyn suffix + -- than the one below [referring to previous splittage of HSbase into chunks + -- to work around GNU ld bug]. HSbase_cbits and friends require the _dyn suffix -- for dynamic linking, but not _p or other 'way' suffix. So we just add -- _dyn to extraLibraries if they already have a _cbits suffix. @@ -579,41 +580,6 @@ getPackageLinkOpts dflags pkgs = do | otherwise = lib return (concat (map all_opts ps)) - where - - -- This is a totally horrible (temporary) hack, for Win32. Problem is - -- that package.conf for Win32 says that the main prelude lib is - -- split into HSbase1, HSbase2 and HSbase3, which is needed due to a bug - -- in the GNU linker (PEi386 backend). However, we still only - -- have HSbase.a for static linking, not HSbase{1,2,3}.a - -- getPackageLibraries is called to find the .a's to add to the static - -- link line. On Win32, this hACK detects HSbase{1,2,3} and - -- replaces them with HSbase, so static linking still works. - -- Libraries needed for dynamic (GHCi) linking are discovered via - -- different route (in InteractiveUI.linkPackage). - -- See driver/PackageSrc.hs for the HSbase1/HSbase2 split definition. - -- THIS IS A STRICTLY TEMPORARY HACK (famous last words ...) - -- JRS 04 Sept 01: Same appalling hack for HSwin32[1,2] - -- KAA 29 Mar 02: Same appalling hack for HSobjectio[1,2,3,4] - -- - -- [sof 03/05: Renamed the (moribund) HSwin32 to HSwin_32 so as to - -- avoid filename conflicts with the 'Win32' package on a case-insensitive filesystem] - hACK libs -# if !defined(mingw32_TARGET_OS) && !defined(cygwin32_TARGET_OS) - = libs -# else - = if "HSbase1" `elem` libs && "HSbase2" `elem` libs && "HSbase3" `elem` libs - then "HSbase" : filter (not.(isPrefixOf "HSbase")) libs - else - if "HSwin_321" `elem` libs && "HSwin_322" `elem` libs - then "HSwin_32" : filter (not.(isPrefixOf "HSwin_32")) libs - else - if "HSobjectio1" `elem` libs && "HSobjectio2" `elem` libs && "HSobjectio3" `elem` libs && "HSobjectio4" `elem` libs - then "HSobjectio" : filter (not.(isPrefixOf "HSobjectio")) libs - else - libs -# endif - getPackageExtraCcOpts :: DynFlags -> [PackageId] -> IO [String] getPackageExtraCcOpts dflags pkgs = do diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 62fc9fa..41afe58 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -2258,8 +2258,14 @@ ocResolve_PEi386 ( ObjectCode* oc ) COFF_reloc* rel = (COFF_reloc*) myindex ( sizeof_COFF_reloc, reltab, 0 ); noRelocs = rel->VirtualAddress; + + /* 10/05: we now assume (and check for) a GNU ld that is capable + * of handling object files with (>2^16) of relocs. + */ +#if 0 debugBelch("WARNING: Overflown relocation field (# relocs found: %u)\n", noRelocs); +#endif j = 1; } else { noRelocs = sectab_i->NumberOfRelocations;