【问题标题】:In what file a C function is defined?在哪个文件中定义了 C 函数?
【发布时间】:2017-01-31 16:49:40
【问题描述】:

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

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

【问题讨论】:

标签: libraries dynamic-linking shared-libraries


【解决方案1】:

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

我认为解决您的问题的最简单方法是将其与 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 文件在系统上的位置。)

【讨论】:

  • 这不是我要问的。
  • libc.so 是包含 C 标准库的共享对象。所以,回答“C 标准库”——考虑到 .so 路径也显示了——似乎很合理
  • There's no generic solution for function x as far as I know. -- 手册中也没有?
  • 当然,函数 x 将在手册中列出它包含的任何库 - 但如果您不知道哪个库,您怎么知道哪个手册?此外,完全有可能两个或多个不同的库定义了名为 x 的函数来完成完全不同的事情。
  • 如果你想限制自己安装的库,你总是可以得到所有的(对于动态库,做ldconfig -p)然后得到每个的符号表(nm -D得到动态符号表),然后创建一个将符号映射到文件名的数据库。
【解决方案2】:

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

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

编译链接-pthread

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

对于第三方库,库开发人员/分销商有责任告诉您在哪里可以找到其 API 中列出的符号。

在最坏的情况下,您可以只在/usr/lib/opt 或安装了库的任何其他位置下的所有.so 文件,然后在它们上运行nm -D。您正在寻找tT 类型的条目。

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

【讨论】:

  • 请注意,要知道将哪个库链接到 C 程序同样困难。如果该函数不在默认链接的 C 标准库中,您只需从文档中知道要链接哪个库。另请注意,您也可以使用gcc 驱动程序来编译汇编程序。假设您的汇编代码在文件hello.s 中,您调用了printf 函数。使用gcc -o hello hello.s 编译生成可执行文件hellogcc 程序为您完成链接,就像使用 C 程序一样。
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2019-07-09
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多