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

标签 linux ubuntu gcc linker ld

我是 Linux 新手,所以这可能是一个简单的问题。

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

我的问题:

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

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

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

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

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 以及上面的其他内容时,我用完了交换空间.所以我把交换空间从500M增加到2G。然后它告诉我它用完了 fd。所以我将 fd 从 1024 增加到 65000。然后它告诉我 LD 内存不足。不知道我应该如何解决这个问题。甚至不确定我应该。

哦,这是在 Ubuntu Virtualbox 上。

最后,问题来了:-L 有什么作用?为什么链接器在打开 -L 时表现不同?我的链接器位于 /path/path/path/gcc-linaro-arm-linux-gnueabihf-raspbian/bin。当我没有链接任何库时,它为什么还要关心?


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

最佳答案

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

尝试帮助您解决问题:

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

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

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

如果您可以使用特定版本的工具链重现此问题,并且可以发布它阻塞的代码,您可以发布确切的引用,并且有人可以查看这些。

关于linux - 使用 -L 如何影响链接器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628517/

相关文章:

python - 使用 linux 服务和 python 文件每 12 小时重新启动 apache

python - 如何将来自 UART 的传入字符添加到字符串中?

ruby - 在 ubuntu 上安装 ruby​​ 要求

apache - SSL 不适用于具有多个虚拟主机的 ubuntu 服务器

c++ - std::string 与 unicode 的奇怪行为

python-3.x - 在云函数中使用 Docker 是一种好习惯吗?

c - OS X 10.10 上 ucontext makecontext 的段错误

c++ - Clang 不编译代码,但 gcc 和 msvc 编译了它

c - 在 ARM Cortex M0 uart 控制台使用 printf() 打印 float

c - 针对 x86 架构使用 gcc 编译器的双堆栈对齐问题