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

In what file a C function is defined?

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

注意我的问题很笼统,我上面提到的功能只是一个例子。我怎么知道在哪个 Linux 库中定义了任意 C 函数?

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

我认为解决您问题的最简单方法是 link 使用 gcc,它将调用 linker 和 link 标准 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 没有通用的解决方案。 您必须 google 才能将函数映射到库。如果库使用特定于库的前缀而不是裸名(不幸的是,标准 C 库在大多数情况下都会这样做),谷歌搜索应该是相当明确的。 (之后,您需要找到库的 SO 文件在您的系统上的位置。)

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

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

Compile and link with -pthread

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

对于 third-party 库,库 developer/distributor 有责任告诉您在哪里可以找到它们 API.

中列出的符号

最坏的情况下,您可以 find /usr/lib/opt 下的所有 .so 文件或安装库的任何其他位置,并且 运行 nm -D 在他们身上。您正在查找 tT.

类型的条目

请注意,我们假设您只需要共享对象(动态库)——如果您谈论的是任意 third-party 库,它们同样可以提供静态 (.a) 档案。