GCC不会删除未使用的函数

时间:2016-01-05 19:02:45

标签: c++ c gcc g++

我正在编写一些将在嵌入式设备上使用的代码,因此我希望通过让链接器丢弃一些我不使用的第三方库函数来保持代码大小。我已尝试使用-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如何在内部工作的无知的一部分?

这只是一个展示我的问题的例子。我正在使用一些第三方库来实现各种功能,我的目标是确保我使用的库部分从代码中删除。

1 个答案:

答案 0 :(得分:0)

稍后将链接的库可能需要使用未使用的函数。一个例子是由lib公开的内存分配接口,它不想限制用户管理内存的方式。

我们希望链接器在优化步骤中删除它们(尽管我遇到了链接器无法删除此类调用的所有残余的相关问题)