是否可以 link 访问共享库而不访问库本身?
Is it possible to link to a shared library without access to the library itself?
我有共享库的 header 个文件,但没有共享库及其源代码。
我还能针对这个库编译一些代码吗?
如果不是,共享库包含哪些不在 header 中的信息?
是的。您可以为它们声明指向函数的指针,然后调用 dlopen
和 dlsym
,然后就可以了。但是,尝试以某种方式编造一个可执行文件或共享库,就好像您已经 linked 到该库一样是有风险的;有关详细信息,请参阅 Employed Russian 的回答。
当然,您将需要这些库本身来 运行 代码。
但是,请注意并非所有 'shared libs' 都是共享库。在某些情况下,除了 运行 时的 .so
之外,link 时还会使用 .a
文件来提供一些静态 linked 代码.这并不常见。
Can I still compile some code against this library?
编译:是的。 Link:也许吧。
您可以为 link 创建一个虚拟库。例如。如果 header 包含:
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.
有一些陷阱:
- 真正的图书馆可能有
SONAME
不同于 libfoo.so
的内容(例如 libfoo.so.2
)。如果不访问真实的 libfoo
. ,您将无法知道
- 真正的库可以使用版本化符号。如果您 link 您的程序针对虚拟库,它将使用所有引用符号的默认版本,这现在可能是正确的,但将来可能会崩溃(if/when 真正的库是使用您调用的任何符号的新 不兼容 实现进行了更新。
我有共享库的 header 个文件,但没有共享库及其源代码。
我还能针对这个库编译一些代码吗?
如果不是,共享库包含哪些不在 header 中的信息?
是的。您可以为它们声明指向函数的指针,然后调用 dlopen
和 dlsym
,然后就可以了。但是,尝试以某种方式编造一个可执行文件或共享库,就好像您已经 linked 到该库一样是有风险的;有关详细信息,请参阅 Employed Russian 的回答。
当然,您将需要这些库本身来 运行 代码。
但是,请注意并非所有 'shared libs' 都是共享库。在某些情况下,除了 运行 时的 .so
之外,link 时还会使用 .a
文件来提供一些静态 linked 代码.这并不常见。
Can I still compile some code against this library?
编译:是的。 Link:也许吧。
您可以为 link 创建一个虚拟库。例如。如果 header 包含:
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.
有一些陷阱:
- 真正的图书馆可能有
SONAME
不同于libfoo.so
的内容(例如libfoo.so.2
)。如果不访问真实的libfoo
. ,您将无法知道
- 真正的库可以使用版本化符号。如果您 link 您的程序针对虚拟库,它将使用所有引用符号的默认版本,这现在可能是正确的,但将来可能会崩溃(if/when 真正的库是使用您调用的任何符号的新 不兼容 实现进行了更新。