2017-07-10 29 views
1

我有共享库的头文件,但没有共享库或源代码。是否有可能链接到共享库而不访问库本身?

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

如果不是,共享库包含哪些不在标头中的信息?

+0

它可能在AIX中:链接时,可以使用_export-file_而不是实际的库。我不知道在GNU/Linux中是否有这样的可能性 –

回答

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. 真正的图书馆可能有比libfoo.so(例如libfoo.so.2)以外的东西SONAME。如果没有访问真实的libfoo,你无法知道。
  2. 真正的库可以使用版本化的符号。如果您将程序与虚拟库链接,它将使用所有引用符号的默认版本,这些符号现在可能是正确的,但可能在将来中断(如果/当真实库更新为新的并且不兼容执行您调用的任何符号)。
+0

我发现了一个更简单但不太稳健的解决方案:使用clang创建一个空库:'echo“”| clang ++ -shared -fPIC -x C++ - -o libfoo.so'并告诉'clang/ld'在链接时忽略未解析的符号:-Wl, - unresolved-symbols = ignore-in-object-files'。 –

2

是的。你可以为它们声明指向函数的指针,然后调用dlopendlsym,然后离开。但是,试图以某种方式调制一个可执行文件或共享库,就好像你已经链接到该库一样是有风险的;详情请参阅俄罗斯雇主的答案。

你将需要这个库自己去运行的代码,当然。

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

+0

“链接器不会根据库的内容改变任何内容。” - 当考虑版本符号时,这是非常错误的。 –

+0

当您要使用dlopen和dlsym时,我不认为版本化符号会对此表单产生好奇效果。我会澄清。 – bmargulies

+0

'dlsym'和版本化的符号以更混乱(可以说是破碎的)方式相互作用。 https://sourceware.org/bugzilla/show_bug.cgi?id=14932 –