使用 -L 如何影响链接器?

How does using -L affect the linker?

我对 Linux 比较陌生,所以这可能是一个简单的问题。

问题是:在没有附加库的情况下添加 -L/path 如何影响链接器?

我的问题:

我正在尝试设置一个包含两个第三方库的交叉编译工具链¹。

我正在使用 linaro arm-linux-gnueabihf-raspbian 链(目标是 raspberry pi),它似乎工作正常。

我的一个模块不需要任何链接库,它可以很好地编译并在目标上运行。

尝试链接我的库的那个编译了,但是想了想之后,它在与消息链接时崩溃了

arm-linux-gnueabihf-gcc foo1.o foo2.o foo3.o ... foo12.o foo13.o -L/path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/lib -lbar1 -lbar2 -lbar3 -o foo
out of dynamic memory in yy_create_buffer()
collect2: error: ld returned 2 exit status

关于这个问题的历史搜索只是沙沙作响 arm-linux-gnueabihf-gcc: out of dynamic memory in yy_create_buffer() 没有回复,所以我假设我是一个人在这里。我在 Linaro 上也找不到任何东西。

Linaro 带有两个 ld,.brf.gold, 它们之间的行为似乎相似。我的 gcc 是 linaro-1.13.1-4.8-2014.01.

如前所述,我有另一个模块,可以很好地编译

arm-linux-gnueabihf-gcc foo.o -o foo

但是如果我用

编译它会显示与上面相同的错误
arm-linux-gnueabihf-gcc foo.o -L/path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/lib -o foo

所以我觉得这一切都来自 -L 选项。

进一步的数据点:当我 运行 arm-linux-gnueabihf-ldcrt*.o 以及上面的其他内容时,我 运行 交换 space。所以我将 swap space 从 500M 增加到 2G。然后它告诉我它运行 out of fd's。所以我将 fd 从 1024 增加到 65000。然后它告诉我 LD 内存不足。不知道我应该如何解决这个问题。甚至不确定我应该。

哦,这是在 Ubuntu Virtualbox 上。

最后,问题是:这个 -L 有什么作用?为什么链接器的行为与 -L 不同?我的链接器位于 /path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/bin。当我没有链接任何库时,它为什么还要关心?


¹(耶!适合全家一起玩)

要回答你的直接问题,除非你生成一个静态二进制文件(默认情况下 linker 会生成一个动态二进制文件),link 有默认库和(libc,一个) .指定 -L 确实告诉 linker 首先查看指定的目录。这不是 gcc 感谢 links,而是 ldgcc 只是调用 ld,传递一些额外的参数,包括默认库到 link .

尝试帮助您解决问题:

您的 ld 似乎对 /path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/lib 中的某些库或从那里引用的某些库感到窒息。

尝试在 linking 时向 gcc 添加 -v-Wl,-v 标志,以获取有关 linker 和编译器正在做什么的更多信息。确保您没有设置任何 LD_* 环境变量。确保 linker 拾取和你正在使用的库目录来自同一个工具链。

类似的问题通常是由于配置错误或在错误的时间拾取了错误的文件引起的。进一步调试需要使用 stracegdb.

调试 linker

如果您可以使用特定版本的工具链重现此问题,并且可以 post 它阻塞的代码,您可以 post 确切的参考,并且有人可以看看那些。