Joe*_*oey 5 c linker compilation
我不得不修改一些在C项目中使用的开源代码.我不想使用修改后的代码构建库,而是希望从我自己的源代码中编译和构建可执行文件,并结合修改后的开源代码.目标是拥有一个可以分发的独立包.我可以使用GNU构建工具正常工作并成功构建我的可执行文件.
现在我想减少我正在构建和链接的代码量.有没有一种简单的方法来确定我实际需要编译哪些开源文件?比方说,开源软件包中包含40个.c文件.我猜我的代码只使用(或导致使用)这些文件的20-ish.目前我正在编译所有这些并将所有内容丢给链接器.必须有一种聪明(简单?)的方法来确定我真正需要哪些,对吧?
如果它有用,我很乐意提供进一步的细节.提前致谢.
面对这个问题时,我要么简单地采用最终的链接命令来删除所有对象,然后添加回来直到它起作用,要么处理 nm 命令的输出。
查看 nm 的输出:
$ nm *.o
a.o:
00000000 T a
U aa
b.o:
00000000 T b
t.o:
U a
U b
00000000 T main
ua.o:
00000000 T ua
ub.o:
00000000 T ub
Run Code Online (Sandbox Code Playgroud)
所以我创建了以下 awk 脚本
# find-unused.awk
BEGIN {req["main"]="crt"}
/\.o\:$/{
gsub(/\:/,"");
modulename=$0;
}
$1=="U"{
req[$2] = modulename;
}
/[0-9,a-f].* T/{
def[$3] = modulename;
}
END{
print "modules referenced:"
for (i in req)
{
if (def[i] != "")
print " "def[i];
}
print "functions not found"
for (i in req)
{
if (def[i] == "")
print " "i;
}
}
Run Code Online (Sandbox Code Playgroud)
然后这样称呼它;
$ nm *.o|awk -f find-unused.awk
Run Code Online (Sandbox Code Playgroud)
它告诉我:
modules referenced:
t.o
a.o
b.o
functions not found
aa
Run Code Online (Sandbox Code Playgroud)
这是正确的 - 因为上面示例中的 ua 和 ub 函数没有被使用。
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |