summaryrefslogtreecommitdiff
path: root/bin/check-opcodes
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-03-24 19:53:56 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2018-03-24 19:53:56 +0100
commit14d0abcfea146fbb5e4254d7b592d4666c8b8c44 (patch)
tree85455c27fac343e33c586ac3207e79bd5c50ef69 /bin/check-opcodes
parentc30de005f885202f24929bd4e3d3f5c885efbc0a (diff)
downloadbuilder-14d0abcfea146fbb5e4254d7b592d4666c8b8c44.tar.xz
reverted opcode to original (no shellcheck)
added a -d option to check-opcodes renamed pentium4 to pentium3 (because without SSE2 this is the architecture we are aiming at) be more tolerant on failing readelf and objdump handle binaries too
Diffstat (limited to 'bin/check-opcodes')
-rwxr-xr-xbin/check-opcodes86
1 files changed, 59 insertions, 27 deletions
diff --git a/bin/check-opcodes b/bin/check-opcodes
index bd96cc6..b8ad89c 100755
--- a/bin/check-opcodes
+++ b/bin/check-opcodes
@@ -2,32 +2,42 @@
# shellcheck disable=SC2086
-# shellcheck source=conf/default.conf
+# shellcheck source=../conf/default.conf
. "${0%/*}/../conf/default.conf"
usage( ) {
>&2 cat <<EOF
-check_opcodes: [ -a <arch> ] <package>
+check_opcodes: [options] [ -a <arch> ] <package>
possible optons:
-h|--help: Show this help page
- -v|--verbose: Verbose output
-a|--architecture: architecture family to check against, one of
- i486, i686, pentium4
+ i486, i686, pentium3 (meaning target architecture
+ the package should be runnable on)
+ -v|--verbose: Verbose output, print result of check for logs
+ -d|--debug: Debug output, used for development and testing
EOF
exit 1
}
VERBOSE=0
+DEBUG=0
EXIT_CODE=0
-log( ) {
+
+verbose( ) {
if test $VERBOSE = 1; then
echo "$@"
fi
}
+debug( ) {
+ if test $DEBUG = 1; then
+ echo "$@"
+ fi
+}
+
err( ) {
echo "ERROR: $*"
EXIT_CODE=1
@@ -38,7 +48,7 @@ trap 'rm -rf --one-file-system "${tmp_dir:?}"' EXIT
ARCH=i686
-while getopts ":va:h-:" opt; do
+while getopts ":vda:h-:" opt; do
case $opt in
-)
case "$OPTARG" in
@@ -48,6 +58,9 @@ while getopts ":va:h-:" opt; do
verbose)
VERBOSE=1
;;
+ debug)
+ DEBUG=1
+ ;;
*)
echo "ERROR: Invalid option: --$OPTARG" >&2
usage
@@ -60,6 +73,9 @@ while getopts ":va:h-:" opt; do
v)
VERBOSE=1
;;
+ d)
+ DEBUG=1
+ ;;
a)
ARCH=$OPTARG
;;
@@ -83,29 +99,42 @@ fi
OPCODE_ARGS=""
case $ARCH in
i486)
- OPCODE_ARGS='-r -a 486 -v'
+ OPCODE_ARGS='-r -a 386 -v'
;;
- i686)
- OPCODE_ARGS='-s MMX -s SSE -s SSE2'
+ i686)
+ OPCODE_ARGS='-s MMX -s SSE'
;;
- pentium4)
- OPCODE_ARGS='-s SSE3 -s SSSE3 -s AVX'
+ pentium3)
+ OPCODE_ARGS='-s SSE2 -s SSE3'
;;
- *)
+ *)
echo "ERROR: architecture must currently be one of i486 and i686" >&2
usage
exit 1
esac
-log "Checking for architecture: $ARCH ($OPCODE_ARGS)"
+debug "Unpacking $PACKAGE to $tmp_dir.."
bsdtar --no-fflags -x -C $tmp_dir -f $PACKAGE
+debug "Checking for architecture: $ARCH ($OPCODE_ARGS).."
+
# shellcheck disable=SC2044
-for absfile in $(find $tmp_dir -regextype grep -regex '.*\.so\(\.[0-9.]\+\)\?' -type f); do
- file=$(basename $absfile)
- log "Checking shared library: $file"
- readelf -a $absfile > $tmp_dir/$file.elf
- objdump -f $absfile > $tmp_dir/$file.objdump
+for absfile in $(find $tmp_dir \( -regextype grep -regex '.*\.so\(\.[0-9.]\+\)\?' -type f \) -o \( -executable -type f \) ); do
+ file=$(basename $absfile)
+ relfile=${absfile#$tmp_dir}
+ debug "Checking file: $relfile"
+ set +e
+ readelf -a $absfile > $tmp_dir/$file.elf 2>/dev/null
+ if test $? != 0; then
+ debug "readelf failed, ignoring file"
+ continue
+ fi
+ objdump -f $absfile > $tmp_dir/$file.objdump 2>/dev/null
+ if test $? != 0; then
+ debug "objdump failed, ignoring file"
+ continue
+ fi
+ set -e
file $absfile > $tmp_dir/$file.file
arch=$(grep ^architecture $tmp_dir/$file.objdump | sed 's/^architecture: //g' | cut -f 1 -d ,)
@@ -120,7 +149,7 @@ for absfile in $(find $tmp_dir -regextype grep -regex '.*\.so\(\.[0-9.]\+\)\?' -
arch='unknown'
;;
esac
- log " Objdump architecture: $arch"
+ debug " Objdump architecture: $arch"
archelf=$(grep '^ \+Class' $tmp_dir/$file.elf | cut -f 2 -d : | tr -d ' ')
case $archelf in
@@ -134,14 +163,14 @@ for absfile in $(find $tmp_dir -regextype grep -regex '.*\.so\(\.[0-9.]\+\)\?' -
archelf='unknown'
;;
esac
- log " Readelf architecture: $archelf"
+ debug " Readelf architecture: $archelf"
if test $arch != $archelf; then
- err "$file ambigous architecture information (objdump: $arch, ELF: $archelf)"
+ err "ERROR: $file ambigous architecture information (objdump: $arch, ELF: $archelf)"
fi
if test $arch = "x86_64"; then
- err "$file is a 64-bit library!"
+ err "ERROR: $file is a 64-bit library!"
continue
fi
@@ -150,18 +179,21 @@ for absfile in $(find $tmp_dir -regextype grep -regex '.*\.so\(\.[0-9.]\+\)\?' -
if test $bad_opcodes != 0; then
case $ARCH in
i486)
- err "$file is not built for plain i486 opcodes"
+ err "$relfile is not built for plain i486 opcodes"
;;
i686)
- err "$file contains MMX, SSE or SSE2 opcodes"
+ err "$relfile contains MMX, SSE or newer opcodes"
;;
- pentium4)
- err "$file contains SSE3 or newer opcodes"
+ pentium3)
+ err "$relfile contains SSE2 or newer opcodes"
;;
esac
+ if test $DEBUG = 1; then
+ ${base_dir}/bin/opcode $OPCODE_ARGS -B 2 -A 2 < $tmp_dir/$file.asm
+ fi
else
if test $VERBOSE = 1; then
- log "$file fullfills architecture constraint for $ARCH"
+ verbose "OK: $relfile fullfills architecture constraint for $ARCH"
fi
fi