about summary refs log tree commit diff
path: root/pkgs/development/compilers/gcc/common/strip-attributes.nix
blob: f2f0efb1264a931a6e5192cadc514d741856c575 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{ lib, stdenv, langJit }:

{
  # Note [Cross-compiler stripping]
  # gcc requires delicate stripping as it installs ELF files for both
  # HOST and TARGET platforms. It requires according strip tool otherwise
  # strip could remove sections it's not aware of.
  # Example ARM breakage by x86_64 strip: https://bugs.gentoo.org/697428
  #
  # Let's recap the file layout for directories with object files for a
  # cross-compiler:
  #
  # $out (host != target)
  # `- bin: HOST
  #    lib/*.{a,o}: HOST
  #      `- gcc/<TARGET>/<VERSION>/*.{a,o}: TARGET
  #                               `- plugin/: HOST
  #  `- lib{,32,64,x32}: symlink to lib or identical layout
  #  `- libexec/: HOST
  #  `- <TARGET>/: TARGET
  #
  # $out (host == target) has identical directory layout.
  #
  # $lib (host != target):
  # `- <TARGET>/lib/*.{la,so}: TARGET
  #
  # $lib (host == target):
  # `- lib/*.{la,so}: HOST

  # The rest of stripDebugList{Host,Target} will be populated in
  # postInstall to disambiguate lib/ object files.
  stripDebugList = [ "bin" "libexec" ];
  stripDebugListTarget = [ stdenv.targetPlatform.config ];

  preFixup = ''
    # Populate most delicated lib/ part of stripDebugList{,Target}
    updateDebugListPaths() {
      local oldOpts
      oldOpts="$(shopt -p nullglob)" || true
      shopt -s nullglob

      pushd $out
      local -ar outHostFiles=(
        lib{,32,64}/*.{a,o,so*}
        lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/plugin
      )
      local -ar outTargetFiles=(
        lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/*.{a,o,so*}
      )
      popd
  '' + lib.optionalString (!langJit) ''
    ${/*keep indentation*/ ""}
      pushd $lib
      local -ar libHostFiles=(
        lib{,32,64}/*.{a,o,so*}
      )
      local -ar libTargetFiles=(
        lib{,32,64}/${stdenv.targetPlatform.config}/*.{a,o,so*}
      )
      popd

  '' + ''
      eval "$oldOpts"

      stripDebugList="$stripDebugList ''${outHostFiles[*]} ''${libHostFiles[*]}"
      stripDebugListTarget="$stripDebugListTarget ''${outTargetFiles[*]} ''${libTargetFiles[*]}"
    }
    updateDebugListPaths
  '';
}