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