我需要严格地优化我的可执行文件的大小(ARM个开发),并且 我注意到,在我当前的构建方案(gcc+ld)中,未使用的符号没有被剥离.

arm-strip --strip-unneeded用于生成的可执行文件/库不会改变可执行文件(I have no idea why, maybe it simply can't)的输出大小.

如何修改我的建筑管线,以便从生成的文件中删除未使用的符号?


我甚至不会想到这一点,但我目前的嵌入式环境不是很"强大",而且

Update:

不幸的是,我使用的当前gcc版本没有-dead-strip选项,ld-ffunction-sections... + --gc-sections没有给结果输出带来任何显着差异.

I'm shocked that this even became a problem, because I was sure that 100 should automatically strip unused symbols (why do they even have to keep them?).

推荐答案

对GCC来说,这是分两个阶段完成的:

首先编译数据,但告诉编译器在翻译单元中将代码分成不同的部分.这将通过使用以下两个编译器标志对函数、类和外部变量执行:

-fdata-sections -ffunction-sections

使用链接器优化标志将翻译单元链接在一起(这会导致链接器丢弃未引用的部分):

-Wl,--gc-sections

所以如果你有一个叫做test的文件.cpp中声明了两个函数,但其中一个未使用,您可以使用以下命令将未使用的函数省略到gcc(g++):

gcc -Os -fdata-sections -ffunction-sections test.cpp -o test -Wl,--gc-sections

(注意,-Os是一个额外的编译器标志,告诉GCC优化大小)

C++相关问答推荐

需要大整数和浮点数.使用long long int和long double

标准的C17标准是用括号将参数包装在函数声明中吗

*p[num]和(*p)num的区别

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

有没有可能我不能打印?(C,流程)

ATmega328P EEPROM未写入

加密解密工作正常,但返回错误0x80090005

使用错误的命令执行程序

判断X宏的空性

在Linux上使用vscode和lldb调试用Makefile编译的c代码

ifdef __cplusplus中的整数文字单引号

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

C中的回文数字

不带Malloc的链表

如何逐位读取二进制文件?

带有数组指针的 struct 在print_stack()函数中打印随机数

未使用sem_open正确初始化信号量

GDB 跳过动态加载器代码

C11 嵌套泛型

C 中从 Unix 纪元时间转换的损坏