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

时间:2015-06-03 19:03:59

标签: linux ubuntu gcc linker ld

我在Linux上相当新,所以这可能是一个简单的问题。

问题是:如果没有附加库,添加-L/path会如何影响链接器?

我的问题:

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

我正在使用linaro arm-linux-gnueabihf-raspbian链(目标是覆盆子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带有两个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-ld运行crt*.o以及上面的其他内容时,我的交换空间用完了。所以我将交换空间从500M增加到2G。然后它告诉我它用完fd了。所以我将fd从1024增加到65000.然后它告诉我LD耗尽了内存。不知道我应该如何解决这个问题。甚至不确定我应该这样做。

哦,这是在Ubuntu Virtualbox上。

所以,最后,问题是:-L做了什么?为什么链接器在-L上的行为方式不同?我的链接器位于/path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/bin。当我没有连接任何图书馆时,为什么还要关心呢?

¹(耶!有趣的是整个家庭)

1 个答案:

答案 0 :(得分:0)

要回答您的直接问题,除非您生成静态二进制文件(默认情况下链接器将生成动态二进制文件),否则需要链接的默认库(libc,用于一个)。指定-L会告诉链接器首先查看指定的目录。这不是gcc感谢链接,但是ldgcc只是调用ld,传递一些额外的参数,包括要链接的默认库。

试图帮助解决您的问题:

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

尝试在链接时向gcc添加-v-Wl,-v标志,以获取有关链接器和编译器正在执行的操作的更多信息。确保您没有设置任何LD_*个环境变量。确保链接器已被拾取,并且您使用的库目录来自同一工具链。

这样的问题通常是由错误的配置或在错误的时间拾取错误的文件引起的。进一步调试将需要使用stracegdb调试链接器。

如果您可以使用特定版本的工具链重现此问题,并且可以发布它所扼杀的代码,您可以发布确切的引用,并且有人可能会看一下这些。