告诉链接器"respect" __attribute__((__used__))的任何方法

Any way to tell linker to "respect" __attribute__((__used__))

本文关键字:used 方法 任何 attribute 链接 respect      更新时间:2023-10-16

我正在尝试解决链接器在我的代码中删除注册的事实。 有关详细信息,请参阅此答案。

我对这个答案的问题是,--whole-archive 选项对于 1 个函数调用来说似乎是矫枉过正。我想避免我认为它会导致巨大的代码膨胀。 我发现

属性((已使用))

,但这适用于编译级别,而不是链接级别。

所以我想知道是否有一种特定的方法来告诉链接器不要删除特定的函数调用,而不是更改整个程序的链接选项。

为了澄清起见,这是我的代码:

bool dummy = (Register(), false); // Register is never called because linker dropped entire static library

所以我想知道是否有一种特定的方法可以告诉链接器不要删除特定的函数调用,而不是更改整个程序的链接选项。

你的目标实际上是告诉链接器不要删除未引用变量(dummy)的定义,其中 初始化器 有一个函数调用,您希望确保由程序执行。

__attribute__(used)是函数的属性,但不是变量的属性,其作用是强制编译器编译函数定义, 即使函数是静态的,并且在翻译单元中显示为未引用。在您的情况下:

bool dummy = (Register(), false);

编译器无法显示Register未引用 - 它被调用- 所以__attribute__(used)即使Register()的定义位于同一翻译单元中并且是静态的,也是多余的。但无论还是 不是Register()的定义是在这个翻译单元或其他一些翻译单元中编译的,这个呼吁Register()如果未链接此dummy定义,则不会在程序中链接或执行。

我假设您不想编写自定义链接器脚本,也不想修改源代码以便引用dummy

在这种情况下,您需要指示链接器假设dummy的未定义引用,通过 在其选项中传递--undefined=dummy。这将迫使它在库中搜索dummy的定义,并链接存档成员(和/或共享库),就像存在一样 实际上是对链接的第一个文件中dummy的未定义引用。不会链接冗余代码, 就像--whole-archive一样.

可以将--undefined=<symbol>传递给链接器以获取任意数量的<symbol>值 你喜欢。要通过gcc/g++传递它,请使用-Wl,--undefined=<symbol>

把它放在它自己的部分和链接器脚本中:

KEEP(sectionname)

编辑

该行代码可以减少为将一个寄存器或变量归零