Merge autoPatchelfHook improvements (#47222)
This includes the initialy commit was done by @Mic92 plus a few fixes from my side. So essentially this avoids patching statically linked executables and also speeds up searching for ELF files altogether. I've tested this by comparing the outputs of all the derivations which make use of this hook using the following Nix expression: let getPackagesForRev = rev: with import (builtins.fetchGit { url = ./.; inherit rev; }) { config.allowUnfree = true; }; [ cups-kyodialog3 elasticsearch franz gurobi javacard-devkit masterpdfeditor maxx oracle-instantclient powershell reaper teamviewer unixODBCDrivers.msodbcsql17 virtlyst wavebox zoom-us ]; pkgs = import <nixpkgs> {}; baseRev = "ef764eb0d8314b81a012dae04642b4766199956d"; in pkgs.runCommand "diff-contents" { chset = pkgs.lib.zipListsWith (old: new: pkgs.runCommand "diff" { inherit old new; nativeBuildInputs = [ pkgs.nukeReferences ]; } '' mkdir -p "''${NIX_STORE#/}" cp --no-preserve=all -r "$old" "''${NIX_STORE#/}" cp --no-preserve=all -r "$new" "''${NIX_STORE#/}" find "''${old#/}" "''${new#/}" \ \( -type f -exec nuke-refs {} + \) -o \( -type l -delete \) mkdir "$out" echo "$old" > "$out/old-path" echo "$new" > "$out/new-path" diff -Nur "''${old#/}" "''${new#/}" > "$out/diff" || : '') (getPackagesForRev baseRev) (getPackagesForRev ""); } '' err=0 for c in $chset; do if [ -s "$c/diff" ]; then echo "$(< "$c/old-path") -> $(< "$c/new-path")" \ "differs, report: $c/diff" >&2 err=1 fi done [ $err -eq 0 ] && touch "$out" '' With these changes there is only one derivation which has altered contents, which is "franz". However the reason why it has differing contents is not directly because of the autoPatchelfHook changes, but because the "env-vars" file from the builder is in "$out/opt/franz/env-vars" (Cc: @gnidorah) and we now have different contents for NIX_CFLAGS_COMPILE and other environment variables. I also tested this against a random static binary and the hook no longer tries to patch it. Merges: #47222
This commit is contained in:
commit
19e83bc2ba
|
@ -7,21 +7,7 @@ gatherLibraries() {
|
|||
addEnvHooks "$targetOffset" gatherLibraries
|
||||
|
||||
isExecutable() {
|
||||
[ "$(file -b -N --mime-type "$1")" = application/x-executable ]
|
||||
}
|
||||
|
||||
findElfs() {
|
||||
find "$1" -type f -exec "$SHELL" -c '
|
||||
while [ -n "$1" ]; do
|
||||
mimeType="$(file -b -N --mime-type "$1")"
|
||||
if [ "$mimeType" = application/x-executable \
|
||||
-o "$mimeType" = application/x-pie-executable \
|
||||
-o "$mimeType" = application/x-sharedlib ]; then
|
||||
echo "$1"
|
||||
fi
|
||||
shift
|
||||
done
|
||||
' -- {} +
|
||||
readelf -h "$1" 2> /dev/null | grep -q '^ *Type: *EXEC\>'
|
||||
}
|
||||
|
||||
# We cache dependencies so that we don't need to search through all of them on
|
||||
|
@ -167,9 +153,14 @@ autoPatchelf() {
|
|||
# findDependency outside of this, the dependency cache needs to be rebuilt
|
||||
# from scratch, so keep this in mind if you want to run findDependency
|
||||
# outside of this function.
|
||||
findElfs "$prefix" | while read -r elffile; do
|
||||
autoPatchelfFile "$elffile"
|
||||
done
|
||||
while IFS= read -r -d $'\0' file; do
|
||||
isELF "$file" || continue
|
||||
if isExecutable "$file"; then
|
||||
# Skip if the executable is statically linked.
|
||||
readelf -l "$file" | grep -q "^ *INTERP\\>" || continue
|
||||
fi
|
||||
autoPatchelfFile "$file"
|
||||
done < <(find "$prefix" -type f -print0)
|
||||
}
|
||||
|
||||
# XXX: This should ultimately use fixupOutputHooks but we currently don't have
|
||||
|
|
|
@ -29,7 +29,8 @@ stdenv.mkDerivation (rec {
|
|||
sed -i "s|ES_CLASSPATH=\"\$ES_HOME/lib/\*\"|ES_CLASSPATH=\"$out/lib/*\"|" ./bin/elasticsearch-env
|
||||
'';
|
||||
|
||||
buildInputs = [ makeWrapper jre_headless utillinux ];
|
||||
buildInputs = [ makeWrapper jre_headless utillinux ]
|
||||
++ optional enableUnfree zlib;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
|
|
|
@ -81,8 +81,7 @@ with pkgs;
|
|||
{ deps = [ autoconf264 automake111x gettext libtool ]; }
|
||||
../build-support/setup-hooks/autoreconf.sh;
|
||||
|
||||
autoPatchelfHook = makeSetupHook
|
||||
{ name = "auto-patchelf-hook"; deps = [ file ]; }
|
||||
autoPatchelfHook = makeSetupHook { name = "auto-patchelf-hook"; }
|
||||
../build-support/setup-hooks/auto-patchelf.sh;
|
||||
|
||||
ensureNewerSourcesHook = { year }: makeSetupHook {}
|
||||
|
|
Loading…
Reference in New Issue