packelf/packelf.sh

98 lines
2.7 KiB
Bash
Raw Normal View History

2024-05-20 20:57:31 +02:00
#!/usr/bin/env sh
#set -o pipefail # bash extension
2024-07-08 14:00:05 +02:00
#set -e
2022-10-05 04:46:42 +02:00
2024-07-08 14:25:20 +02:00
# Pack elf binary and it's dependencies into standalone executable
2024-07-09 14:55:49 +02:00
# License: GPLv2.0
2024-07-08 14:25:20 +02:00
2024-05-20 20:57:31 +02:00
# These vars will be modified automatically with sed
compress_flag=-z
2024-07-07 21:59:58 +02:00
unpack() {
filename=$1
echo "#!/usr/bin/env sh" > $filename
echo "#set -o pipefail # bash extension" >> $filename
2024-07-08 14:00:05 +02:00
echo "#set -e" >> $filename
2024-07-07 21:59:58 +02:00
echo "" >> $filename
echo "compress_flag=$compress_flag" >> $filename
echo "executable_run=$2" >> $filename
echo "tmp_parent=/tmp" >> $filename
echo 'if [ "$1" = "--packelf-extract" ] ; then' >> $filename
echo ' mkdir -p packelf-files' >> $filename
echo " echo \"Extracting to 'packelf-files'\"" >> $filename
echo " sed '1,/^#__END__\$/d' \"\$0\" | tar \$compress_flag -x -C packelf-files" >> $filename
echo " exit 0" >> $filename
echo "fi" >> $filename
echo 'mkdir -p "$tmp_parent"' >> $filename
echo 'unpack_dir=$(mktemp -d -p "$tmp_parent" || echo "$tmp_parent")' >> $filename
echo "sed '1,/^#__END__\$/d' \"\$0\" | tar \$compress_flag -x -C \"\$unpack_dir\"" >> $filename
echo "chmod 777 -R \"\$unpack_dir\"/* 2> /dev/null" >> $filename
echo '"$unpack_dir/$executable_run" "$@"' >> $filename
echo "rm -rf \$unpack_dir" >> $filename
echo "exit 0" >> $filename
echo "#__END__" >> $filename
2024-05-20 20:57:31 +02:00
}
pack() {
2024-07-07 21:59:58 +02:00
folder=$1
filename=$2
executable_run=$3
temp_file=$(mktemp)
current_dir=$(pwd)
if [ ! -d "$folder" ] ; then
echo "Folder $folder does not exist"
exit 0
fi
#echo "Creating executable $2"
unpack $filename $executable_run
cd $folder
chmod 777 -R * 2> /dev/null
tar $compress_flag -c -f $temp_file *
2024-07-08 14:25:20 +02:00
cd $current_dir
2024-07-07 21:59:58 +02:00
cat $temp_file >> $filename
rm -rf $temp_file
echo "Created successfully"
}
2024-05-20 20:57:31 +02:00
2024-07-07 21:59:58 +02:00
help() {
2024-07-16 05:42:55 +02:00
echo "$0 <ELF_SRC_PATH> <FILENAME_DST_PATH>"
2024-07-07 21:59:58 +02:00
exit 0
}
2024-05-20 20:57:31 +02:00
2024-07-07 21:59:58 +02:00
if [ ! -z "$1" ] ; then
if [ ! -f "$1" ] ; then
echo "$0: File $1 does not exist"
exit 1
else
libs="$(ldd "$1" | grep -F '/' | sed -E 's|[^/]*/([^ ]+).*?|/\1|')"
2024-06-23 22:50:17 +02:00
ld_so="$(echo "$libs" | grep -F '/ld-linux-' || echo "$libs" | grep -F '/ld-musl-' || echo "$libs" | grep -F '/ld.so')"
2024-05-20 20:57:31 +02:00
ld_so="$(basename "$ld_so")"
2024-07-07 21:59:58 +02:00
program="$(basename "$1")"
if [ -z "$libs" ] ; then
echo "$0: Not a dynamic executable"
exit 1
2024-05-20 20:57:31 +02:00
fi
2024-07-07 21:59:58 +02:00
fi
else
help
exit 0
fi
2024-05-20 20:57:31 +02:00
2024-07-07 21:59:58 +02:00
if [ -z "$2" ] ; then
help
2024-05-20 20:57:31 +02:00
else
2024-07-07 21:59:58 +02:00
temp_dir=$(mktemp -d)
echo "Creating static binary ${2} from ${1}"
echo "Linking libraries"
cp -L ${1} ${temp_dir}/
for libraries in ${libs} ; do
cp -L ${libraries} ${temp_dir}/
done
echo "#!/usr/bin/env sh" > ${temp_dir}/AppRun
echo "" >> ${temp_dir}/AppRun
echo "\$(dirname \$0)/${ld_so} --library-path \$(dirname \$0) \$(dirname \$0)/${program} \"\$@\"" >> ${temp_dir}/AppRun
chmod 777 -R "$temp_dir"
pack "$temp_dir" "$2" AppRun
2024-05-20 20:57:31 +02:00
fi