1

我正在一个 C 项目中工作,该项目在其构建系统中调用 ld,如下所示:

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a a.o b.o c.o

但是我遇到了这个命令行大小的问题(大约 32,000 个字符以及所需的所有目标文件 - 并使用 cygwin)所以我开始研究对其进行一些修改。其中之一是删除相同对象的第二个引用。像这样:

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a

然而,这打破了一切。我得到了很多很多未定义的引用。

为什么会这样?这两个调用有什么区别?我正在阅读 ld 的文档,但到目前为止还不好。

奖金

如果你足够幸运,你的 ld 版本可能有--start-group objs.o --end-group选项来处理类似的事情。

4

1 回答 1

0

一般来说,如果一个库X依赖于 library 中定义的符号Y,那么应该出现在提供给 的库列表的X前面。看起来您可以通过两次提供对象文件的名称来解决此问题:这样,每对也将在列表中显示为,并且无论对象内依赖关系如何,都将链接。有时你有循环引用;那么你必须将一个对象放在's 列表中两次。Yld{X, Y}{Y, X}ld

通常,您只是玩弄排序,直到正确为止。但是,您的 32-K 命令行似乎无法实现。我在这里lorder阅读并可以帮助您自动确定tsort正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具。

于 2012-06-22T15:29:09.217 回答