mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-22 15:03:28 +00:00
gccWithoutTargetLibc: link libgcc_s.so using -mnewlib if isPower
Closes #244405 Also adds considerably more commenting to document what is going on.
This commit is contained in:
parent
d3185b8a56
commit
424952b7b4
@ -117,10 +117,35 @@ in lib.optionalString (hostPlatform.isSunOS && hostPlatform.is64bit) ''
|
|||||||
# https://web.archive.org/web/20170222224855/http://frank.harvard.edu/~coldwell/toolchain/
|
# https://web.archive.org/web/20170222224855/http://frank.harvard.edu/~coldwell/toolchain/
|
||||||
# https://web.archive.org/web/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
|
# https://web.archive.org/web/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
|
||||||
+ lib.optionalString (targetPlatform != hostPlatform && withoutTargetLibc && enableShared)
|
+ lib.optionalString (targetPlatform != hostPlatform && withoutTargetLibc && enableShared)
|
||||||
(lib.optionalString (!stdenv.targetPlatform.isPower) ''
|
(let
|
||||||
echo 'libgcc.a: crti.o crtn.o' >> libgcc/Makefile.in
|
|
||||||
'' + ''
|
# crt{i,n}.o are the first and last (respectively) object file
|
||||||
echo 'SHLIB_LC=' >> libgcc/Makefile.in
|
# linked when producing an executable. Traditionally these
|
||||||
|
# files are delivered as part of the C library, but on GNU
|
||||||
|
# systems they are in fact built by GCC. Since libgcc needs to
|
||||||
|
# build before glibc, we can't wait for them to be copied by
|
||||||
|
# glibc. At this early pre-glibc stage these files sometimes
|
||||||
|
# have different names.
|
||||||
|
crtstuff-ofiles =
|
||||||
|
if targetPlatform.isPower
|
||||||
|
then "ecrti.o ecrtn.o ncrti.o ncrtn.o"
|
||||||
|
else "crti.o crtn.o";
|
||||||
|
|
||||||
|
# Normally, `SHLIB_LC` is set to `-lc`, which means that
|
||||||
|
# `libgcc_s.so` cannot be built until `libc.so` is available.
|
||||||
|
# The assignment below clobbers this variable, removing the
|
||||||
|
# `-lc`.
|
||||||
|
#
|
||||||
|
# On PowerPC we add `-mnewlib`, which means "libc has not been
|
||||||
|
# built yet". This causes libgcc's Makefile to use the
|
||||||
|
# gcc-built `{e,n}crt{n,i}.o` instead of failing to find the
|
||||||
|
# versions which have been repackaged in libc as `crt{n,i}.o`
|
||||||
|
#
|
||||||
|
SHLIB_LC = lib.optionalString targetPlatform.isPower "-mnewlib";
|
||||||
|
|
||||||
|
in ''
|
||||||
|
echo 'libgcc.a: ${crtstuff-ofiles}' >> libgcc/Makefile.in
|
||||||
|
echo 'SHLIB_LC=${SHLIB_LC}' >> libgcc/Makefile.in
|
||||||
'')
|
'')
|
||||||
|
|
||||||
+ lib.optionalString (!enableMultilib && hostPlatform.is64bit && !hostPlatform.isMips64n32) ''
|
+ lib.optionalString (!enableMultilib && hostPlatform.is64bit && !hostPlatform.isMips64n32) ''
|
||||||
|
@ -136,7 +136,7 @@ let
|
|||||||
pkgs.pkgsCross.arm-embedded.stdenv
|
pkgs.pkgsCross.arm-embedded.stdenv
|
||||||
pkgs.pkgsCross.m68k.stdenv
|
pkgs.pkgsCross.m68k.stdenv
|
||||||
pkgs.pkgsCross.aarch64-multiplatform.pkgsBuildTarget.gcc
|
pkgs.pkgsCross.aarch64-multiplatform.pkgsBuildTarget.gcc
|
||||||
#pkgs.pkgsCross.powernv.pkgsBuildTarget.gcc
|
pkgs.pkgsCross.powernv.pkgsBuildTarget.gcc
|
||||||
pkgs.pkgsCross.mips64el-linux-gnuabi64.stdenv
|
pkgs.pkgsCross.mips64el-linux-gnuabi64.stdenv
|
||||||
pkgs.pkgsCross.mips64el-linux-gnuabin32.stdenv
|
pkgs.pkgsCross.mips64el-linux-gnuabin32.stdenv
|
||||||
pkgs.pkgsCross.mingwW64.stdenv
|
pkgs.pkgsCross.mingwW64.stdenv
|
||||||
|
Loading…
Reference in New Issue
Block a user