Note: You are viewing an old version of this page. View the current version.

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}"; rm -Rf "${tmp}" ) &
    LD_LIBRARY_PATH="/.run" /usr/sbin/chroot "${tgt}" "/.run/${exe}" "${@}"
  }
  ;;
esac