c - 我如何追踪 coreutils 到系统调用?

标签 c linux gnu-coreutils

我正在尝试导航和理解 whoami(和其他 coreutils)一直到最低级别的源代码,就像一个练习。

到目前为止我的潜水:

  1. 实际的二进制文件在哪里?

    我是谁
    /usr/bin/whoami

  2. 它在哪里维护?

    http://www.gnu.org/software/coreutils/coreutils.html

  3. 如何获取源代码?

git clone git://git.sv.gnu.org/coreutils

  1. 存储库中的 whoami 源代码在哪里?

# 查找。 | grep whoami

./man/whoami.x
./man/whoami.1
./src/whoami.c
./src/whoami
./src/whoami.o
./src/.deps/src_libsinglebin_whoami_a-whoami.Po
./src/.deps/whoami.Po

相关行(84):

uid = geteuid ();

这大约是我的兔子洞停止的地方。 geteuid()gnulib/lib/euidaccess.c 中提到,但没有明确定义 AFAICT。它也在 /usr/local/unistd.h 中作为 extern 引用,但没有与获取我能看到的 uid 相关的繁重工作。

我主要是通过在已知系统 header 中查找 geteuid 来找到这里的,因为我在回溯它的定义时遇到了麻烦。

问题:如何深入挖掘geteuid()的源代码?无需四处搜索即可快速探索此代码库的最有效方法是什么?

我在 Ubuntu 服务器 15.04 上使用 Vim 和一些 ctags(这对导航现有系统头文件不是很有帮助)。我是一个糟糕的开发人员,这是我的学习方法,尽管我无法克​​服这个障碍。

最佳答案

通常您应该阅读geteuid 的文档。您可以阅读 GNU documentation , specification来自 Open Group 或查阅手册页。

如果这没有帮助,您可以安装 c 库的调试符号(它称为 libc6-dbg 或类似的东西)并下载 libc6) 然后在进入库时指出源文件的路径。

在这种情况下,我认为这不会让您走得更远,geteuid 中可能发生的事情是它只是发出一个实际的系统调用,然后进入内核空间。您不能像调试普通程序那样调试该(内核)代码。

因此,在您的情况下,您最好查阅文档并仔细阅读,并尝试找出为什么 geteuid 没有返回您期望的结果。这可能会导致您改变对 geteuid 应返回的内容的期望以匹配实际返回的内容。

关于c - 我如何追踪 coreutils 到系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33928920/

相关文章:

linux - 如何在 Shell 脚本中的变量中捕获 telnet 命令的输出

mysql - 当数据库名称有 '-' 时遇到错误 DROP

linux - linux 下的 shebang 不拆分参数

c - 按C中的第二个字段对结构数组进行排序

C 十六进制转换为char指针

c - 如何处理这个: selected processor does not support `qadd16 r1,r1,r0'

Linux Bash Shell 读取日志文件将每一行与文件的重置进行比较

c - 传递比 C 原型(prototype)中指定的更多的参数

linux - 按字节位置排序

参数太少的 C 函数调用