gpt4 book ai didi

c - 如何确定哪些目标文件实际上是链接所必需的?

转载 作者:太空狗 更新时间:2023-10-29 15:03:04 24 4
gpt4 key购买 nike

我必须修改一些开源代码才能在 C 项目中使用。我不想从修改后的代码构建一个库,而是想从我自己的源代码中结合修改后的开源代码编译和构建一个可执行文件。目标是拥有一个可以分发的独立包。我可以使用 GNU 构建工具让它正常工作,并成功构建了我的可执行文件。

现在我想减少正在构建和链接的代码量。有没有一种简单的方法可以确定我实际需要编译哪些开源文件?开源包中有 40 个 .c 文件。我猜我的代码只使用(或导致使用)这些文件中的 20 个。目前我正在编译所有这些并将所有内容都扔给链接器。必须有一种聪明(而且简单?)的方法来确定我实际需要哪些,对吧?

如果有帮助,我很乐意提供更多详细信息。提前致谢。

最佳答案

当遇到这个问题时,我要么简单地采用最终链接命令删除所有对象然后重新添加直到它起作用,要么处理 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

所以我创建了以下 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;
}
}

然后这样调用;

$ nm *.o|awk -f find-unused.awk

它告诉我:

modules referenced:
t.o
a.o
b.o
functions not found
aa

这是正确的 - 因为没有使用上面示例中的 ua 和 ub 函数。

关于c - 如何确定哪些目标文件实际上是链接所必需的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com