51b1297c8a
It used to be a symlink, but now it is a link script. It's crucial to get proper linking, specially on amrv5tel, where libgcc contains lot of code related to the limited instruction set of the platform. Without this fix, g++ shared lib linking was broken, because a "-lgcc" was not propagated wherever "-lgcc_s" was required. The g++ spec only mentions "-lgcc_s" and the "-lgcc" is introduced with the libgcc_s.so link script, only available in the glibc path after this fix. As a reminder, we put libgcc* in the glibc output to avoid having a runtime dependency on the gcc path only because of the everywhere linked libgcc. This problem was specially visible in platforms like armv5tel, where most programs end up linked to libgcc. Platforms with a more rich instruction set may rarely end up requiring a link to libgcc.
103 lines
2.9 KiB
Nix
103 lines
2.9 KiB
Nix
{ stdenv, fetchurl, fetchgit ? null, kernelHeaders
|
|
, machHeaders ? null, hurdHeaders ? null, libpthreadHeaders ? null
|
|
, mig ? null
|
|
, installLocales ? true
|
|
, profilingLibraries ? false
|
|
, gccCross ? null
|
|
, debugSymbols ? false
|
|
, withGd ? false, gd ? null, libpng ? null
|
|
}:
|
|
|
|
assert stdenv.cc.cc.isGNU or false;
|
|
|
|
let
|
|
build = import ./common.nix;
|
|
cross = if gccCross != null then gccCross.target else null;
|
|
in
|
|
build cross ({
|
|
name = "glibc"
|
|
+ stdenv.lib.optionalString (hurdHeaders != null) "-hurd"
|
|
+ stdenv.lib.optionalString debugSymbols "-debug"
|
|
+ stdenv.lib.optionalString withGd "-gd";
|
|
|
|
inherit fetchurl fetchgit stdenv kernelHeaders installLocales
|
|
profilingLibraries gccCross withGd gd libpng;
|
|
|
|
builder = ./builder.sh;
|
|
|
|
# When building glibc from bootstrap-tools, we need libgcc_s at RPATH for
|
|
# any program we run, because the gcc will have been placed at a new
|
|
# store path than that determined when built (as a source for the
|
|
# bootstrap-tools tarball)
|
|
# Building from a proper gcc staying in the path where it was installed,
|
|
# libgcc_s will not be at {gcc}/lib, and gcc's libgcc will be found without
|
|
# any special hack.
|
|
preInstall = if cross != null then "" else ''
|
|
if [ -f ${stdenv.cc.cc}/lib/libgcc_s.so.1 ]; then
|
|
mkdir -p $out/lib
|
|
cp ${stdenv.cc.cc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
|
|
# the .so It used to be a symlink, but now it is a script
|
|
cp -a ${stdenv.cc.cc}/lib/libgcc_s.so $out/lib/libgcc_s.so
|
|
fi
|
|
'';
|
|
|
|
meta.description = "The GNU C Library";
|
|
}
|
|
|
|
//
|
|
|
|
(if debugSymbols
|
|
then {
|
|
# Build with debugging symbols, but leave optimizations on and don't
|
|
# attempt to keep the build tree.
|
|
dontStrip = true;
|
|
dontCrossStrip = true;
|
|
NIX_STRIP_DEBUG = 0;
|
|
}
|
|
else {})
|
|
|
|
//
|
|
|
|
(if hurdHeaders != null
|
|
then rec {
|
|
inherit machHeaders hurdHeaders libpthreadHeaders mig fetchgit;
|
|
|
|
propagatedBuildInputs = [ machHeaders hurdHeaders libpthreadHeaders ];
|
|
|
|
passthru = {
|
|
# When building GCC itself `propagatedBuildInputs' above is not
|
|
# honored, so we pass it here so that the GCC builder can do the right
|
|
# thing.
|
|
inherit propagatedBuildInputs;
|
|
};
|
|
}
|
|
else { })
|
|
|
|
//
|
|
|
|
(if cross != null
|
|
then {
|
|
preConfigure = ''
|
|
sed -i s/-lgcc_eh//g "../$sourceRoot/Makeconfig"
|
|
|
|
cat > config.cache << "EOF"
|
|
libc_cv_forced_unwind=yes
|
|
libc_cv_c_cleanup=yes
|
|
libc_cv_gnu89_inline=yes
|
|
# Only due to a problem in gcc configure scripts:
|
|
libc_cv_sparc64_tls=${if cross.withTLS then "yes" else "no"}
|
|
EOF
|
|
export BUILD_CC=gcc
|
|
export CC="$crossConfig-gcc"
|
|
export AR="$crossConfig-ar"
|
|
export RANLIB="$crossConfig-ranlib"
|
|
|
|
dontStrip=1
|
|
'';
|
|
|
|
# To avoid a dependency on the build system 'bash'.
|
|
preFixup = ''
|
|
rm $out/bin/{ldd,tzselect,catchsegv,xtrace}
|
|
'';
|
|
}
|
|
else {}))
|