#!/bin/sh objdir="$1" num_errors=0 check_syms() { global_count=0 entry_count=0 while read value type name; do if [ $value = "U" ]; then name=$type # undefined symbols must start with double-underscore if [ $(expr $name : '\(..\)') != "__" ]; then echo -e "$(basename $file):\tError: undefined reference $name doesn't start with \"__\"." num_errors=$(($num_errors + 1)) fi continue fi case "$type" in W) entry_count=$(($entry_count + 1)) ;; *) entry_count=$(($entry_count + 1)) if [ "$(expr $name : '\(..\)')" != "__" ]; then global_count=$(($global_count + 1)) fi ;; esac done if [ $entry_count -gt 1 -a $global_count -gt 0 ]; then echo -e "$(basename $file):\tError: detected $global_count strong " \ "global and $entry_count entry-points." num_errors=$(($num_errors + 1)) fi } check_file() { file=$1 size=$(readelf -S $file | \ (sz=0; while read line; do if echo $line | fgrep -q " .rodata"; then read sz rest break fi done; printf "%d" 0x$sz)) summands=$(readelf -s $file | fgrep " OBJECT " | tr -s ' ' | cut -f4 -d' ' | sed 's,$,+,')0 sum=$(($summands)) if [ $sum != $size ]; then echo -e "$(basename $file):\tError: sum of objects=$sum bytes, .rodata size=$size bytes" num_errors=$(($num_errors + 1)) fi tmp=$(tempfile -p syms) nm -g $file > $tmp check_syms < $tmp } do_checks() { echo "Note: 1 error expected in w_tgammal.o due to 64-byte alignment-padding." while read func_pattern src_file dst_file; do if [ "$(expr $dst_file : '.*\(S\)$')" = "S" ]; then objfile=$(expr $dst_file : '\(.*\)[.]S$') check_file $objdir/$objfile.o fi done } do_checks < import_file_list if [ $num_errors -gt 0 ]; then echo "FAILURE: Detected $num_errors error(s)." exit 1 fi echo SUCCESS exit 0