是否可以链接到共享库而无需访问库本身?

时间:2017-07-10 14:22:31

标签: linux linker shared-libraries ld elf

我有共享库的头文件,但没有共享库,也没有源代码。

我还可以针对这个库编译一些代码吗?

如果没有,共享库包含哪些信息不在标题中?

2 个答案:

答案 0 :(得分:3)

  

我还可以针对这个库编译一些代码吗?

编译:是的。链接:也许。

您可以创建要链接的虚拟库。例如。如果标题包含:

int library_func(void*);

然后:

// dummy_lib.c
int library_func(void *p) { return 0; }

gcc -fPIC -shared -o libfoo.so dummy_lib.c

# Now you can use libfoo.so to link your program.

有一些问题:

  1. 真实图书馆可能包含SONAME以外的其他内容libfoo.so(例如libfoo.so.2)。如果没有真正的libfoo
  2. ,您就无法知道
  3. 真正的库可以使用版本化符号。如果您将程序与虚拟库链接,它将使用所有引用符号的默认版本,这可能现在是正确的,但将来可能会中断(如果/当真正的库使用new更新时< em>不兼容实现您调用的任何符号。

答案 1 :(得分:2)

是。您可以为它们声明指向函数的指针,然后调用dlopendlsym,然后离开。但是,尝试以某种方式编写一个可执行文件或共享库,就好像你已经链接到库一样有风险;有关详细信息,请参阅俄罗斯公司的答案。

当然,您将需要这些库来运行代码。

但是,请注意并非所有共享的库和#39;只是共享库。在某些情况下,有一个.a文件在链接时用于在运行时提供除.so之外的一些静态链接代码。这并不常见。