我正在尝试解决链接器在我的代码中删除注册的事实。 看这个answer了解详情。
我对这个答案的问题是 --whole-archive 选项对于仅 1 个函数调用来说似乎是一种矫枉过正。我想避免我认为它导致的巨大代码膨胀。 我发现
attribute((used))
,但这适用于编译,而不是链接级别。
所以我想知道是否有一种特定的方法来告诉链接器不要删除特定的函数调用,而不是更改整个程序的链接选项。
为了澄清,这是我的代码:
bool dummy = (Register(), false); // Register is never called because linker dropped entire static library
最佳答案
So I wonder if there is a specific way to tell the linker to not drop specific function call, instead of changing link options for entire program.
您的目标实际上是告诉链接器不要删除未引用变量的定义( dummy
)
初始化程序中有一个函数调用,您希望确保该函数调用由您的程序执行。
__attribute__(used)
是函数的属性,但不是变量的属性,其作用是强制编译器编译函数定义,
即使该函数是静态的并且在翻译单元中显示为未引用。对于您的情况:
bool dummy = (Register(), false);
编译器不能认为 Register
未引用 - 它被称为 - 所以 __attribute__(used)
将要
即使 Register()
的定义也是多余的位于同一翻译单元中并且是静态的。但无论是还是
不是 Register()
的定义在此翻译单元或其他翻译单元中编译,此调用到 Register()
如果 dummy
的定义不会在程序中链接或执行未链接。
我假设您不想编写自定义链接器脚本,或修改源代码以便 dummy
被引用。
在这种情况下,您需要指示链接器假定对 dummy
的 undefined reference , 经过
路过--undefined=dummy
在其选项中。这将迫使它搜索库
dummy
的定义,并链接存档成员(和/或共享库),就像存在一样
实际上是对 dummy
的 undefined reference 在链接的第一个文件中。不会链接多余的代码,
--whole-archive
可能是这样.
您可以通过--undefined=<symbol>
给链接器获取 <symbol>
的多个值作为
你喜欢。通过gcc/g++
来传递它,使用-Wl,--undefined=<symbol>
.
关于c++ - 有什么方法可以告诉链接器 "respect"__attribute__((__used__)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855470/