作为练习,我试图导航和理解whoami
(和其他coreutils)一直到最底层的源代码。
到目前为止我的潜水:
实际的二进制在哪里?which whoami
/usr/bin/whoami
在哪里保养?
http://www.gnu.org/software/coreutils/coreutils.html
如何获取源?git clone git://git.sv.gnu.org/coreutils
存储库中的源代码在哪里?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 ();
这大概就是我的兔子洞停下来的地方。
# find . | grep whoami
在geteuid()
中提到,但未明确定义afaict。它在gnulib/lib/euidaccess.c
中也被引用为/usr/local/unistd.h
,但我看不到任何与抓取uid相关的繁重工作。在这里,我主要是在已知的系统头中对
extern
进行重映射,并在回溯其定义时遇到问题。问:我怎样才能更深入地研究
geteuid
的源代码?什么是最有效的方法来快速探索这个代码库而不必到处乱跑?我在Ubuntu Server 15.04上使用VIM和一些CTAGS(这对于导航现有的系统头并不是很有帮助)。我是一个糟糕的开发人员,这是我的学习方法,虽然我不能通过这个障碍。
最佳答案
通常,您应该阅读geteuid
的文档。您可以从打开的组中读取GNU documentation、specification,也可以查阅手册页。
如果这无助于安装C库的调试符号(它被称为libc6-dbg
或类似的东西)并下载libc6
的源代码,那么当您踏入库时,请指出源文件的路径。
在这种情况下,我不认为这会让您走得更远,geteuid
中可能发生的情况是,它只是发出一个实际的系统调用,然后进入内核空间。不能像调试普通程序那样调试(内核)代码。
因此,在您的情况下,您最好查阅文档并仔细阅读,并尝试找出为什么geteuid
没有返回您期望的结果。这可能会导致您改变对geteuid
应该返回的内容的期望,以匹配实际返回的内容。