diff options
Diffstat (limited to 'tests/basic/symbol-check.sh')
| -rwxr-xr-x | tests/basic/symbol-check.sh | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/tests/basic/symbol-check.sh b/tests/basic/symbol-check.sh new file mode 100755 index 00000000000..0f8243ca731 --- /dev/null +++ b/tests/basic/symbol-check.sh @@ -0,0 +1,114 @@ +#!/bin/bash + +syscalls=$'access\nchmod\nchown\nclose\nclosedir\ncreat64\n\ +fallocate64\nfchmod\nfchown\nfdatasync\nfgetxattr\nflistxattr\n\ +fremovexattr\nfsetxattr\nfsync\nftruncate64\n__fxstat64\n\ +__fxstatat64\nlchown\nlgetxattr\nlinkat\nllistxattr\nlremovexattr\n\ +lseek64\nlsetxattr\n__lxstat64\nmkdir\nmkdirat\nopenat64\nopendir\n\ +pread64\npwrite64\npreadv64\npwritev64\nread\nreaddir64\nreadlink\n\ +readv\nrename\nrmdir\n statvfs64\nsymlink\n\truncate64\nunlink\n\ +utimeswrite\nwritev\n\__xmknod\n__xstat64' + +syscalls32=$'creat\nfallocate\nftruncate\n__fxstat\n__fxstatat\n\ +lseek\n__lxstat\nopenat\nreaddir\nstatvfs\ntruncate\nstat\n\ +preadv\npwritev\npread\npwrite' + +glibccalls=$'tmpfile' + +exclude_files=$'/libglusterfs/src/.libs/libglusterfs_la-syscall.o\n\ +/libglusterfs/src/.libs/libglusterfs_la-gen_uuid.o\n\ +/contrib/fuse-util/fusermount.o\n\ +/contrib/fuse-util/mount_util.o\n\ +/contrib/fuse-util/mount-common.o\n\ +/xlators/mount/fuse/src/.libs/mount.o\n\ +/xlators/mount/fuse/src/.libs/mount-common.o\n\ +/xlators/features/qemu-block/src/.libs/block.o\n\ +/xlators/features/qemu-block/src/.libs/cutils.o\n\ +/xlators/features/qemu-block/src/.libs/oslib-posix.o' + +function main() +{ + for exclude_file in ${exclude_files}; do + if [[ ${1} = *${exclude_file} ]]; then + exit 0 + fi + done + + local retval=0 + local t + t=$(nm "${1}" | grep " U " | sed -e "s/ //g" -e "s/ U //g") + + for symy in ${t}; do + + for symx in ${syscalls}; do + + if [[ ${symx} = "${symy}" ]]; then + + case ${symx} in + "creat64") sym="creat";; + "fallocate64") sym="fallocate";; + "ftruncate64") sym="ftruncate";; + "lseek64") sym="lseek";; + "preadv64") sym="preadv";; + "pwritev64") sym="pwritev";; + "pread64") sym="pread";; + "pwrite64") sym="pwrite";; + "openat64") sym="openat";; + "readdir64") sym="readdir";; + "truncate64") sym="truncate";; + "__statvfs64") sym="statvfs";; + "__fxstat64") sym="fstat";; + "__fxstatat64") sym="fstatat";; + "__lxstat64") sym="lstat";; + "__xmknod") sym="mknod";; + "__xstat64") sym="stat";; + *) sym=${symx};; + esac + + echo "${1} should call sys_${sym}, not ${sym}" >&2 + retval=1 + fi + + done + + for symx in ${syscalls32}; do + + if [[ ${symx} = "${symy}" ]]; then + + echo "${1} was not compiled with -D_FILE_OFFSET_BITS=64" >&2 + retval=1 + fi + done + + symy_glibc=$(echo "${symy}" | sed -e "s/@@GLIBC.*//g") + # Eliminate false positives, check if we have a GLIBC symbol in 'y' + if [[ ${symy} != "${symy_glibc}" ]]; then + for symx in ${glibccalls}; do + + if [[ ${symx} = "${symy_glibc}" ]]; then + + case ${symx} in + "tmpfile") alt="mkstemp";; + *) alt="none";; + esac + + if [[ ${alt} = "none" ]]; then + echo "${1} should not call ${symy_glibc}"; + else + echo "${1} should use ${alt} instead of ${symy_glibc}" >&2; + fi + + retval=1 + fi + done + fi + + done + + if [ ${retval} = 1 ]; then + touch ./.symbol-check-errors + fi + exit ${retval} +} + +main "$@" |
