未解析弱函数的 GCC 行为

cal*_*doa 6 c gcc arm ld weak

考虑下面的简单程序:

__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 替换未定义的符号。

这种行为记录在哪里?是否有可能通过命令行选项更改它?我已经通过GCCLD文档,没有关于这方面的信息。

但是,如果我检查 ARM 编译器文档,则会清楚地解释这一点

Gnu*_*kos 1

在带有 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)