nm获取整个存档的未定义符号,而不是单独的目标文件

时间:2016-03-16 19:15:30

标签: c++ c gcc static-libraries

我有两个文件:

foo.cint foo() { extern int bar(); return bar(); }

bar.cint bar() { extern int missing(); return missing() + 42; }

我编译它们并组成.a静态lib:

$ gcc -c foo.c bar.c
$ ar rcs libfoobar.a foo.o bar.o

我想从整个存档中找到哪些符号缺失(未定义)。但我仍然将bar定义为未定义,而它存在于foo.o

$ nm -u libfoobar.a
foo.o:
    U bar
bar.o:
    U missing

如何从输出中省略bar并仅显示missing

2 个答案:

答案 0 :(得分:3)

将整个档案链接到一个目标文件中并检查:

-r

这会产生所需的结果,因为链接器会解析它在# use: script libfoo.a tmp=${TEMPDIR:-/tmp}/undefsyms.$$ mkdir $tmp cp $1 $tmp/lib.a cd $tmp ar -x lib.a ld -r -o $$.o *.o nm -u $$.o rm * cd .. rmdir $tmp 请求的部分链接中可以找到的所有符号。

请注意,当前工作目录不应包含任何目标文件以获得最佳效果。

您可以使用以下脚本获得更一致的结果:

join

如果您为此目的解压缩并链接库感到不舒服,请使用此脚本使用命令行实用程序使用if [ $# -lt 1 ] then echo Usage: $0 library.a exit 1 fi lib=$1 postproc() { cut -w -f 2-3 | sort -u; } allsyms() { nm -g -P -A $lib | postproc; } undefsyms() { nm -g -P -A -u $lib | postproc; } defsyms() { allsyms | grep -v 'U$'; } comm -2 -3 <(undefsyms | cut -w -f 1) <(defsyms | cut -w -f 1) 实用程序计算所需信息:

{{1}}

答案 1 :(得分:2)

档案工具只是创建......好吧,档案。它不是链接器。引用由您的链接器解析,此过程将查找foo.obar的引用,以便在bar.o中解析。归档程序不能这样做,nm也不会这样做 - 它只是独立地在归档内的每个对象上运行。