GCC 不会删除未使用的函数
GCC Won't Remove Unused Functions
我正在编写一些将在嵌入式设备上使用的代码,因此我希望通过让链接器丢弃一些我不使用的第三方库函数来降低代码大小。我尝试过将-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公开的内存分配接口,该接口不想限制用户管理内存的方式。
我们希望链接器在优化步骤中删除这些(尽管我遇到了相关问题,链接器无法删除此类调用的所有残余)
相关文章:
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 未使用的C++未优化的静态成员函数/变量
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- C++未使用的变量警告,即使我在函数结束时返回它
- 是否需要删除函数中未使用的新结构?
- 具有未使用的模板参数的函数模板
- 来自重载或模板化函数的额外未使用代码的影响?
- DLL 链接静态库 - 未使用函数中未解析的链接器符号
- 使用递归的函数未按预期工作
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- 拥有这个未使用的函数 Init 有什么意义
- 尝试使用 std::函数(未定义的符号)声明模板化类状态时出现链接错误
- int类型的函数未使用返回C++
- 函数未使用与类相同的名称调用
- 编译器会优化出静态函数未使用的参数吗?