C 发现共享库的公共方法

C 发现共享库的公共方法,c,api,shared-libraries,extending,C,Api,Shared Libraries,Extending,除此之外,我还想了解如何获得具有封闭源代码的共享库的所有公共方法的列表 我试过了 nm -D libfoo.so readelf -s libfoo.so 但是我缺少了一些信息,比如返回类型、参数等 作为这方面的初学者,我甚至不知道这些方法中有哪些可以为我的应用程序调用 有人有更有用的工具吗 编辑: 对于一个非常简单的示例,我有以下几点: void libtest1(); //from libtest1.so int main() { libtest1(); } libtest1

除此之外,我还想了解如何获得具有封闭源代码的共享库的所有公共方法的列表

我试过了

nm -D libfoo.so
readelf -s libfoo.so
但是我缺少了一些信息,比如返回类型、参数等

作为这方面的初学者,我甚至不知道这些方法中有哪些可以为我的应用程序调用

有人有更有用的工具吗

编辑:

对于一个非常简单的示例,我有以下几点:

void libtest1();  //from libtest1.so

int main()
{
    libtest1();
}
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。所以在我的系统中的某个地方,我想哦,天哪,我会用它的。。但是怎么做呢?

没有办法从C库中找到您想要的信息-这些信息会被编译器销毁。你可以用C++来做,但不能用C.< 对不起


Veger是对的,你应该得到一个头文件和库,这是应该告诉你这些信息的。

没有办法从C库中找到你想要的信息-这些信息被编译器破坏了。你可以用C++来做,但不能用C.< 对不起


Veger说得对,你应该得到一个包含库的头文件,它应该告诉你这些信息。

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

因此,与其直接从库中获取公共函数,不如尝试查找这些头文件,因为它们:

是编译应用程序所必需的 可能包含文档 包含开发人员预期的公共API 编辑 在您的示例中,您定义了

void libtest1();
这通常应该进入属于库的头文件中。而不是你应该使用的定义:

#include "libtest1/public_api.h"
或类似的内容,具体取决于您的库/头名称

如果您“丢失”了标题,那么库将变得“一文不值”,因为您不再了解公共API,需要猜测哪个显然是不需要的

不使用头文件,“just”之所以有效,是因为您实际上知道函数的定义。编译器信任您的定义,因为它不知道您是否猜到它并接受它。当您要将对象文件链接到可执行文件时,链接器会尝试查找库中对未定义函数的所有引用。在这个阶段中,链接器会发现您的函数是否实际存在,并带有正确的参数和返回类型,如果没有,它将生成一个错误

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


这不仅适用于开发人员,也适用于库的所有者。因此,您可以确定头文件确实存在于某个地方。唯一的问题是:你的libstone2goldconverter.so库看起来是专有的,库的作者/公司不太可能给你他们的头文件,因为这严重损害了他们的市场地位

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

因此,与其直接从库中获取公共函数,不如尝试查找这些头文件,因为它们:

是编译应用程序所必需的 可能包含文档 包含开发人员预期的公共API 编辑 在您的示例中,您定义了

void libtest1();
这通常应该进入属于库的头文件中。而不是你应该使用的定义:

#include "libtest1/public_api.h"
或类似的内容,具体取决于您的库/头名称

如果您“丢失”了标题,那么库将变得“一文不值”,因为您不再了解公共API,需要猜测哪个显然是不需要的

不使用头文件,“just”之所以有效,是因为您实际上知道函数的定义。编译器信任您的定义,因为它不知道您是否猜到它并接受它。当您要将对象文件链接到可执行文件时,链接器会尝试查找库中对未定义函数的所有引用。在这个阶段中,链接器会发现您的函数是否实际存在,并带有正确的参数和返回类型,如果没有,它将生成一个链接器 罗

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


这不仅适用于开发人员,也适用于库的所有者。因此,您可以确定头文件确实存在于某个地方。唯一的问题是:你的libstone2goldconverter.so库看起来是专有的,库的作者/公司不太可能给你他们的头文件,因为这严重损害了他们的市场地位

甚至在C++中,通常无法从一个库中判断一个函数或方法是否应该公开,甚至在C++中,通常也不能告诉一个函数或方法是否应该公开。我同意你应该有一个头文件,但我会在接下来的几分钟里给我的问题添加一个小例子……好的,谢谢你们提供的详细信息。我会接受维格的答案,因为它更复杂,但也会对另一个进行投票。我同意你的观点,应该有一个头文件,但我会在接下来的几分钟里为我的问题添加一个小示例。好的,谢谢你们提供的详细信息。我会接受维格的答案,因为它更复杂,但也会对另一个进行投票。如果您找到libstone2goldconverter的标题,请让我知道!:如果您确实需要在没有头文件的情况下尝试此操作,那么问题本质上与反向工程机器组装代码相同。也就是说,硬工具和自动工具只能完成部分工作。我相信我会找到我的案例的头文件,但如果有其他方法来理解api,那就更容易了。我会让你知道的,维格;如果您找到libstone2goldconverter.so的标题,请告诉我!:如果您确实需要在没有头文件的情况下尝试此操作,那么问题本质上与反向工程机器组装代码相同。也就是说,硬工具和自动工具只能完成部分工作。我相信我会找到我的案例的头文件,但如果有其他方法来理解api,那就更容易了。我会让你知道的,维格;