case "$(uname -s)" in
Linux)
libscan() {
[ "${1}" ] || return 1
(
echo /lib/ld-linux.so.2
while [ "${1}" ]
do
if [ -x "${1}" ]
then
ldd "${1}" | sed -e '/ => /!d; s/^.* => //; s/ (0x[0-9a-f]*)$//; /^[ ]*$/d'
fi
shift
done
) | sort | uniq
}
populate_chroot() {
dest="${1}"; shift
bins="${@}"
libs="$(libscan "${@}")"
temp="$(mktemp -d "${dest}/.chroot.XXXXXXXX")"
[ -d "${temp}" ] || return 1
cp -p ${bins} ${libs} ${temp}/
echo "$(basename "${temp}")"
}
chroot_bin() {
tgt="${1}"; shift
bin="$(which "${1}")"; shift
[ -d "${tgt}" -a -x "${bin}" ] || return 1
tmp="$(populate_chroot "${tgt}" "${bin}")"
exe="$(basename "${bin}")"
( sleep 1; rm -Rf "${tgt}/${tmp}" ) &
LD_LIBRARY_PATH="/${tmp}/" /usr/bin/chroot "${tgt}" "/${tmp}/ld-linux.so.2" "/${tmp}/${exe}" "${@}"
}
;;
FreeBSD)
libscan() {
[ "${1}" ] || return 1
(
echo "/libexec/ld-elf.so.1"
while [ "${1}" ]
do
if [ -x "${1}" ]
then
ldd "${1}" | sed -e '/ => /!d; s/^.* => //; s/ (0x[0-9a-f]*)$//; /^[ ]*$/d'
fi
shift
done
) | sort | uniq
}
populate_chroot() {
dest="${1}"; shift
bins="${@}"
libs="$(libscan "${@}")"
temp="$(mktemp -d "/tmp/.chroot.XXXXXXXX")"
[ -d "${temp}" ] || return 1
mkdir -p "${temp}/.run"
cp -p ${bins} ${libs} "${temp}/.run/"
mkdir -p "${temp}/libexec"
ln -f "${temp}/.run/ld-elf.so.1" "${temp}/libexec/"
echo "${temp}"
}
chroot_bin() {
tgt="${1}"; shift
bin="$(which "${1}")"; shift
[ -d "${tgt}" -a -x "${bin}" ] || return 1
tmp="$(populate_chroot "${tgt}" "${bin}")"
exe="$(basename "${bin}")"
mount -t unionfs "${tmp}" "${tgt}"
( sleep 1; umount -f "${tgt}" ) &
LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@}"
}
;;
esac
Note: You are viewing an old version of this page. View the current version.
