在什么文件中定义了 C 函数?
In what file a C function is defined?
假设我想从我的汇编语言代码中调用一个 C 函数:printf
、getpid
、socketpair
或任何其他标准 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
在他们身上。您正在查找 t
或 T
.
类型的条目
请注意,我们假设您只需要共享对象(动态库)——如果您谈论的是任意 third-party 库,它们同样可以提供静态 (.a
) 档案。
假设我想从我的汇编语言代码中调用一个 C 函数:printf
、getpid
、socketpair
或任何其他标准 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
在他们身上。您正在查找 t
或 T
.
请注意,我们假设您只需要共享对象(动态库)——如果您谈论的是任意 third-party 库,它们同样可以提供静态 (.a
) 档案。