support/check-rpath: recognise PIE
PATCH 1/1 support/check-rpath: recognise PIE
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).
--- support/scripts/check-host-rpath | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
support/scripts/check-host-rpath +9 -4
@@ -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}"
Signature · 1 line
2.11.0
Arnout Vandecappelle
AppliedPATCH 1/1 support/check-rpath: recognise PIE
Quoted 18 lines · Yann E. MORIN
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..
Quoted 6 lines
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" <[email protected]>Cc Arnout Vandecappelle <[email protected]>
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
Quoted 40 lines
--- support/scripts/check-host-rpath | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)support/scripts/check-host-rpath +9
-4@@ -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}"
Signature · 6 lines
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
PATCH 1/1 support/check-rpath: recognise PIE
In reply to Yann E. MORINQuoted 20 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Yann" == Yann E MORIN <[email protected]> writes:
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..
Quoted 6 lines
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" <[email protected]>Cc Arnout Vandecappelle <[email protected]>
Committed to 2017.08.x, thanks.
Signature · 1 line
Bye, Peter Korsgaard