如何确定链接实际需要哪些目标文件?

时间:2010-07-09 01:29:09

标签: c linker compilation

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

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

如果它有用,我很乐意提供进一步的细节。提前谢谢。

2 个答案:

答案 0 :(得分:3)

当遇到这种情况时,我或者简单地将最后的链接命令剥离出所有对象,然后重新添加直到它工作,或者处理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函数。

答案 1 :(得分:2)

看看你是否可以让你的死码剥离器告诉你它在链接过程中消除了哪些功能/符号。然后,您将知道可以安全删除的源代码。 GNU链接器的-map选项在这方面可能很有用。例如,您可以在没有死代码剥离的情况下链接一次,然后再次使用死代码剥离进行链接并比较输出映射文件。

如果最多只有40个源文件,这个优化真的值得你花时间吗?