endef
GLOBAL_INSTRUMENTATION_HOOKS += step_pkg_size
+# This hook checks that host packages that need libraries that we build
+# have a proper DT_RPATH or DT_RUNPATH tag
+define check_host_rpath
+ $(if $(filter install-host,$(2)),\
+ $(if $(filter end,$(1)),support/scripts/check-host-rpath $(3) $(HOST_DIR)))
+endef
+GLOBAL_INSTRUMENTATION_HOOKS += check_host_rpath
+
# User-supplied script
ifneq ($(BR2_INSTRUMENTATION_SCRIPTS),)
define step_user
--- /dev/null
+#!/usr/bin/env bash
+
+# This script scans $(HOST_DIR)/{bin,sbin} for all ELF files, and checks
+# they have an RPATH to $(HOST_DIR)/usr/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;' <<<"${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}"/usr/{bin,sbin} -type f -exec file {} + 2>/dev/null \
+ |sed -r -e '/^([^:]+):.*\<ELF\>.*\<executable\>.*/!d' \
+ -e 's//\1/' \
+ )
+
+ return ${ret}
+}
+
+elf_needs_rpath() {
+ local file="${1}"
+ local hostdir="${2}"
+ local lib
+
+ while read lib; do
+ [ -e "${hostdir}/usr/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}/usr/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 "${@}"