其他分享
首页 > 其他分享> > c – nm获取整个存档的未定义符号,而不是单独的目标文件

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

作者:互联网

我有两个文件:

foo.c:int foo(){extern int bar();返回栏(); }

bar.c:int bar(){extern int missing();返回失踪()42; }

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

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

我想从整个存档中找到丢失(未定义)的符号.但我仍然得到未定义的条形,而它存在于foo.o中:

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

如何从输出中省略bar并仅显示缺失?

解决方法:

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

ar -x libfoo.a      # unpack libfoo.a
ld -r -o tmp.o *.o  # link all objects into tmp.o
nm -u tmp.o         # find undefined symbols in tmp.o
rm *.o              # remove tmp.o as well as the contents of libfoo.a

当链接器解析它在-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)

标签:c-3,c,gcc,static-libraries
来源: https://codeday.me/bug/20190829/1759507.html