我正在编写一些将在嵌入式设备上使用的代码,因此我希望通过让链接器丢弃一些我不使用的第三方库函数来保持代码大小。我已尝试使用-ffunction-sections
和-fdata-sections
选项以及-Wl,--gc-sections
但未使用的功能仍然存在。
这是我用MinGW构建的一个例子:
#include <iostream>
using namespace std;
double unused_function(int a, int b)
{
double r;
r = (double)a + (1.0/ (double)b);
return r;
}
double used_function(int a, int b)
{
double r;
r = (double)a + (1.0/ (double)b);
cout << r << "is the value" << endl;
return r;
}
int main() {
cout << "!!!Hello World!!!" << endl;
used_function(4,5);
return 0;
}
这是命令行输出:
g++ -O1 -ffunction-sections -fdata-sections -g -Wall -c -fmessage-length=0 -o "src\\test.o" "..\\src\\test.cpp"
g++ -Wl,--gc-sections,-Map=output.map,--print-gc-sections -o test.exe "src\\test.o"
size --format=berkeley test.exe
text data bss dec hex filename
36424 2476 2608 41508 a224 test.exe
现在,如果我完全注释unused_function()
并重建,size
命令会报告:
text data bss dec hex filename
36388 2476 2608 41472 a200 test.exe
我原本预计未使用的函数会被丢弃,因此文本大小将保持不变,但显然并非如此。是否存在我缺少的命令行选项,或者这是我对GCC如何在内部工作的无知的一部分?
这只是一个展示我的问题的例子。我正在使用一些第三方库来实现各种功能,我的目标是确保我不使用的库部分从代码中删除。
答案 0 :(得分:0)
稍后将链接的库可能需要使用未使用的函数。一个例子是由lib公开的内存分配接口,它不想限制用户管理内存的方式。
我们希望链接器在优化步骤中删除它们(尽管我遇到了链接器无法删除此类调用的所有残余的相关问题)