c++ - 丢弃理论上使用但技术上未使用的功能

标签 c++ c gcc linker embedded

是否有可能从输出文件(.exe/.elf)中丢弃函数/符号,即使它可以被调用?

比方说,第三方库做了这样的事情:

int lib_func_get(int c) {
   if (c < 5) {
       return foo();
   } else {
       return bar()
   }
}

你肯定知道,c 永远不会< 5,那么我想从我的可执行文件中省略/删除 foo() 以减少二进制大小。

我该怎么做?也许在链接器脚本的帮助下并丢弃 .text.foo

GCC 的链接器对此有一个类似的部分/DISCARD/,但链接失败,因为使用了该函数:

refers [symbol], which is defined in a discarded section

我的问题的背景是减少嵌入式应用程序的二进制大小,特别是引导加载程序,您无法重新编译第三方库,或者该库是工具链的一部分(例如 libgcc)并且您不想修改和重建整个工具链。

我知道,这可能是一种黑客方法,但我想这样做。

最佳答案

如果问题是本地的,最好的方法是提供编译器提示:

#define ASSUME(cond) do {      \
    if (!(cond))               \
      __builtin_unreachable(); \
  } while (0)

int lib_func_get(int c) {
   ASSUME(c >= 5);
   if (c < 5) {
       return foo();
   } else {
       return bar()
   }
}

这将删除函数定义和周围的代码。

否则您可以在链接时覆盖该符号:

$ gcc tmp.c -Wl,--defsym=printf=0
$ objdump -d tmp.c | grep printf
113d:   e8 be ee ff ff          callq  0 <printf>

关于c++ - 丢弃理论上使用但技术上未使用的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70056649/

相关文章:

C++:从指向类的指针访问成员结构的语法

c - 为什么gcc对函数中的局部变量重新排序?

c - 如何在简单的 Pthread 编程中分配数组变量?

c++ - 如何在 Gnu C++ (g++) 中使用十进制 float ?

c++ - C/C++:宽松的 std::atomic<bool> 与 X64 架构上的解锁 bool

c++ - C 或 C++ 中的边界检查是否昂贵?

c++ - 费马大定理算法

c - 将矩阵每一行的指针发送给函数

c++ - 函数名称之前的预期初始化程序

c++ - std::remove 函数中的转换错误