From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v4 2/2] Makefile: add check of binaries architecture
Date: Sun, 12 Mar 2017 23:33:48 +0100 [thread overview]
Message-ID: <20170312223348.GJ3739@free.fr> (raw)
In-Reply-To: <1489357076-31990-2-git-send-email-thomas.petazzoni@free-electrons.com>
Thomas, All,
On 2017-03-12 23:17 +0100, Thomas Petazzoni spake thusly:
> As shown recently by the firejail example, it is easy to miss that a
> package builds and installs binaries without actually cross-compiling
> them: they are built for the host architecture instead of the target
> architecture.
>
> This commit adds a small helper script, check-bin-arch, called as a
> GLOBAL_INSTRUMENTATION_HOOKS at the end of the target installation of
> each package, to verify that the files installed by this package have
> been built for the correct architecture.
>
> Being called as a GLOBAL_INSTRUMENTATION_HOOKS allows the build to error
> out right after the installation of the faulty package, and therefore
> get autobuilder error detection properly assigned to this specific
> package.
>
> Example output with the firejail package enabled, when building for an
> ARM target:
>
> ERROR: ./usr/lib/firejail/libconnect.so (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
Of course, this no loner matches the new format in this v4. ;-)
> ERROR: ./usr/bin/firejail (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/lib/firejail/libtrace.so (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/lib/firejail/libtracelog.so (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/lib/firejail/ftee (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/lib/firejail/faudit (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/bin/firemon (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> ERROR: ./usr/bin/firecfg (from firejail) architecture is Advanced Micro Devices X86-64, should be ARM
> package/pkg-generic.mk:306: recipe for target '/home/thomas/projets/buildroot/output/build/firejail-0.9.44.8/.stamp_target_installed' failed
> make[1]: *** [/home/thomas/projets/buildroot/output/build/firejail-0.9.44.8/.stamp_target_installed] Error 1
>
> Many thanks to Yann E. Morin and Arnout Vandecappelle for their reviews
> and suggestions.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Except for the nit in the commit log:
Acked-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Of course, there are a few things I'd have done slightly differently.
But I did not do it, you did, so that's fine! ;-)
Let's see what autobuilders have to say about this, now! Muhahaha! :-]
Regards,
Yann E. MORIN.
> ---
> Changes since v3:
> - Pass TARGET_READELF instead of TARGET_CROSS, suggested by Arnout
> - Pass BR2_READELF_ARCH_NAME to the script, instead of parsing the BR
> config file. Suggested by Yann.
> - Use LC_ALL=C when calling readelf, to avoid surprises. Suggested by
> Yann.
> - Reword the error message, according to Yann suggestion.
>
> Changes since v2:
> - Moved as a per-package check, so that we detect the faulty package
> earlier, and get correct autobuilder notifications.
> - Use TARGET_DIR from the environment and use BR2_CONFIG to retrieve
> the value of BR2_READELF_ARCH_NAME.
> - Skip firmware files in /lib/firmware and /usr/lib/firmware.
> - Simply ignore files for which readelf returned an empty Machine
> field, as a way to quickly detect non-ELF files.
>
> Changes since v1:
> - Following Yann E. Morin's comment, restrict the check to bin, lib,
> sbin, usr/bin, usr/lib and usr/sbin, in order to avoid matching
> firmware files that could use the ELF format but be targeted for
> other architectures.
> ---
> package/pkg-generic.mk | 11 +++++++++++
> support/scripts/check-bin-arch | 39 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 50 insertions(+)
> create mode 100755 support/scripts/check-bin-arch
>
> diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk
> index e8a8021..73e1bc2 100644
> --- a/package/pkg-generic.mk
> +++ b/package/pkg-generic.mk
> @@ -87,6 +87,17 @@ define step_pkg_size
> endef
> GLOBAL_INSTRUMENTATION_HOOKS += step_pkg_size
>
> +# Relies on step_pkg_size, so must be after
> +define check_bin_arch
> + $(if $(filter end-install-target,$(1)-$(2)),\
> + support/scripts/check-bin-arch $(3) \
> + $(BUILD_DIR)/packages-file-list.txt \
> + $(TARGET_READELF) \
> + $(BR2_READELF_ARCH_NAME))
> +endef
> +
> +GLOBAL_INSTRUMENTATION_HOOKS += check_bin_arch
> +
> # 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
> diff --git a/support/scripts/check-bin-arch b/support/scripts/check-bin-arch
> new file mode 100755
> index 0000000..63d941f
> --- /dev/null
> +++ b/support/scripts/check-bin-arch
> @@ -0,0 +1,39 @@
> +#!/bin/bash
> +
> +PACKAGE=$1
> +PACKAGE_FILE_LIST=$2
> +TARGET_READELF=$3
> +READELF_ARCH_NAME=$4
> +
> +exitcode=0
> +
> +PKG_FILES=$(sed -r -e "/^${PACKAGE},(.+)$/!d; s//\1/;" ${PACKAGE_FILE_LIST})
> +
> +for f in ${PKG_FILES} ; do
> + # Skip firmware files, they could be ELF files for other
> + # architectures
> + if [[ "${f}" =~ ^\./(usr/)?lib/firmware/.* ]]; then
> + continue
> + fi
> +
> + # Get architecture using readelf
> + arch=$(LC_ALL=C ${TARGET_READELF} -h "${TARGET_DIR}/${f}" 2>&1 | \
> + sed -r -e '/^ Machine: +(.+)/!d; s//\1/;')
> +
> + # If no architecture found, assume it was not an ELF file
> + if test "${arch}" = "" ; then
> + continue
> + fi
> +
> + # Architecture is correct
> + if test "${arch}" = "${READELF_ARCH_NAME}" ; then
> + continue
> + fi
> +
> + printf 'ERROR: architecture for %s (from %s) is %s, should be %s\n' \
> + "${f}" "${PACKAGE}" "${arch}" "${READELF_ARCH_NAME}"
> +
> + exitcode=1
> +done
> +
> +exit ${exitcode}
> --
> 2.7.4
>
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
next prev parent reply other threads:[~2017-03-12 22:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-12 22:17 [Buildroot] [PATCH v4 1/2] arch: add BR2_READELF_ARCH_NAME hidden config option Thomas Petazzoni
2017-03-12 22:17 ` [Buildroot] [PATCH v4 2/2] Makefile: add check of binaries architecture Thomas Petazzoni
2017-03-12 22:33 ` Yann E. MORIN [this message]
2017-03-13 22:19 ` Arnout Vandecappelle
2017-03-13 22:26 ` Yann E. MORIN
2017-03-13 22:15 ` [Buildroot] [PATCH v4 1/2] arch: add BR2_READELF_ARCH_NAME hidden config option Arnout Vandecappelle
-- strict thread matches above, loose matches on Subject: below --
2017-03-19 13:07 Thomas Petazzoni
2017-03-19 13:07 ` [Buildroot] [PATCH v4 2/2] Makefile: add check of binaries architecture Thomas Petazzoni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170312223348.GJ3739@free.fr \
--to=yann.morin.1998@free.fr \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.