#! /bin/sh -e SCRATCH=scratch/$(basename $0 .sh) if test "$(uname)" = FreeBSD; then echo "skipping on FreeBSD" exit 0 fi rm -rf ${SCRATCH} mkdir -p ${SCRATCH} mkdir -p ${SCRATCH}/libsA mkdir -p ${SCRATCH}/libsB cp main-scoped ${SCRATCH}/ cp libfoo-scoped.so ${SCRATCH}/libsA/ cp libbar-scoped.so ${SCRATCH}/libsB/ oldRPath=$(../src/patchelf --print-rpath ${SCRATCH}/main-scoped) if test -z "$oldRPath"; then oldRPath="/oops"; fi ../src/patchelf --set-rpath $oldRPath:$(pwd)/${SCRATCH}/libsA:$(pwd)/${SCRATCH}/libsB ${SCRATCH}/main-scoped # "main" contains libbar in its RUNPATH, but that's ignored when # resolving libfoo. So libfoo won't find libbar and this will fail. exitCode=0 (cd ${SCRATCH} && ./main-scoped) || exitCode=$? if test "$exitCode" = 46; then echo "expected failure" fi # So set an RUNPATH on libfoo as well. oldRPath=$(../src/patchelf --print-rpath ${SCRATCH}/libsA/libfoo-scoped.so) if test -z "$oldRPath"; then oldRPath="/oops"; fi ../src/patchelf --set-rpath $oldRPath:$(pwd)/${SCRATCH}/libsB ${SCRATCH}/libsA/libfoo-scoped.so exitCode=0 (cd ${SCRATCH} && ./main-scoped) || exitCode=$? if test "$exitCode" != 46; then echo "bad exit code!" exit 1 fi # Remove the libbar PATH from main using --shrink-rpath. ../src/patchelf --shrink-rpath ${SCRATCH}/main-scoped if ../src/patchelf --print-rpath ${SCRATCH}/main-scoped | grep /libsB; then echo "shrink failed" exit 1 fi # And it should still run. exitCode=0 (cd ${SCRATCH} && ./main-scoped) || exitCode=$? if test "$exitCode" != 46; then echo "bad exit code!" exit 1 fi