c - 发现共享库的公共方法



除了扩展动态链接共享库?我想找出,如何获取具有闭源的共享库的所有公共方法的列表。

我试过了

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是对的,你应该得到一个头文件和库,这是应该告诉你这些信息的。

相关内容

  • 没有找到相关文章

最新更新