为什么我的符号没有外部链接?

时间:2017-09-12 09:11:03

标签: assembly linker clang

我尝试使用Clang + LTO构建coro.c(没有LTO,它可以正常工作)。

当我将最终二进制文件链接在一起时,我收到以下错误:

Global is external, but doesn't have external or weak linkage!
void ()* @coro_transfer

该符号在coro.h中定义为:

#if __i386__ || __x86_64__
extern void __attribute__ ((__noinline__, __regparm__(2)))
#else
extern void __attribute__ ((__noinline__))
#endif
coro_transfer (coro_context *prev, coro_context *next);

并在coro.c中:

  asm (
       "\t.text\n"
       #if _WIN32 || __CYGWIN__ || __MACH__
       "\t.globl _coro_transfer\n"
       "_coro_transfer:\n"
       #else
       "\t.globl coro_transfer\n"
       "coro_transfer:\n"
       #endif

在我看来,它确实(或应该)具有全球联系。这是LTO的错误,还是程序集定义有问题?

我用nm检查并注意到符号首先是未定义的,然后定义。我想这是因为标题中的声明,但它在技术上并不是实现中的C函数。

coro.c.o:
         U abort
00000000 T coro_create
00000000 T coro_stack_alloc
00000000 T coro_stack_free
         U coro_transfer
00000000 T coro_transfer
         U mmap
         U mprotect
         U munmap
         U sysconf

这会导致问题吗?

0 个答案:

没有答案