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

时间:2015-11-05 17:51:43

标签: c++ ld

我正在通过CMake构建第三方应用程序,并且我将-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

PC构建它有1GB的RAM和6GB的SWAP。试图释放那么多物理ram是困难的,那么有没有办法让链接器使用SWAP或限制它使用的内容?

我也转而使用ld.gold只是为了看看它是否有任何好处但仍然没有运气。遗憾的是,添加更多RAM不是一种选择。

2 个答案:

答案 0 :(得分:4)

不是理想的解决方案,但是对于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

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

答案 1 :(得分:0)

您可以将以下LD标志传递给gcc -o命令:

-fuse-ld=gold -Wl,--no-map-whole-files -Wl,--no-keep-memory -Wl,--no-keep-files-mapped

理想情况下,这应该可以解决您的内存问题。请注意,如果使用-Wl命令间接完成链接,则ld是将标志传递给gcc -o命令的选项。