除了扩展动态链接共享库?我想找出,如何获取具有闭源的共享库的所有公共方法的列表。
我试过了
nm -D libfoo.so
readelf -s libfoo.so
但是我缺少返回类型、参数等信息。
作为该领域的初学者,我什至无法弄清楚这些方法中的哪些可以用于我的应用程序。
有没有人有更有用的工具?
编辑:
对于一个非常简单的例子,我有以下内容:
libtest1.c:
int puts(char const *);
void libtest1()
{
puts("libtest1: called puts()");
}
然后我将libtest1.c编译为 libtest1.so:
gcc -fPIC -shared -o libtest1.so libtest1.c
在我的"程序"(test.c)中,我按如下方式使用共享库:
void libtest1(); //from libtest1.so
int main()
{
libtest1();
}
并编译 test.c 来测试:
gcc -o test test.c -ltest1 -ldl
尽管我没有要包含的libtest1.h,但这将起作用。它"只是"工作,因为我知道可能有一个 libtest1() 方法可以调用。
现在想想我丢失了libtest1.c,只是手里拿着 libtest1.so,不记得方法有什么以及他们需要什么参数。
这是一个愚蠢的例子,我知道:)
或者作为另一个例子(也许更好):
让我们假设我在系统的某个地方发现了一个"libstone2goldconverter.so",并认为"哦,天哪,我会使用它"..但是如何呢?
共享库通常(如果不是总是)提供包含公共API的头文件。
因此,与其尝试直接从库中获取(公共)函数,不如尝试查找这些头文件,因为它们:
- 是编译应用程序所必需的
- 可能包含文档
- 包含开发人员预期的公共 API
编辑
在您的示例中,您定义
void libtest1();
这通常应该进入属于库的头文件。而不是定义,你应该使用:
#include "libtest1/public_api.h"
(或类似的东西,取决于您的库/标头名称)
如果你"丢失"了标题,那么库就会变得"毫无价值",因为你不再知道公共 API 并且需要猜测(这显然是不需要的)。
不使用头文件"只是"工作的原因是因为你实际上知道函数的定义。编译器信任您的定义(因为它不知道您是否猜到了它)并接受它。当您要将目标文件链接到可执行文件中时,链接器会尝试在库中查找对未定义函数的所有引用。在此阶段,链接器会找出您的函数是否确实存在(具有正确的参数和返回类型),否则将生成错误。
在libstone2goldconverter.so
的情况下,您应该非常努力地找到随附的头文件(在您的系统,支持网站上,通过电子邮件发送给作者等)。因为没有头文件就无法(正确)使用库。
这不仅适用于您(开发人员),也适用于库的所有者。因此,您可以确定头文件确实存在于某处。唯一的问题是:您的libstone2goldconverter.so
库看起来是专有的,并且该库的作者/公司不太可能为您提供他们的头文件,因为这严重损害了他们的营销地位...... ;)
无法从 C 库中找到所需的信息 - 该信息被编译器销毁。 (你可以用C++来做,但不能用C来做。
不好意思!
(Veger是对的,你应该得到一个头文件和库,这是应该告诉你这些信息的。