考虑下面的简单程序:
__attribute__((weak)) void weakf(void);
int main(int argc, char *argv[])
{
weakf();
}
Run Code Online (Sandbox Code Playgroud)
当用 gcc 编译它并在 Linux PC 上运行它时,它会出现段错误。在 ARM CM0 (arm-none-eabi-gcc) 上运行它时,链接器通过跳转到以下指令和 nop 替换未定义的符号。
这种行为记录在哪里?是否有可能通过命令行选项更改它?我已经通过GCC和LD文档,没有关于这方面的信息。
但是,如果我检查 ARM 编译器文档,则会清楚地解释这一点。
在带有 gcc 的 ARM 上,此代码对我不起作用(在带有 gcc Debian 4.6.3-14+rpi1 的 armv7 上测试)。看起来arm编译器工具链有不同的行为。
我没有找到有关此行为的有用文档。如果在链接时未定义,weakf 似乎等于 NULL。
所以我建议你测试一下:
if (weakf == NULL) printf ("weakf not found\n");
else weakf();
Run Code Online (Sandbox Code Playgroud)