C语言中的asm标签是什么?

What's asm labels in C language?

在浏览glibc代码时,发现一些代码超出了我对C语言的理解,在this commit中有介绍。代码简化如下。

#include <stdio.h>
int foo(void) {
  printf("%s \n", __FUNCTION__);
  return 0;
}

int bar(void) asm("foo");

int main(int argc, char *argv[]) {
  bar();
  return 0;
}

输出:

foo

What's asm labels in C language?

C语言中不存在

它是 C 语言的 GCC 扩展,基本上是在编译时用另一个函数名替换函数名。

这个节目:

void bar(void);
void func() { bar(); }

编译为:

func:
        jmp     bar

但是这个程序:

void bar(void) asm("somename");
void func() {  bar(); }

编译为:

func:
        jmp     somename

我相信,提交的想法是测试sqrt的GLIBC代码将不会被编译器优化,以便测试代码可以测试generic implementation 不是编译器用来优化的 built-in 编译器实现。