Makefile是这样子的,这就知道了会链接哪些库。 也就是别的库中是不是包含unresolved symbol。
LDFLAGS += -ldl LDFLAGS += -lpthread LDFLAGS += -lslap #LDFLAGS += -lcrypt EXTRALIBS += ../library.a EXTRALIBS += -lgcc_s EXTRALIBS += -lcrypto EXTRALIBS += -lssl EXTRALIBS += -lz EXTRALIBS += -L..
下面是这个高级的bash, 其中用到了一些bash的字符处理的用法,挺高级的
===============================================================
#!/bin/bash TEST_LIB=libtest.so MAKEFILE="./Makefile" nm $TEST_LIB |egrep '^[[:blank:]]+U ' |grep -v 'GLIBC' |grep -v '@@GCC_' >u_list #get shared lib list from Makefile #parse the "-lxxx" SHARED_LIB_NAMES= grep '^LDFLAGS' $MAKEFILE >shared_lib_list for i in `strings shared_lib_list`; do if [ ${i:0:2} = "-l" ]; then libname=${i#"-l"} if [ $libname != "dl" ] && [ $libname != "pthread" ];then SHARED_LIB_NAMES=$SHARED_LIB_NAMES" lib"$libname".so" fi fi done #parse the "-Lxxx" SHARED_LIB_DIRS="." grep 'EXTRALIBS' $MAKEFILE >shared_lib_list for i in `strings shared_lib_list`; do if [ ${i:0:2} = "-L" ]; then libdir=${i#"-L"} if [ $libdir != ".." ] ;then SHARED_LIB_DIRS=$SHARED_LIB_DIRS" "$libdir fi fi done rm shared_lib_list #get a lib whole name SHARED_LIB_LIST= for i in $SHARED_LIB_NAMES;do found=0 for j in $SHARED_LIB_DIRS; do if [ -n "$(find $j -maxdepth 1 -name $i)" ];then found=1 SHARED_LIB_LIST=$SHARED_LIB_LIST" "$j"/"$i break fi done if [ $found -eq 0 ];then echo "lib $i can't be found" fi done echo "the depending shared libraries are:" echo $SHARED_LIB_LIST echo "Now, resolving......" echo MISSING_SYMBOLS= for i in `strings u_list` ;do if [ $i != "U" ]; then found=0 for j in $SHARED_LIB_LIST; do if [ ! -e $j ] ;then echo "Warning, can't find $j" fi #find the defined symbol if [ -n "$(nm $j |grep "[^U] $i/>")" ]; then found=1 break fi done if [ $found -eq 0 ];then MISSING_SYMBOLS=$MISSING_SYMBOLS" "$i fi fi done rm u_list if [ -z "$MISSING_SYMBOLS" ];then echo "$TEST_LIB is safe for loading" else echo "$TEST_LIB will fail for loading, unresolved symbols are:" for i in $MISSING_SYMBOLS;do echo $i done fi