相关疑难解决方法(0)

如何与GCC进行弱连接工作?

似乎有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.我究竟做错了什么?

c linker gcc weak

23
推荐指数
4
解决办法
4万
查看次数

如何根据Linux上的CPU功能进行运行时绑定

是否有可能让一个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更改.

linux binding simd shared-libraries dlopen

6
推荐指数
1
解决办法
384
查看次数

标签 统计

binding ×1

c ×1

dlopen ×1

gcc ×1

linker ×1

linux ×1

shared-libraries ×1

simd ×1

weak ×1