告诉链接器“尊重” __attribute __((________))

时间:2019-04-25 18:22:28

标签: c++ c linker static-libraries

我正在尝试解决链接器在我的代码中删除注册的事实。 有关详情,请参见此answer

该答案的问题是--whole-archive选项似乎仅对1个函数调用来说就算是过大了。我想避免它造成的巨大代码膨胀。 我发现

  

属性(((使用))

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

__attribute__(used)是函数的属性,而不是变量的属性,其作用是强制编译器编译函数定义, 即使该函数是静态的并且在翻译单元中未引用。就您而言:

bool dummy = (Register(), false);

编译器无法看到未Register被引用-被称为 -因此__attribute__(used)将 即使Register()的定义在相同的转换单元中并且是静态的,也是多余的。但是无论是 Register()的定义不是在此翻译单元或其他翻译单元中编译的,对Register() call 如果未链接dummy的定义,则不会在程序中链接或执行。

我假设您不想编写自定义链接描述文件或修改源代码,以便引用dummy

在这种情况下,您需要指示链接程序假定dummy的未定义引用,方法是: 在其选项中传递--undefined=dummy。这将迫使它搜索图书馆 dummy的定义,并完全链接存档成员(和/或共享库) 实际上是在链接的第一个文件中对dummy的未定义引用。不会链接任何冗余代码, --whole-archive很有可能。

您可以将--undefined=<symbol>的{​​{1}}值传递给链接器 你喜欢。要使其通过<symbol>,请使用gcc/g++

答案 1 :(得分:0)

将其放在自己的部分以及链接脚本中:

KEEP(sectionname)

编辑

该行代码可能会减少为将一个寄存器或变量清零