145 lines
2.5 KiB
Plaintext
145 lines
2.5 KiB
Plaintext
|
#!/bin/bash -e
|
||
|
# Copyright 1999-2015 Gentoo Foundation
|
||
|
# Distributed under the terms of the GNU General Public License v2
|
||
|
|
||
|
ROOT="/"
|
||
|
|
||
|
LDSO_CONF="/etc/ld.so.conf"
|
||
|
if [[ ! -e $LDSO_CONF ]]; then
|
||
|
echo "$LDSO_CONF not found" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
LDSO_CONF_DIR=$(dirname $LDSO_CONF)
|
||
|
|
||
|
VERBOSE=0
|
||
|
|
||
|
UPDATE_LINKS=1
|
||
|
|
||
|
get_options() {
|
||
|
while getopts "vnNXf:C:r:p" opt "$@"; do
|
||
|
case $opt in
|
||
|
v)
|
||
|
echo "ldconfig for musl in Gentoo"
|
||
|
VERBOSE=1
|
||
|
;;
|
||
|
r)
|
||
|
ROOT=$OPTARG
|
||
|
;;
|
||
|
f)
|
||
|
LDSO_CONF=$OPTARG
|
||
|
;;
|
||
|
X)
|
||
|
UPDATE_LINKS=0
|
||
|
;;
|
||
|
\?)
|
||
|
echo "Invalid option: -$opt" >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
n|N|C|p)
|
||
|
echo "Unimplemented option: -$opt" >&2
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if [[ $UPDATE_LINKS == 1 ]]; then
|
||
|
echo "Updating links is not implemented."
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
|
||
|
repeated() {
|
||
|
local l=$1
|
||
|
local drs="${@:2}"
|
||
|
for m in $drs; do
|
||
|
[[ $m == $l ]] && return 0
|
||
|
done
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
expand() {
|
||
|
# We are assuming the ld.so.conf's 'include' is not recursive
|
||
|
local f line l
|
||
|
local glob="$LDSO_CONF_DIR/$1"
|
||
|
local drs="${@:2} "
|
||
|
|
||
|
for f in $glob; do
|
||
|
[[ ! -f $f ]] && continue
|
||
|
while read line; do
|
||
|
line=${line%%#*}
|
||
|
line=${line//:/ }
|
||
|
line=${line//,/ }
|
||
|
for l in $line; do
|
||
|
#We must add this whether or not the directory exists
|
||
|
repeated $l $drs && continue
|
||
|
drs+=" $l "
|
||
|
done
|
||
|
done < $f
|
||
|
done
|
||
|
|
||
|
echo $drs
|
||
|
}
|
||
|
|
||
|
read_ldso_conf() {
|
||
|
local drs=" "
|
||
|
|
||
|
while read line; do
|
||
|
# Sanitize the line - see ldconfig(8) for delimiters
|
||
|
# Note: bash read turns tabs into spaces and read already
|
||
|
# delimits on newlines with the default $IFS
|
||
|
line=${line%%#*} # Remove comments
|
||
|
line=${line//:/ } # Change colon delimiter to space
|
||
|
line=${line//,/ } # Change comma delimiter to space
|
||
|
|
||
|
next=0
|
||
|
for l in $line; do
|
||
|
if [[ $next == 1 ]]; then
|
||
|
next=0
|
||
|
drs=$(expand $l $drs)
|
||
|
elif [[ $l == "include" ]]; then
|
||
|
next=1
|
||
|
else
|
||
|
# glibc's ldconfig silently skips non directories
|
||
|
if [[ -d $l ]]; then
|
||
|
repeated $l $drs && continue
|
||
|
drs+=" $l "
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
done < $1
|
||
|
|
||
|
echo $drs
|
||
|
}
|
||
|
|
||
|
sanitize() {
|
||
|
local drs=$@
|
||
|
|
||
|
repeated "/lib" $drs || drs="/lib $drs"
|
||
|
repeated "/usr/lib" $drs || drs="/usr/lib $drs"
|
||
|
|
||
|
echo $drs
|
||
|
}
|
||
|
|
||
|
get_options "$@"
|
||
|
drs=$(read_ldso_conf "$LDSO_CONF")
|
||
|
drs=$(sanitize $drs)
|
||
|
|
||
|
ARCH=@@ARCH@@
|
||
|
LDSO_PATH="/lib/ld-musl-${ARCH}.so.1"
|
||
|
if [[ ! -e $LDSO_PATH ]]; then
|
||
|
echo "$LDSO_PATH not found" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
LDSO_ARCH=$(basename $LDSO_PATH)
|
||
|
LDSO_NAME=${LDSO_ARCH%.so.1}
|
||
|
ETC_LDSO_PATH=/etc/${LDSO_NAME}.path
|
||
|
|
||
|
X=$(mktemp -p /tmp ${LDSO_NAME}.XXXXXX)
|
||
|
for d in $drs; do
|
||
|
echo $d >> $X
|
||
|
done
|
||
|
chmod 644 $X
|
||
|
mv $X $ETC_LDSO_PATH
|