我尝试使用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
这会导致问题吗?