Unverified Commit 4d92ffb3 authored by Adam Joseph's avatar Adam Joseph Committed by GitHub
Browse files

Merge pull request #244406 from amjoseph-nixpkgs/pr/fix/244405

gccWithoutTargetLibc: link libgcc_s.so using -mnewlib if isPower
parents c77cd042 424952b7
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -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/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
+ lib.optionalString (targetPlatform != hostPlatform && withoutTargetLibc && enableShared)
  (lib.optionalString (!stdenv.targetPlatform.isPower) ''
    echo 'libgcc.a: crti.o crtn.o' >> libgcc/Makefile.in
  '' + ''
    echo 'SHLIB_LC=' >> libgcc/Makefile.in
  (let

    # crt{i,n}.o are the first and last (respectively) object file
    # 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) ''
+1 −1
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ let
    pkgs.pkgsCross.arm-embedded.stdenv
    pkgs.pkgsCross.m68k.stdenv
    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-gnuabin32.stdenv
    pkgs.pkgsCross.mingwW64.stdenv