packelf/packelf.sh

37 lines
959 B
Bash
Raw Normal View History

2022-10-05 04:46:42 +02:00
#!/bin/bash
set -eo pipefail
[ $# -lt 2 ] && {
echo "usage: $0 <ELF_SRC_PATH> <DST_PATH> [ADDITIONAL_LIBS ...]"
exit 1
}
src="$1"
dst="$2"
shift
shift
2022-12-04 02:31:14 +01:00
libs="$(ldd "$src" | grep -F '/' | sed -E 's|[^/]*/([^ ]+).*?|/\1|')"
ld_so="$(echo "$libs" | grep -F '/ld-linux-')"
ld_so="$(basename "$ld_so")"
program="$(basename "$src")"
2022-10-05 04:46:42 +02:00
cat >"$dst" <<EOF
#!/bin/bash
tmp_dir="\$(mktemp -d)"
check_path="\$tmp_dir/__check_permission__"
trap 'rm -rf \$tmp_dir' 0 1 2 3 6
if ! (touch "\$check_path" && chmod +x "\$check_path" && [ -x "\$check_path" ]); then
rm -rf "\$tmp_dir"
tmp_dir="\$(TMPDIR="\$(pwd)" mktemp -d)"
fi
sed '1,/^#__END__$/d' "\$0" | tar -xz -C "\$tmp_dir"
2022-12-04 02:31:14 +01:00
sed -i 's@/etc/ld.so.preload@/etc/___so.preload@g' "\$tmp_dir/$ld_so"
"\$tmp_dir/$ld_so" --library-path "\$tmp_dir" "\$tmp_dir/$program" "\$@"
2022-10-05 04:46:42 +02:00
exit \$?
#__END__
EOF
2022-10-09 19:25:37 +02:00
tar -czh --transform 's/.*\///g' "$src" $libs "$@" >>"$dst" 2> >(grep -v 'Removing leading' >&2)
2022-10-05 04:46:42 +02:00
chmod +x "$dst"