#!/usr/bin/env bash # This script scans $(HOST_DIR)/{bin,sbin} for all ELF files, and checks # they have an RPATH to $(HOST_DIR)/lib if they need libraries from # there. # Override the user's locale so we are sure we can parse the output of # readelf(1) and file(1) export LC_ALL=C main() { local pkg="${1}" local hostdir="${2}" local file ret # Remove duplicate and trailing '/' for proper match hostdir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${hostdir}" )" ret=0 while read file; do elf_needs_rpath "${file}" "${hostdir}" || continue check_elf_has_rpath "${file}" "${hostdir}" && continue if [ ${ret} -eq 0 ]; then ret=1 printf "***\n" printf "*** ERROR: package %s installs executables without proper RPATH:\n" "${pkg}" fi printf "*** %s\n" "${file}" done < <( find "${hostdir}"/{bin,sbin} -type f -exec file {} + 2>/dev/null \ |sed -r -e '/^([^:]+):.*\.*\.*/!d' \ -e 's//\1/' \ ) return ${ret} } elf_needs_rpath() { local file="${1}" local hostdir="${2}" local lib while read lib; do [ -e "${hostdir}/lib/${lib}" ] && return 0 done < <( readelf -d "${file}" \ |sed -r -e '/^.* \(NEEDED\) .*Shared library: \[(.+)\]$/!d;' \ -e 's//\1/;' \ ) return 1 } check_elf_has_rpath() { local file="${1}" local hostdir="${2}" local rpath dir while read rpath; do for dir in ${rpath//:/ }; do # Remove duplicate and trailing '/' for proper match dir="$( sed -r -e 's:/+:/:g; s:/$::;' <<<"${dir}" )" [ "${dir}" = "${hostdir}/lib" -o "${dir}" = "\$ORIGIN/../lib" ] && return 0 done done < <( readelf -d "${file}" \ |sed -r -e '/.* \(R(UN)?PATH\) +Library r(un)?path: \[(.+)\]$/!d' \ -e 's//\3/;' \ ) return 1 } main "${@}"