New aport ldpath
Utility to add or remove paths from musl dynamic linker config file
This commit is contained in:
parent
2e7437825b
commit
75feba5476
3 changed files with 264 additions and 0 deletions
23
main/ldpath/APKBUILD
Normal file
23
main/ldpath/APKBUILD
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
pkgname=ldpath
|
||||||
|
pkgver=0.1
|
||||||
|
pkgrel=0
|
||||||
|
pkgdesc="Utility to add or remove paths from musl dynamic linker config file"
|
||||||
|
url="https://postmarketos.org/"
|
||||||
|
arch="noarch"
|
||||||
|
license="MIT"
|
||||||
|
source="
|
||||||
|
ldpath.sh
|
||||||
|
ldpath_test.sh
|
||||||
|
"
|
||||||
|
|
||||||
|
check() {
|
||||||
|
sh ldpath_test.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
install -Dm755 "$srcdir/ldpath.sh" \
|
||||||
|
"$pkgdir/usr/bin/ldpath"
|
||||||
|
}
|
||||||
|
|
||||||
|
sha512sums="0bf8a3bcbb314f54653921d1757b35dc582997a4c058033a390c8b8a520f44541ba1791775ef5a63706da1b8cb86018bb9c7c7effce1c4ea65a2d33896e583ff ldpath.sh
|
||||||
|
e9ac37e88bc8fb6def9d550a58da0cc8c62dc14c49d6119e95560ff7d4c36eeb6dbbbce8006de6a170f6833b3ca54c80a2f173f67fefad4bf0927dc0a3d692b7 ldpath_test.sh"
|
168
main/ldpath/ldpath.sh
Normal file
168
main/ldpath/ldpath.sh
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Add or remove paths from musl dynamic linker
|
||||||
|
# path file (/etc/ld-musl-$ARCH.path)
|
||||||
|
#
|
||||||
|
# usage example:
|
||||||
|
# $ ldpath.sh add /usr/lib/libdrm-grate
|
||||||
|
|
||||||
|
default_ld_paths() {
|
||||||
|
echo "/lib:/usr/local/lib:/usr/lib"
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# Processor arch in the convention used by the
|
||||||
|
# musl dynamic linker.
|
||||||
|
# See musl source code: ldso/dynlink.c
|
||||||
|
# Arguments:
|
||||||
|
# kernel machine hardware name (uname -m)
|
||||||
|
# Returns:
|
||||||
|
# musl ldso processor arch
|
||||||
|
###############################################
|
||||||
|
kernel_arch_to_ldso_arch() {
|
||||||
|
local karch=$1
|
||||||
|
local ld_arch=""
|
||||||
|
case "$karch" in
|
||||||
|
armv7l)
|
||||||
|
ld_arch=armhf
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
ld_arch="$karch"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo "$ld_arch"
|
||||||
|
}
|
||||||
|
|
||||||
|
default_ld_musl_file() {
|
||||||
|
local ld_arch
|
||||||
|
ld_arch=$(kernel_arch_to_ldso_arch "$(uname -m)")
|
||||||
|
echo "/etc/ld-musl-${ld_arch}.path"
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# Prepend a path to dynamic linker path file
|
||||||
|
# Arguments:
|
||||||
|
# Shared library directory
|
||||||
|
# ld musl path file
|
||||||
|
###############################################
|
||||||
|
add_path() {
|
||||||
|
local ld_library_path=$1
|
||||||
|
local ld_musl_file=$2
|
||||||
|
|
||||||
|
# Don't allow duplicates
|
||||||
|
if [ -f "$ld_musl_file" ]; then
|
||||||
|
if grep -q "$ld_library_path" "$ld_musl_file"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$ld_musl_file" ]; then
|
||||||
|
echo "${ld_library_path}:$(cat "$ld_musl_file")" > \
|
||||||
|
"$ld_musl_file"
|
||||||
|
else
|
||||||
|
echo "${ld_library_path}:$(default_ld_paths)" > "$ld_musl_file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# Remove a path from dynamic linker path file
|
||||||
|
# Arguments:
|
||||||
|
# Shared library directory
|
||||||
|
# ld musl path file
|
||||||
|
###############################################
|
||||||
|
remove_path() {
|
||||||
|
local ld_library_path=$1
|
||||||
|
local ld_musl_file=$2
|
||||||
|
local conf
|
||||||
|
|
||||||
|
if [ ! -f "$ld_musl_file" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Don't remove default paths
|
||||||
|
if default_ld_paths | grep -q "$ld_library_path"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
conf=$(awk -v ld_path="$ld_library_path" '{n=split($0, array, ":")} END {
|
||||||
|
for (i in array) {
|
||||||
|
if (array[i]!=ld_path) {
|
||||||
|
printf array[i]
|
||||||
|
if (i<n)
|
||||||
|
printf ":"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}' < "$ld_musl_file")
|
||||||
|
echo "$conf" > "$ld_musl_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
local ld_arch
|
||||||
|
ld_arch=$(kernel_arch_to_ldso_arch "$(uname -m)")
|
||||||
|
echo "usage: $(basename "$1") [-h] [-f FILE] {add,remove} LD_LIBRARY_PATH"
|
||||||
|
echo ""
|
||||||
|
echo "Add or remove LD_LIBRARY_PATH in $(default_ld_musl_file)"
|
||||||
|
echo ""
|
||||||
|
echo "optional arguments:"
|
||||||
|
echo " -h, --help show this help message and exit"
|
||||||
|
echo " -f, --file override ld musl path file"
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_args() {
|
||||||
|
local have_file_arg=""
|
||||||
|
while [ "${1:-}" != "" ]; do
|
||||||
|
case $1 in
|
||||||
|
add|remove)
|
||||||
|
ldpath_func="$1"
|
||||||
|
ldpath_arg="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-f|--file)
|
||||||
|
have_file_arg="1"
|
||||||
|
ld_musl_file="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid argument: $1"
|
||||||
|
shift
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$ldpath_func" ] || [ -z "$ldpath_arg" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$have_file_arg" = "1" ] &&
|
||||||
|
[ -z "$ld_musl_file" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
if [ -z "$ld_musl_file" ]; then
|
||||||
|
ld_musl_file=$(default_ld_musl_file)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ldpath_func" = "add" ]; then
|
||||||
|
add_path "$ldpath_arg" "$ld_musl_file"
|
||||||
|
elif [ "$ldpath_func" = "remove" ]; then
|
||||||
|
remove_path "$ldpath_arg" "$ld_musl_file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if parse_args "$@"; then
|
||||||
|
print_usage "$0"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
main "$0"
|
73
main/ldpath/ldpath_test.sh
Normal file
73
main/ldpath/ldpath_test.sh
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
testdir=$(mktemp -d)
|
||||||
|
ld_musl_file="${testdir}/ld-musl-test.path"
|
||||||
|
|
||||||
|
lib_path="/usr/lib/foo"
|
||||||
|
lib_path2="/usr/lib/bar"
|
||||||
|
|
||||||
|
# Create ldso config file and add a path to it.
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" add "$lib_path"
|
||||||
|
|
||||||
|
if ! grep -q "$lib_path" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: Did not find $lib_path in newly created config file."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add another path to config file.
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" add "$lib_path2"
|
||||||
|
if ! grep -q "$lib_path2" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: Did not find $lib_path2 in config file."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check that first path is still present
|
||||||
|
if ! grep -q "$lib_path" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: Did not find $lib_path in config file."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove the first path
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" remove "$lib_path"
|
||||||
|
if grep -q "$lib_path" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: $lib_path was not removed from config file."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check that second path is still present
|
||||||
|
if ! grep -q "$lib_path2" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: $lib_path2 should not have been removed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove the second path
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" remove "$lib_path2"
|
||||||
|
if grep -q "$lib_path2" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: $lib_path2 was not removed from config file."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Don't allow removal of default paths
|
||||||
|
_default_paths="/lib /usr/local/lib /usr/lib"
|
||||||
|
for _path in $_default_paths
|
||||||
|
do
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" remove "$_path"
|
||||||
|
if ! grep -q "$_path" "$ld_musl_file"; then
|
||||||
|
echo "ERROR: Default path $_path should not have been removed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Don't allow duplicates
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" add "$lib_path"
|
||||||
|
sh ldpath.sh -f "$ld_musl_file" add "$lib_path"
|
||||||
|
_count=$(grep -o "$lib_path" "$ld_musl_file" | wc -l)
|
||||||
|
if [ "$_count" -ne 1 ]; then
|
||||||
|
echo "ERROR: Multiple entries of $lib_path."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -r "$testdir"
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in a new issue