假设我想调用C函数:printf
,getpid
,socketpair
或来自我的代码的任何其他标准C函数,汇编语言。我知道如何在实施方面做到这一点。但是,我还必须知道在哪些Linux函数中定义了哪些函数,以便我可以将该文件的名称传递给链接器。我认为它应该是一个“如此”的文件。我如何找出它定义的文件?在哪个文件中定义了C函数?
注意我的问题是一般的,我上面提到的功能只是一个例子。我如何知道在什么Linux库中定义了任何C函数?
假设我想调用C函数:printf
,getpid
,socketpair
或来自我的代码的任何其他标准C函数,汇编语言。我知道如何在实施方面做到这一点。但是,我还必须知道在哪些Linux函数中定义了哪些函数,以便我可以将该文件的名称传递给链接器。我认为它应该是一个“如此”的文件。我如何找出它定义的文件?在哪个文件中定义了C函数?
注意我的问题是一般的,我上面提到的功能只是一个例子。我如何知道在什么Linux库中定义了任何C函数?
如果它是标准C库函数,则libc.so
可能是正确的。
如果是另一个库,库的文档应该告诉你。例如。为pthread_create
手册页说
编译和链接与
-pthread
,然后你需要看看GCC文档,看看它与选项(例如,-lpthread
再加上一些其他的东西,这样做你想要libpthread.so
)。
对于第三方库,责任完全在图书馆开发者/分销商处,告诉你在哪里可以找到其API中列出的符号。
最坏的情况你可以find
下/usr
,/lib
,/opt
或其他任何地方,你有安装的库,并针对他们nm -D
所有.so
文件。您正在寻找t
或T
类型的条目。
请注意,我们假设您只需要共享对象(动态库) - 如果您正在讨论任意的第三方库,它们同样可以运行静态(.a
)归档。
请注意,知道将哪个库链接到C程序同样很困难。如果该函数不在默认链接的C标准库中,则只需从文档中知道要链接哪个库。另请注意,您也可以使用'gcc'驱动程序来编译汇编程序。假设你的汇编代码在'hello.s'文件中,你可以调用'printf'函数。使用'gcc -o hello hello.s'编译生成可执行文件'hello'。 “gcc”程序为您提供链接,就像使用C程序一样。 –
这些(printf, getpid, socketpair
)都是标准C库的一部分。这是自动链接到每个C程序的库。
我想为您解决问题最简单的方法是将其与海湾合作委员会的联系,这将调用链接和链接标准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库),使用Google搜索它应该是相当明确的。 (之后,您需要找到库的SO文件在系统中的位置。)
可能的重复[如何找出使用给定的C库函数需要哪些链接器标志?](http://unix.stackexchange.com/questions/277845/how-can-i-find-out -what-linker-flags-are-needed-a-given-c-library-functio) – JigglyNaga