创建一个在运行时链接的dylib

时间:2013-11-12 23:00:08

标签: c macos dynamic-linking

我正在尝试创建一个动态库,它意味着在运行时链接并加载到主机环境中(例如类似于Java中类加载的工作方式)。因此,我希望动态库留下一些"悬空"引用,我希望它在加载到该环境时从其主机环境中获取。

我的问题是我无法弄清楚如何创建动态库而不将其显式链接到现有符号。我希望生成一个不依赖于特定主机可执行文件(或主机库)的动态库,而只要主机生成一个能够在任何主机中加载(例如dlopen)的动态库。可以使用的几个符号。

现在,我尝试过的任何链接命令都会导致丢失符号的投诉。我希望它能够丢失符号(理想情况下,只是特别指定的符号)。

例如,这是OS X上出现错误的成绩单:

$ cat frotz.c 
void blort(void);

void run(void) {
    blort();
}

$ cc -c -o frotz.o frotz.c
$ cc -dynamiclib -o libfrotz.dylib frotz.o
Undefined symbols for architecture x86_64:
  "_blort", referenced from:
      _run in frotz.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我使用GNU工具链(在Linux上)做同样的事情,它会有用地告诉我:

$ gcc -shared -o libfrotz.so frotz.o
/usr/bin/ld: frotz.o: relocation R_X86_64_PC32 against undefined symbol `blort'
can not be used when making a shared object; recompile with -fPIC

实际上,将-fPIC添加到C编译命令似乎可以解决该环境中的问题。但是,它似乎对OS X没有任何影响。

我在SO上可以找到的所有其他动态链接问题似乎都是关于更常见的库安排,其中构建库以在可执行文件运行之前链接到可执行文件,而不是相反。我找到的最相关的问题是:

很遗憾,

信息非常少,与我在这里提出的问题无关。


更新:我从答案中提取了信息以及我想到的所有其他信息 out,并把这个例子放在一起:

1 个答案:

答案 0 :(得分:1)

据我所知,你想使用弱连接:

// mark function as weakly-linked
extern void foo() __attribute__((weak));

// inform the linker about that too
clang -dynamiclib -o bar.dylib bar.o -flat_namespace -undefined dynamic_lookup

如果可以在运行时解析弱函数,则会解析它。如果不能,则为NULL,而不是生成运行时(或显然是链接时)错误。