我一直在尝试将一些GNU扩展转换为实际标准C,因此它将在clang上运行,知道标准C而不是GNU扩展,我有点不知所措。
__asm__ (goto("1:"
STATIC_KEY_INITIAL_NOP
".pushsection __jump_table, \"aw\" \n\t"
_ASM_ALIGN "\n\t"
_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
".popsection \n\t"
: : "i" (key) : : l_yes););
我试图把它变成实际的asm,但还没有成功。
如果你很好奇,这是我刚刚建立在clang上的内核的一部分,除了那一部分。
答案 0 :(得分:6)
您似乎在编译arch/x86/include/asm/jump_label.h时出现问题。整个代码段是为了支持"跳转标签修补"。一个新功能非常有用,允许调试(打印日志等)在禁用调试时具有接近零的开销。
您遇到的实现depends on gcc(v4.5) which adds a new asm goto
statement,允许分支到标签。
作为正确编译Linux内核的快速解决方法,您可以在内核配置中禁用CONFIG_JUMP_LABEL
。当编译器不能正确支持asm goto
时,此配置选项用于禁用优化。