Files
nixpkgs/pkgs/build-support/setup-hooks/arrayUtilities/getRunpathEntries/getRunpathEntries.bash
T
Connor Baker caac26618a arrayUtilities.getRunpathEntries: init
Signed-off-by: Connor Baker <ConnorBaker01@gmail.com>
2025-11-25 01:15:31 +00:00

50 lines
1.8 KiB
Bash

# shellcheck shell=bash
# getRunpathEntries
# Append the runpath entries of the dynamically linked ELF file at path to the indexed array referenced by
# outputArrRef.
#
# NOTE: This function does not check if path is a valid ELF file.
#
# Arguments:
# - path: a path to an ELF file with a dynamic section
# - outputArrRef: a reference to an indexed array (mutated only by appending)
#
# Returns 0 if the file is dynamically linked and the runpath was appended to the output array.
# Returns 1 if patchelf fails (e.g., the ELF file is not dynamically linked, so patchelf fails to print the rpath).
getRunpathEntries() {
if (($# != 2)); then
nixErrorLog "expected two arguments!"
nixErrorLog "usage: getRunpathEntries path outputArrRef"
exit 1
fi
local -r path="$1"
local -rn outputArrRef="$2"
if [[ ! -f $path ]]; then
nixErrorLog "first argument path $path is not a file"
exit 1
elif ! isDeclaredArray "${!outputArrRef}"; then
nixErrorLog "second argument outputArrRef must be a reference to an indexed array"
exit 1
fi
# Declare runpath separately to avoid masking the return value of patchelf.
local runpath
# Files that are not dynamically linked cause patchelf to exit with a non-zero status and print to stderr.
# If patchelf fails to print the rpath, we assume the file is not dynamically linked.
runpath="$(patchelf --print-rpath "$path" 2>/dev/null)" || return 1
# If the runpath is empty and we feed it to mapfile, it gives us a singleton array with an empty string.
# We want to avoid that, so we check if the runpath is empty before trying to populate runpathEntries.
local -a runpathEntries=()
if [[ -n $runpath ]]; then
mapfile -d ':' -t runpathEntries < <(echo -n "$runpath")
fi
outputArrRef+=("${runpathEntries[@]}")
return 0
}