@@ -58,6 +58,38 @@ HOST_EXCLUDEPATHS="/share/terminfo"
STAGING_EXCLUDEPATHS="/usr/include /usr/share/terminfo"
TARGET_EXCLUDEPATHS="/lib/firmware"
+patch_file() {
+ PATCHELF="${1}"
+ rootdir="${2}"
+ sanitize_extra_args="${3}"
+ file="${4}"
+
+ # check if it's an ELF file
+ rpath=$(${PATCHELF} --print-rpath "${file}" 2>&1)
+ if test $? -ne 0 ; then
+ return 0
+ fi
+
+ # make files writable if necessary
+ changed=$(chmod -c u+w "${file}")
+
+ # With per-package directory support, most RPATH of host
+ # binaries will point to per-package directories. This won't
+ # work with the --make-rpath-relative ${rootdir} invocation as
+ # the per-package host directory is not within ${rootdir}. So,
+ # we rewrite all RPATHs pointing to per-package directories so
+ # that they point to the global host directry.
+ changed_rpath=$(echo ${rpath} | sed "s@${PER_PACKAGE_DIR}/[^/]\+/host@${HOST_DIR}@")
+ if test "${rpath}" != "${changed_rpath}" ; then
+ ${PATCHELF} --set-rpath ${changed_rpath} "${file}"
+ fi
+
+ # call patchelf to sanitize the rpath
+ ${PATCHELF} --make-rpath-relative "${rootdir}" ${sanitize_extra_args[@]} "${file}"
+ # restore the original permission
+ test "${changed}" != "" && chmod u-w "${file}"
+}
+
main() {
local rootdir
local tree="${1}"
@@ -123,34 +155,12 @@ main() {
;;
esac
- find_args+=( "-type" "f" "-print" )
-
- while read file ; do
- # check if it's an ELF file
- rpath=$(${PATCHELF} --print-rpath "${file}" 2>&1)
- if test $? -ne 0 ; then
- continue
- fi
-
- # make files writable if necessary
- changed=$(chmod -c u+w "${file}")
-
- # With per-package directory support, most RPATH of host
- # binaries will point to per-package directories. This won't
- # work with the --make-rpath-relative ${rootdir} invocation as
- # the per-package host directory is not within ${rootdir}. So,
- # we rewrite all RPATHs pointing to per-package directories so
- # that they point to the global host directry.
- changed_rpath=$(echo ${rpath} | sed "s@${PER_PACKAGE_DIR}/[^/]\+/host@${HOST_DIR}@")
- if test "${rpath}" != "${changed_rpath}" ; then
- ${PATCHELF} --set-rpath ${changed_rpath} "${file}"
- fi
-
- # call patchelf to sanitize the rpath
- ${PATCHELF} --make-rpath-relative "${rootdir}" ${sanitize_extra_args[@]} "${file}"
- # restore the original permission
- test "${changed}" != "" && chmod u-w "${file}"
- done < <(find "${rootdir}" ${find_args[@]})
+ find_args+=( "-type" "f" "-print0" )
+
+ export -f patch_file
+ # Limit the number of cores used
+ procs=$(echo -e "$(($(nproc)-2)) \n 1" | sort -n | tail -n1)
+ find "${rootdir}" ${find_args[@]} | xargs -0 -r -P ${procs} -I {} bash -c "patch_file '${PATCHELF}' '${rootdir}' '${sanitize_extra_args}' $@" _ {}
# Restore patched patchelf utility
test "${tree}" = "host" && mv "${PATCHELF}.__to_be_patched" "${PATCHELF}"
Using "xargs" instead of "while read" loop allows for the patching of files to be parallelized, significantly reducing the amount of time it takes to fix all the paths.On a larger RFS(~300MB) this script was taking 5 minutes, it now only takes about 30s on a 12 core machine Signed-off-by: Victor Dumas <dumasv.dev@gmail.com> --- support/scripts/fix-rpath | 66 ++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 28 deletions(-)