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.