是否有可能链接到共享库而不访问库本身?
我还可以针对这个库编译一些代码吗?
编译:是的。链接:也许。
您可以创建一个虚拟库来链接。例如。如果头中包含:
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.
有一些疑难杂症的:
- 真正的图书馆可能有比
libfoo.so
(例如libfoo.so.2
)以外的东西SONAME
。如果没有访问真实的libfoo
,你无法知道。 - 真正的库可以使用版本化的符号。如果您将程序与虚拟库链接,它将使用所有引用符号的默认版本,这些符号现在可能是正确的,但可能在将来中断(如果/当真实库更新为新的并且不兼容执行您调用的任何符号)。
我发现了一个更简单但不太稳健的解决方案:使用clang创建一个空库:'echo“”| clang ++ -shared -fPIC -x C++ - -o libfoo.so'并告诉'clang/ld'在链接时忽略未解析的符号:-Wl, - unresolved-symbols = ignore-in-object-files'。 –
是的。你可以为它们声明指向函数的指针,然后调用dlopen
和dlsym
,然后离开。但是,试图以某种方式调制一个可执行文件或共享库,就好像你已经链接到该库一样是有风险的;详情请参阅俄罗斯雇主的答案。
你将需要这个库自己去运行的代码,当然。
但是,请注意,并非所有'共享库'只是共享库。在某些情况下,有一个.a
文件在链接时用于在运行时提供一些静态链接代码以及.so
。这并不常见。
“链接器不会根据库的内容改变任何内容。” - 当考虑版本符号时,这是非常错误的。 –
当您要使用dlopen和dlsym时,我不认为版本化符号会对此表单产生好奇效果。我会澄清。 – bmargulies
'dlsym'和版本化的符号以更混乱(可以说是破碎的)方式相互作用。 https://sourceware.org/bugzilla/show_bug.cgi?id=14932 –
它可能在AIX中:链接时,可以使用_export-file_而不是实际的库。我不知道在GNU/Linux中是否有这样的可能性 –