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

Joe*_*oey 5 c linker compilation

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

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

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

Ric*_*son 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
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 函数没有被使用。