模板 - 巨大的目标文件导致链接器崩溃

发布于 2024-12-01 04:14:39 字数 537 浏览 1 评论 0原文

我有一个广泛使用模板的源文件。 我还在该文件中显式实例化了不同的模板......其中很多。 该文件被编译为静态库的一部分。我编译这个 多平台上的库\针对多种架构:Win x86, Linux x86 和 Linux ARM。对于 Linux 构建,我使用不同的编译器 所以生成的文件(我在 ELF 文件的上下文中讨论 本身)是不同的:对于 GCC,生成的目标文件大小为 8.4MB 并且有超过 40000 个 ELF 部分;对于ARM编译器(armcc) 生成的文件大小为 12.7MB,包含超过 90000 个 ELF 部分(!);在这两种情况下我都有调试信息。

发生的情况是,在链接时,ARM 链接器在尝试执行 链接静态库中的巨大目标文件。经过一番调查似乎 它无法处理其中包含超过 65536 个 ELF 部分的目标文件(我仍然有 不过,要得到编译器供应商的确认...或者我正在做 完全错误的事情)。我找到的解决方案是将 文件分成多个较小的文件(它的结构和内部内容允许这样做)。

问题:还有其他替代解决方案吗?会不会是 编译器可以在目标文件中生成额外的代码(在模板的上下文中) 在链接阶段之前?

I have a source file which extensively makes use of templates.
I also have in that file explicit instantiations of different templates ... a lot of them.
This file is compiled as part of a static library. I compile this
library on multiple platforms\for multiple architecture: Win x86,
Linux x86 and Linux ARM. For the Linux builds I use different compilers
so the resulting files(I'm talking here in context of the ELF file
itself) are different: for GCC the resulting object file is 8.4MB in size
and has a bit more than 40000 ELF sections; for the ARM compiler(armcc)
the resulting file is 12.7MB in size and has more than 90000 ELF
sections(!); in both cases I have debug information.

What happens is that at link time the ARM linker chokes and dies trying to
link that huge object file in the static library. After some investigation it seems
that it cannot handle object files with more than 65536 ELF sections in it(I still have
to get a confirmation from the compiler vendor, though ... or I'm doing
something completely and utterly wrong). The solution I found to that is splitting the
file into multiple smaller files(it's structure and what was inside allowed for that).

The question(s): is there any other alternative solution? Would it be
possible for the compiler to generate extra code in the object file(in the context of the templates)
before the linking phase?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倾城泪 2024-12-08 04:14:39

使用 ARM RVCT 编译器 (armcc),尝试将 --remove_unneeded_entities 添加到命令行。这可能会或可能不会产生太大影响,具体取决于您使用的编译器版本,但值得一试

With the ARM RVCT compiler (armcc), try adding --remove_unneeded_entities to the command line. This might or might not have much effect depending on which version of the compiler you are using, but its worth a try

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文