Skip to content

Instantly share code, notes, and snippets.

@notpeelz
Last active February 24, 2020 22:26
Show Gist options
  • Save notpeelz/3e160d390141b364be327d38eca88604 to your computer and use it in GitHub Desktop.
Save notpeelz/3e160d390141b364be327d38eca88604 to your computer and use it in GitHub Desktop.
NixOS ld automated testing
#!/usr/bin/env bash
libs=(libdl.so.2 libpthread.so.0 librt.so.1 libgobject-2.0.so.0 libglib-2.0.so.0 libgio-2.0.so.0 libnss3.so libnssutil3.so libsmime3.so libnspr4.so libgtk-3.so.0 libgdk-3.so.0 libatk-1.0.so.0 libpangocairo-1.0.so.0 libgdk_pixbuf-2.0.so.0 libpango-1.0.so.0 libcairo.so.2 libX11.so.6 libX11-xcb.so.1 libxcb.so.1 libXcomposite.so.1 libXcursor.so.1 libXdamage.so.1 libXext.so.6 libXfixes.so.3 libXi.so.6 libXrender.so.1 libXtst.so.6 libexpat.so.1 libuuid.so.1 libXrandr.so.2 libXss.so.1 libasound.so.2 libdbus-1.so.3 libatk-bridge-2.0.so.0 libm.so.6 libcups.so.2 libgcc_s.so.1 libc.so.6 ld-linux-x86-64.so.2)
discord_bin="/nix/store/pm4x04ls3wpxq8ashsm5qnfwvxk4p85s-discord-0.0.9/opt/Discord/.Discord-wrapped"
preload_pkgs=()
preload_path=
i=0
for item in "${libs[@]}"; do
pkgs=($(nix-locate --top-level --at-root --minimal "/lib/$item"))
found=0
pkg=
for pkg in "${pkgs[@]}"; do
# Download package
storePath="$(nix-build '<nixpkgs>' -A "$pkg")"
#storePath="$(nix eval "nixpkgs.$(echo $pkg | sed 's/\.out$/.outPath/')" | tr -d '"')"
echo "Testing $storePath/lib/$item"
[[ ! -e "$storePath/lib/$item" ]] && continue
echo "Found $item in $pkg"
found=1
break
done
if [[ "$found" -eq 0 ]]; then
echo "WARNING: $item not found in these packages: $pkgs"
break
fi
echo "($i of ${#libs[@]}) Testing $pkg ($item) ($(echo $pkgs | wc -w)): $storePath"
echo $pkgs
echo -e "--------------------\nfile:"
file "$storePath/lib/$item"
# Test one by one
#echo -e "--------------------\nld:"
#nix-shell -p "[ discord $pkg ]" --run "ld --rpath=$storePath/lib $discord_bin |& grep -i $item"
#echo -e "--------------------\nLD_PRELOAD=$storePath/lib/$item Discord:"
#nix-shell -p "[ discord $pkg ]" --run "LD_PRELOAD=$storePath/lib/$item Discord"
#read -r -n 1 -p "Is discord working yet? (y/n)" conf
#[[ "$conf" == "y" ]] && break
preload_pkgs+=("$pkg")
preload_path="$storePath/lib/$item${preload_path:+ }$preload_path"
i=$((i + 1))
done
# Test all libraries at once
echo "LD_PRELOAD=\"$preload_path\""
nix-shell -p discord ${preload_pkgs[@]} --run "LD_PRELOAD=\"$preload_path\" Discord"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment