2013-01-23 115 views
1

除了Extend a dynamic linked shared library?我想知道,我如何获得一个共享库的所有公共方法的列表,封闭源代码。发现共享库的公共方法

我已经试过

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”的地方在我的系统,并认为“噢,我的上帝,我会用它“但是如何?

+0

如果您发现'libstone2goldconverter .so'请让我知道! :D – Veger

+0

如果您确实需要在不使用头文件的情况下尝试此操作,则问题基本上与逆向工程机器(汇编)代码相同。也就是说,硬件和自动工具只能做一些工作。 – aschepler

+0

我相信我会为我的案例找到头文件,但如果有其他方法可以找出api,它会更容易。我会让你知道,veger;) –

回答

2

共享库通常(如果不总是)提供了包含头文件公共API。

因此,而不是试图直接从库中抢(公共)功能,你应该尝试找到这些头文件,因为它们:

  • 所必需的编译应用程序
  • 可能包含文档
  • 包含公共API作为意在由显影剂

编辑
在你比如你定义

void libtest1(); 

这通常应该进入属于库的头文件。而不是定义,你应该使用:

#include "libtest1/public_api.h" 

(或类似的东西,这取决于你的图书馆/头名)

如果“丢失”的标题则库变成“不值钱”,因为你不知道公共API了,需要猜测(这显然是不受欢迎的)。

为什么不使用头文件'just'起作用,是因为你实际上知道函数的定义。编译器信任你的定义(因为它不知道你是否猜到)并接受它。当您要将目标文件链接到可执行文件时,链接程序会尝试在库中查找对未定义函数的所有引用。在这个阶段,链接器会发现你的函数是否真实存在(使用正确的参数和返回类型),否则会产生错误。

libstone2goldconverter.so的情况下,你应该看看真的很难找到附带的头文件(您的系统上,支持的网站,通过电子邮件的作者,等等)。因为没有头文件,你无法正确使用库。

这不仅适用于您(开发人员),也适用于图书馆的所有者。所以,你可以确定头文件确实存在于某处。唯一的问题是:您的libstone2goldconverter.so库看起来是专有的,库的作者/公司不可能为您提供它们的头文件,因为它严重损害了它们的市场地位......;)

+0

我同意你应该有一个头文件,但我会在接下来的几分钟内给我的问题添加一个小例子。 –

+0

好的,谢谢(两者)的详细信息。我会接受维格的答案,因为它更“复杂”,但也赞成另一个。 –

2

没有办法从C库找出你想要的信息 - 信息被编译器销毁。 (你可以用C++来做,但不能用C做)

对不起!

(Veger是正确的,你应该已经与库,它是什么应该告诉你这个信息一起给出一个头文件。)

+0

即使在C++中,通常也无法从库中知道函数或方法是否应该公开为“public”。 – aschepler