2

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

到目前为止我的潜水:

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

    which whoami
    /usr/bin/whoami

  2. 它在哪里维护?

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

  3. 我如何获得来源?

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

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

# find . | 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.has中被引用,extern但没有与抓取我可以看到的 uid 相关的繁重工作。

我主要是通过geteuid在已知的系统标头中寻找并包括在内,因为我在回溯其定义时遇到了麻烦。

问题:我怎样才能进一步深入探索源代码geteuid()?在不费力的情况下快速探索这个代码库的最有效方法是什么?

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

4

1 回答 1

0

通常,您应该阅读geteuid. 您可以阅读GNU 文档、Open Group的规范或查阅手册页。

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

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

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

于 2015-11-26T07:24:48.470 回答