2017-01-31 40 views
1

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

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

+2

可能的重复[如何找出使用给定的C库函数需要哪些链接器标志?](http://unix.stackexchange.com/questions/277845/how-can-i-find-out -what-linker-flags-are-needed-a-given-c-library-functio) – JigglyNaga

回答

1

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

如果是另一个库,库的文档应该告诉你。例如。为pthread_create手册页说

编译和链接与-pthread

,然后你需要看看GCC文档,看看它与选项(例如,-lpthread再加上一些其他的东西,这样做你想要libpthread.so)。

对于第三方库,责任完全在图书馆开发者/分销商处,告诉你在哪里可以找到其API中列出的符号。

最坏的情况你可以find/usr/lib/opt或其他任何地方,你有安装的库,并针对他们nm -D所有.so文件。您正在寻找tT类型的条目。

请注意,我们假设您只需要共享对象(动态库) - 如果您正在讨论任意的第三方库,它们同样可以运行静态(.a)归档。

+1

请注意,知道将哪个库链接到C程序同样很困难。如果该函数不在默认链接的C标准库中,则只需从文档中知道要链接哪个库。另请注意,您也可以使用'gcc'驱动程序来编译汇编程序。假设你的汇编代码在'hello.s'文件中,你可以调用'printf'函数。使用'gcc -o hello hello.s'编译生成可执行文件'hello'。 “gcc”程序为您提供链接,就像使用C程序一样。 –

2

这些(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文件在系统中的位置。)

+0

这不是我所问的。 – Torito

+0

libc.so是包含C标准库的共享对象。因此,回答“C标准库” - 也给出了.so的路径 - 看起来很合理 – Useless

+0

“据我所知,函数x没有通用的解决方案。” - 而不是手册? – Torito

相关问题