在什么文件中定义了C函数?

时间:2017-01-31 16:49:40

标签: libraries dynamic-linking shared-libraries

我想说我想调用C函数:printfgetpidsocketpair或汇编语言代码中的任何其他标准C函数。我知道如何在实施方面做到这一点。但是,我还必须知道其中一个函数定义在哪个Linux文件中,以便我可以将该文件的名称传递给链接器。我认为它应该是一个"所以"文件。我如何找出它定义的文件?

注意我的问题是一般性的,我上面提到的功能只是一个例子。我怎么知道Linux库中任何C函数定义了什么?

2 个答案:

答案 0 :(得分:2)

这些(printf, getpid, socketpair)都是标准C库的一部分。这是自动链接到每个C程序的库。

我认为解决问题的最简单方法是将其与gcc链接,gcc将调用链接器并链接标准C库的相应版本。

如果你想继续前进:

echo 'int main(){ }' |gcc -x c - && ldd ./a.out |grep libc

应该为您提供so文件。在我的情况下:

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc3a2b46000)

据我所知,函数x没有通用的解决方案。 您必须谷歌将功能映射到库。如果库使用库特定的前缀而不是裸名称(在大多数情况下不幸的是像标准C库一样),谷歌搜索它应该是相当明确的。 (在此之后,您需要找到系统库中SO文件的位置。)

答案 1 :(得分:1)

如果它是标准的C库函数,libc.so可能是正确的。

如果它是另一个库,该库的文档应该告诉您。例如。 pthread_create的联合帮助页

  

编译并与-pthread

链接

然后您需要查看GCC文档以了解它对该选项的作用(例如,-lpthread加上其他一些内容,因此您需要libpthread.so)。

使用第三方库,完全由库开发人员/分销商负责,告诉您在哪里可以找到其API中列出的符号。

最糟糕的情况是find.so/usr或您安装了库的其他任何地方/lib /opt个文件,并运行{{} 1}}在他们身上。您正在查找nm -Dt类型的条目。

请注意,我们假设您只需要共享对象(动态库) - 如果您正在谈论任意第三方库,他们可以同样发送静态(T)档案。 / p>