什么是gcc使用属性的用法?

时间:2015-07-26 13:41:29

标签: c++ c gcc clang icc

#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()像魔法一样?

2 个答案:

答案 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,但它可能构成库的重要组成部分。 为了确保它被链接并且没有指向空白部分的中断向量,该关键字确保链接器不会对其进行优化。