我正在尝试导航和理解 whoami
(和其他 coreutils)一直到最低级别的源代码,就像一个练习。
到目前为止我的潜水:
实际的二进制文件在哪里?
我是谁
/usr/bin/whoami
它在哪里维护?
如何获取源代码?
git clone git://git.sv.gnu.org/coreutils
- 存储库中的
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/