我想说我想调用C函数:printf
,getpid
,socketpair
或汇编语言代码中的任何其他标准C函数。我知道如何在实施方面做到这一点。但是,我还必须知道其中一个函数定义在哪个Linux文件中,以便我可以将该文件的名称传递给链接器。我认为它应该是一个"所以"文件。我如何找出它定义的文件?
注意我的问题是一般性的,我上面提到的功能只是一个例子。我怎么知道Linux库中任何C函数定义了什么?
答案 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 -D
或t
类型的条目。
请注意,我们假设您只需要共享对象(动态库) - 如果您正在谈论任意第三方库,他们可以同样发送静态(T
)档案。 / p>