2015-07-03 72 views
2

考虑下面的简单程序:GCC行为

__attribute__((weak)) void weakf(void); 

int main(int argc, char *argv[]) 
{ 
     weakf(); 
} 

当用gcc编译这和Linux的PC上运行它,它出现segfaults。在ARM CM0(arm-none-eabi-gcc)上运行时,链接器会跳转到下面的指令和nop来替换未定义的符号。

此行为记录在哪里?有没有办法通过命令行选项来改变它?我已经通过GCCLD文件,没有关于这方面的信息。

如果我检查ARM编译器文档,但是,this is clearly explained

回答

0

在ARM上使用gcc这段代码不适用于我(使用gcc Debian 4.6.3-14 + rpi1在armv7上测试)。它看起来像arm编译器工具链有不同的行为。

我没有发现此行为的有用文档。看起来weakf等于NULL,如果它在链接时没有定义的话。

所以我sugest你测试:

if (weakf == NULL) printf ("weakf not found\n"); 
else weakf(); 
+0

我要寻找从商务部的官方行为,并非针对任何解决办法 – calandoa

+0

,但我知道这个功能是不是C标准和它的外观的一部分像许多GCC的功能没有足够的文件。 https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes ' weak weak属性导致声明作为弱符号而不是全球。这对定义可以在用户代码中重写的库函数非常有用,但它也可以用于非函数声明。 ELF目标支持弱符号,在使用GNU汇编器和链接器时也支持a.out目标。 ' – Gnukos