我一直在尝试将GNU扩展转换成实际的标准C,所以它会在叮当中运行,知道标准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,但还没有成功。
如果您好奇,这是我刚刚开始build立在叮当声之上的内核的一部分,除此之外。
编译arch / x86 / include / asm / jump_label.h似乎有问题。 整个代码片段是为了支持“跳转标签修补”。 在禁用调试时,允许调试(打印日志等)的开销接近于零的新功能非常有用。
你遇到的实现取决于gcc(v4.5),它增加了一个新的asm goto
语句 ,允许分支到一个标签。
看来Clang / LLVM不支持
asm goto
。
作为让你的Linux内核正确编译的一个快速修复,你可以在你的内核配置中禁用CONFIG_JUMP_LABEL
。 这个配置选项用于在编译器不支持asm goto
正确转换时禁用优化。