Elliott Mitchell
2021-Jan-04 06:12 UTC
[Pkg-xen-devel] [PATCH 01/16] d/shuffle-binaries: Fix binary shuffling script for cross-building
`ldd` doesn't work with cross-builds, so use `file` to detect scripts and `strings | grep` for identifying linked libraries. Even though debhelper depends on file, make the requirement explicit. Heavily simplify script inner loop. While the core of that inner loop was often executed only once, it is best to shrink inner loops. Signed-off-by: Elliott Mitchell <ehem+debian at m5p.com> --- debian/control | 1 + debian/shuffle-binaries | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/debian/control b/debian/control index 942bf6711c..1f88f1a40f 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Build-Depends: debhelper (>= 10), dh-exec, dpkg-dev (>= 1.16.0~), + file, rdfind, lsb-release, flex, bison, diff --git a/debian/shuffle-binaries b/debian/shuffle-binaries index 8a823da10b..d7a832bbe0 100755 --- a/debian/shuffle-binaries +++ b/debian/shuffle-binaries @@ -23,28 +23,29 @@ cd=/usr/lib/xen-common/bin mkdir -p "$t/$vd" for binary in `find $t/usr/{bin,sbin} -type f`; do - reason='' - { ldd "$binary" ||: ; } | { fgrep '=>' ||: ; } \ - | ( - while read lib dummy; do + # filter for executables (ignore scripts) + file "$binary" | grep -q -eELF.\\+version.\\+interpreter || continue + + # ldd doesn't work for cross-building + reason=$( + strings "$binary" | grep -e^lib.\\+\\.so\\.\[.0-9\]\\+\$ | \ + while read lib; do lib=${lib%.so.*} - if grep -F "usr/lib/*/$lib.so.*" $list >/dev/null; then - reason+=" $lib" + if grep -q -F "usr/lib/*/$lib.so.*" $list; then + printf " %s" "$lib" fi done + ) - if [ "x$reason" = x ]; then - exit 0 - fi + # if no reason, then skip + [ -n "$reason" ] || continue - echo "shuffling $binary $reason" + echo "shuffling $binary$reason" - leaf=${binary##*} - mv -v $binary $t/$vd/$leaf - ln -vs $cd/xen-utils-wrapper $binary + mv -v "$binary" "$t/$vd/" + ln -vs "$cd/xen-utils-wrapper" "$binary" - touch debian/shuffle-binaries.stamp - ) + touch "$0.stamp" done if [ ! -e "$0.stamp" ]; then -- -- (\___(\___(\______ --=> 8-) EHM <=-- ______/)___/)___/) \BS ( | ehem+sigmsg at m5p.com PGP 87145445 | ) / \_CS\ | _____ -O #include <stddisclaimer.h> O- _____ | / _/ 8A19\___\_|_/58D2 7E3D DDF4 7BA6 <-PGP-> 41D1 B375 37D0 8714\_|_/___/5445
Hans van Kranenburg
2021-Jan-15 21:05 UTC
[Pkg-xen-devel] [PATCH 01/16] d/shuffle-binaries: Fix binary shuffling script for cross-building
On 7/17/20 8:37 AM, Elliott Mitchell wrote:> `ldd` doesn't work with cross-builds, so use `file` to detect scripts > and `strings | grep` for identifying linked libraries. Even though > debhelper depends on file, make the requirement explicit. > > Heavily simplify script inner loop. While the core of that inner loop > was often executed only once, it is best to shrink inner loops.Ok, fix for cross-build, and it IMO certainly makes the script more readable. Acked-by: Hans van Kranenburg <hans at knorrie.org>> Signed-off-by: Elliott Mitchell <ehem+debian at m5p.com> > --- > debian/control | 1 + > debian/shuffle-binaries | 31 ++++++++++++++++--------------- > 2 files changed, 17 insertions(+), 15 deletions(-) > > diff --git a/debian/control b/debian/control > index 942bf6711c..1f88f1a40f 100644 > --- a/debian/control > +++ b/debian/control > @@ -8,6 +8,7 @@ Build-Depends: > debhelper (>= 10), > dh-exec, > dpkg-dev (>= 1.16.0~), > + file, > rdfind, > lsb-release, > flex, bison, > diff --git a/debian/shuffle-binaries b/debian/shuffle-binaries > index 8a823da10b..d7a832bbe0 100755 > --- a/debian/shuffle-binaries > +++ b/debian/shuffle-binaries > @@ -23,28 +23,29 @@ cd=/usr/lib/xen-common/bin > mkdir -p "$t/$vd" > > for binary in `find $t/usr/{bin,sbin} -type f`; do > - reason='' > - { ldd "$binary" ||: ; } | { fgrep '=>' ||: ; } \ > - | ( > - while read lib dummy; do > + # filter for executables (ignore scripts) > + file "$binary" | grep -q -eELF.\\+version.\\+interpreter || continue > + > + # ldd doesn't work for cross-building > + reason=$( > + strings "$binary" | grep -e^lib.\\+\\.so\\.\[.0-9\]\\+\$ | \ > + while read lib; do > lib=${lib%.so.*} > - if grep -F "usr/lib/*/$lib.so.*" $list >/dev/null; then > - reason+=" $lib" > + if grep -q -F "usr/lib/*/$lib.so.*" $list; then > + printf " %s" "$lib" > fi > done > + ) > > - if [ "x$reason" = x ]; then > - exit 0 > - fi > + # if no reason, then skip > + [ -n "$reason" ] || continue > > - echo "shuffling $binary $reason" > + echo "shuffling $binary$reason" > > - leaf=${binary##*} > - mv -v $binary $t/$vd/$leaf > - ln -vs $cd/xen-utils-wrapper $binary > + mv -v "$binary" "$t/$vd/" > + ln -vs "$cd/xen-utils-wrapper" "$binary" > > - touch debian/shuffle-binaries.stamp > - ) > + touch "$0.stamp" > done > > if [ ! -e "$0.stamp" ]; then >