似乎有3种方法告诉GCC弱连接符号:
__attribute__((weak_import))__attribute__((weak))#pragma weak symbol_name这些都不适合我:
#pragma weak asdf
extern void asdf(void) __attribute__((weak_import, weak));
...
{
if(asdf != NULL) asdf();
}
Run Code Online (Sandbox Code Playgroud)
我总是得到这样的链接错误:
Undefined symbols:
"_asdf", referenced from:
_asdf$non_lazy_ptr in ccFA05kN.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我在OS X 10.5.5上使用GCC 4.0.1.我究竟做错了什么?
是否有可能让一个linux库(例如"libloader.so")加载另一个库来解析任何外部符号?
我有一大堆代码可以有条件地编译,以支持SIMD级别(SSE2,AVX,AVX2).如果构建平台与运行时平台相同,则此方法可以正常工作.但它阻碍了不同处理器世代的重用.
一种想法是将executable哪些调用function链接到libloader.so不直接实现的链接function.相反,它根据cpuflags 解析(绑定?)来自另一个加载库的符号,例如libimpl_sse2.so,libimpl_avx2.so依此类推.
有数百个函数需要以这种方式动态绑定,因此更改声明或调用代码是不切实际的.程序链接很容易改变.运行时环境变量也可以更改,但我不想这样做.
我已经通过ld标志创建了一个可执行文件来构建和启动未解析的外部符号(UES) --unresolved-symbols=ignore-all.但后续加载impl lib并不会将UES函数的值从NULL更改.