gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:13:56 24 4
gpt4 key购买 nike

是否有可能从输出文件(.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com