【发布时间】:2019-05-02 21:58:30
【问题描述】:
我正在使用 C++14 模式下的 GCC 7.3.1 为 ARM Cortex-M 上的 C++ 嵌入式应用程序开发固件。只有 64k 的闪存可用,而且我的二进制文件不适合。查看映射文件,我发现二进制文件中有一个名为__gcclibcxx_demangle_callback 的函数,它占用了 27k 闪存空间。我知道这与 C++ 名称拆解有关。链接器不会丢弃此符号,尽管我绝对没有在我的代码中进行任何名称解构。我在这里和那里使用 STL。如何消除此功能以获得一些闪存空间?
我尝试将-ffreestanding -fno-exceptions -nostartfiles -fno-rtti 传递给编译器和链接器。传递-nostdlib 会导致链接失败,即使我传递-lc -lg -lgcc -lstdc++。
【问题讨论】:
-
只在发布模式下编译你的代码而不是调试?
-
你在编译什么优化级别?
-
尝试用
-fdata-sections -ffunction-sections编译你的对象并用-Wl,--gc-sections链接,最后通过strip运行生成的二进制文件 -
这可能与 STL 库中内置的异常有关。 (可能有些人在 STL 深处捕捉到了一些东西)。在打开交叉引用的情况下进行构建,这样您就可以看到哪个符号需要它,然后找出它在哪里,等等。最后,您可能需要重新编译 STL 而没有例外(为什么这不是嵌入式中的默认设置)世界工具链,我不知道)
-
@J.AntonioPerez 我在 -O0(没有优化),但我认为这不会影响链接。