GCC 不会删除未使用的函数

GCC Won't Remove Unused Functions

本文关键字:函数 未使用 删除 GCC      更新时间:2023-10-16

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

这只是一个例子来说明我的问题。我正在为各种函数使用一些第三方库,我的目标是确保从代码中删除我不使用的部分库。

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

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