ld:致命错误:无法分配内存

Ela*_*rys 3 c++ ld

我正在通过 CMake 构建一个 3rd Party 应用程序,并将 -DCMAKE_BUILD_TYPE=MinSizeRel 传递给 CMake 以尝试解决此问题,但这不起作用。

在链接方面,我总是以错误告终。

/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/../../../../armv7a-hardfloat-linux-gnueabi/bin/ld: fatal error: clientserver: mmap: failed to allocate 791230396 bytes for output file: Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)

构建此的 PC 具有 1gb RAM 和 6gb SWAP。尝试释放大量物理内存被证明是困难的,那么有没有办法让链接器使用 SWAP 或限制它使用的内容?

我也切换到 ld.gold 只是为了看看这是否有任何好处,但仍然没有运气。不幸的是,添加更多 RAM 不是一种选择。

Ela*_*rys 6

不是理想的解决方案,但是在 ld 的帮助手册和几天内的一些实验中,我自己发现了一个解决方案。

我将 /usr/bin/ld 重命名为 /usr/bin/ld.old(最终是 ld.gold 的符号链接),然后我创建了一个名为 /usr/bin/ld 的 shell 脚本,它简单地称为 /usr/bin/ ld.old 并强制通过一些额外的参数。

--no-map-whole-file --no-keep-memory --no-keep-files-mapped
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题,这与 32/64 位分配无关,而是链接器无法找到足够空间的事实。是的,上述选项会增加 I/O 使用量而不是内存,但事实仍然是它确实有效。

  • 对于我的 GNU gold 1.11,参数是:`--no-map-whole-files --no-keep-memory --no-keep-files-mapped` (2认同)