#include <stdio.h>
// xyz will be emitted with -flto (or if it is static) even when
// the function is unused
__attribute__((__used__))
void xyz() {
printf("Hello World!\n");
}
int main() {
return 0;
}
我需要做什么?
除了直接调用函数之外,还有什么方法我仍能以某种方式达到xyz
,就像某些dlsym()
像魔法一样?
答案 0 :(得分:8)
属性used
在您希望强制编译器发出符号的情况下很有用,通常可以省略它。正如GCC's documentation所说(强调我的):
此属性附加到函数,表示代码必须是 即使看起来功能不正常,也会为该功能发射 引用。这很有用,例如,当函数是时 仅在内联汇编中引用。
例如,如果您有以下代码:
#include <iostream>
static int foo(int a, int b)
{
return a + b;
}
int main()
{
int result = 0;
// some inline assembly that calls foo and updates result
std::cout << result << std::endl;
}
你可能会注意到,foo
标志(优化级别-O
)没有符号-O1
:
g++ -O -pedantic -Wall check.cpp -c
check.cpp:3: warning: ‘int foo(int, int)’ defined but not used
nm check.o | c++filt | grep foo
因此,您无法在此(虚构的)内联汇编中引用foo
。
添加:
__attribute__((__used__))
变成:
g++ -O -pedantic -Wall check.cpp -c
nm check.o | c++filt | grep foo
00000000 t foo(int, int)
因此现在可以在其中引用foo
。
您可能还发现gcc
的警告已经消失,因为您已经告诉编译器您确定foo
实际上已经在场景后使用了。“
答案 1 :(得分:1)
一个特定的用例是针对静态库中的中断服务例程。 例如,计时器溢出中断:
void __attribute__((interrupt(TIMERA_VECTOR),used)) timera_isr(void)
用户代码中的任何函数都不会调用此timera_isr,但它可能构成库的重要组成部分。 为了确保它被链接并且没有指向空白部分的中断向量,该关键字确保链接器不会对其进行优化。