diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/check-opcodes | 82 |
1 files changed, 24 insertions, 58 deletions
diff --git a/bin/check-opcodes b/bin/check-opcodes index 9ed2837..c7ab4a9 100755 --- a/bin/check-opcodes +++ b/bin/check-opcodes @@ -1,5 +1,8 @@ #!/bin/sh +# shellcheck disable=SC2086 + +# shellcheck source=conf/default.conf . "${0%/*}/../conf/default.conf" usage( ) { @@ -8,9 +11,8 @@ usage( ) { check_opcodes: [ -a <arch> ] <package> possible optons: - -h|--help: show this help page - -v|--verbose: verbose output - -d|--debug: enable debug output + -h|--help: Show this help page + -v|--verbose: Verbose output -a|--architecture: architecture family to check against, one of i486, i686, pentium4 @@ -19,31 +21,24 @@ EOF } VERBOSE=0 +EXIT_CODE=0 log( ) { if test $VERBOSE = 1; then - echo $* - fi -} - -DEBUG=0 -debug( ) { - if test $DEBUG = 1; then - echo $* + echo "$@" fi } -EXIT_CODE=0 err( ) { echo "ERROR: $*" EXIT_CODE=1 } tmp_dir=$(mktemp -d "${work_dir}/tmp.check-opcodes.XXXXXX") -trap "rm -rf --one-file-system '${tmp_dir:?}'" EXIT +trap 'rm -rf --one-file-system "${tmp_dir:?}"' EXIT ARCH=i686 -while getopts ":va:d-h-:" opt; do +while getopts ":va:h-:" opt; do case $opt in -) case "$OPTARG" in @@ -53,9 +48,6 @@ while getopts ":va:d-h-:" opt; do verbose) VERBOSE=1 ;; - debug) - DEBUG=1 - ;; *) echo "ERROR: Invalid option: --$OPTARG" >&2 usage @@ -68,9 +60,6 @@ while getopts ":va:d-h-:" opt; do v) VERBOSE=1 ;; - d) - DEBUG=1 - ;; a) ARCH=$OPTARG ;; @@ -96,52 +85,30 @@ case $ARCH in i486) OPCODE_ARGS='-r -a 486 -v' ;; - i686) + i686) OPCODE_ARGS='-s MMX -s SSE -s SSE2' ;; pentium4) OPCODE_ARGS='-s SSE3 -s SSSE3 -s AVX' ;; - *) + *) echo "ERROR: architecture must currently be one of i486 and i686" >&2 usage exit 1 esac -log "Checking package $PACKAGE" -log "Checking for architecture constraint: $ARCH ($OPCODE_ARGS)" +log "Checking for architecture: $ARCH ($OPCODE_ARGS)" bsdtar --no-fflags -x -C $tmp_dir -f $PACKAGE -for absfile in `find $tmp_dir -type f`; do - file=`basename $absfile` - ext=`echo $absfile | rev | cut -f 1 -d . | rev` - - case "$file" in - .PKGINFO|.BUILDINFO|.MTREE) - debug "Skipping $file (internal Archlinux file)" - continue - ;; - *.hpp|*.h|*.c|*.cpp|*.html|*.mo|*.po|*.svg|*.png|*.pl|*.pod|*.vim|*.js|*.cmake|*.xml|*.txt|*.rst|*.in|*.conf|*.[0123456789]) - debug "Skipping $file (extension is .$ext)" - continue - ;; - *) - # we cannot really ignore the file by extension - esac - - mimetype=`file -i $absfile | cut -f 2- -d : | cut -f 1 -d ';' | tr -d ' '` - case "$mimetype" in - application/x-sharedlib) - debug "Checking library/binary: $file" - ;; - *) - debug "Skipping $file (MIME type is $mimetype)" - continue - ;; - esac - +# shellcheck disable=SC2044 +for absfile in $(find $tmp_dir -name '*.so*' -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 - arch=`grep ^architecture $tmp_dir/$file.objdump | sed 's/^architecture: //g' | cut -f 1 -d ,` + file $absfile > $tmp_dir/$file.file + + arch=$(grep ^architecture $tmp_dir/$file.objdump | sed 's/^architecture: //g' | cut -f 1 -d ,) case $arch in i386:x86-64) arch='x86_64' @@ -153,10 +120,9 @@ for absfile in `find $tmp_dir -type f`; do arch='unknown' ;; esac - debug " Objdump architecture: $arch" + log " Objdump architecture: $arch" - readelf -a $absfile > $tmp_dir/$file.elf 2> $tmp_dir/$file.elferr - archelf=`grep '^ \+Class' $tmp_dir/$file.elf | cut -f 2 -d : | tr -d ' '` + archelf=$(grep '^ \+Class' $tmp_dir/$file.elf | cut -f 2 -d : | tr -d ' ') case $archelf in ELF64) archelf='x86_64' @@ -168,7 +134,7 @@ for absfile in `find $tmp_dir -type f`; do archelf='unknown' ;; esac - debug " Readelf architecture: $archelf" + log " Readelf architecture: $archelf" if test $arch != $archelf; then err "$file ambigous architecture information (objdump: $arch, ELF: $archelf)" @@ -180,7 +146,7 @@ for absfile in `find $tmp_dir -type f`; do fi objdump -M intel -d $absfile > $tmp_dir/$file.asm - bad_opcodes=`cat $tmp_dir/$file.asm | ${base_dir}/bin/opcode $OPCODE_ARGS -m 1 | wc -l` + bad_opcodes=$(${base_dir}/bin/opcode $OPCODE_ARGS -m 1 < $tmp_dir/$file.asm | wc -l) if test $bad_opcodes != 0; then case $ARCH in i486) |