Files
linux-collect-dependencies/collect.sh
T
2026-08-24 16:24:13 -07:00

116 lines
2.1 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
EXE_PATH="$1"
ARTIFACT_PATH="${2:-artifacts}"
if [ ! -f "$EXE_PATH" ]; then
echo "Executable does not exist: $EXE_PATH"
exit 1
fi
mkdir -p "$ARTIFACT_PATH"
declare -A PROCESSED
is_system_library() {
local name
name="$(basename "$1")"
case "$name" in
libc.so|libc.so.*)
return 0
;;
libm.so|libm.so.*)
return 0
;;
libpthread.so|libpthread.so.*)
return 0
;;
libdl.so|libdl.so.*)
return 0
;;
librt.so|librt.so.*)
return 0
;;
ld-linux*.so|ld-linux*.so.*)
return 0
;;
libgcc_s.so|libgcc_s.so.*)
return 0
;;
*)
return 1
;;
esac
}
get_dependencies() {
local binary="$1"
ldd "$binary" |
awk '
/=> \// {
print $3
next
}
/^\// {
print $1
}
' |
sort -u
}
copy_dependency() {
local dependency="$1"
local requested_name
requested_name="$(basename "$dependency")"
local resolved_path
resolved_path="$(readlink -f "$dependency")"
local destination
destination="$ARTIFACT_PATH/$requested_name"
if [ ! -f "$destination" ]; then
echo "Copying dependency: $dependency"
cp "$resolved_path" "$destination"
fi
}
copy_dependencies() {
local binary="$1"
while IFS= read -r dependency; do
[ -z "$dependency" ] && continue
[ ! -f "$dependency" ] && continue
if [[ -n "${PROCESSED[$dependency]:-}" ]]; then
continue
fi
PROCESSED["$dependency"]=1
if is_system_library "$dependency"; then
echo "Skipping Linux system dependency: $dependency"
continue
fi
copy_dependency "$dependency"
copy_dependencies "$dependency"
done < <(get_dependencies "$binary")
}
copy_dependencies "$EXE_PATH"