[Buildroot] [PATCH] support/check-rpath: recognise PIE
Arnout Vandecappelle
arnout at mind.be
Tue Sep 26 22:40:25 UTC 2017
On 24-09-17 18:22, Yann E. MORIN wrote:
> We sanity-check the host executables that they have a correct RPATH
> pointing to the host libraries.
>
> This is currently done by looking for all files in $(HOST_DIR) that
> match the 'ELF executable' pattern (a bit more complex, but that's
> idea).
>
> However, when an executable is built with -fPIE of -fpie, it no longer
> appears to be an 'ELF executable', but it rather looks like an 'ELF
> sheard object' (like if it were an library.
>
> So, we miss those files.
>
> It turns out that the problem is a real one, because quite a few
> mainline distros, expecially those based on Debian for example, have
> already switched to generating PIE code by default, and thus we miss on
> a whole class of systems..
>
> We fix that by simply looking if we can find an ELF interpreter in each
> file. If we there is one, this is an ELF executable; if not, it may be
> anything else: we don't care (not even about ELF libraries).
>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
> Cc: Arnout Vandecappelle <arnout at mind.be>
Applied to master, thanks.
One remark: this will be slower than it was before. But since typically there
aren't so many files in host/{bin,sbin}, it's not a problem.
Regards,
Arnout
> ---
> support/scripts/check-host-rpath | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/support/scripts/check-host-rpath b/support/scripts/check-host-rpath
> index 74a25ba99c..169628decb 100755
> --- a/support/scripts/check-host-rpath
> +++ b/support/scripts/check-host-rpath
> @@ -18,6 +18,7 @@ main() {
>
> ret=0
> while read file; do
> + is_elf "${file}" || continue
> elf_needs_rpath "${file}" "${hostdir}" || continue
> check_elf_has_rpath "${file}" "${hostdir}" && continue
> if [ ${ret} -eq 0 ]; then
> @@ -26,14 +27,18 @@ main() {
> 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 '/^([^:]+):.*\<ELF\>.*\<executable\>.*/!d' \
> - -e 's//\1/' \
> - )
> + done < <( find "${hostdir}"/{bin,sbin} -type f 2>/dev/null )
>
> return ${ret}
> }
>
> +is_elf() {
> + local f="${1}"
> +
> + readelf -l "${f}" 2>/dev/null \
> + |grep -E 'Requesting program interpreter:' >/dev/null 2>&1
> +}
> +
> elf_needs_rpath() {
> local file="${1}"
> local hostdir="${2}"
>
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
More information about the buildroot
mailing list