如何将coreutils跟踪到系统调用?

时间:2015-11-26 00:49:11

标签: c linux gnu-coreutils

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

到目前为止我的潜水:

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

    which whoami
    /usr/bin/whoami

  2. 它在哪里维护?

      

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

  3. 我如何获得来源?

  4.   

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

    1. 存储库中的whoami源代码在哪里?
    2. # 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.h中也被extern引用,但是没有重要的举动与抓住我能看到的uid相关。

      我来到这里主要是在已知的系统标题内点击geteuid并包括我在回溯其定义时遇到问题。

      问题:我如何进一步深入探讨geteuid()的源代码?快速浏览此代码库的最有效方法是什么,而不必喋喋不休?

      我在Ubuntu服务器15.04上使用Vim和一些ctags(这对于导航现有的系统头文件非常有帮助)。我是一个可怕的开发者,这是我的学习方法,虽然我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

通常您应该阅读geteuid的文档。您可以从Open Group中阅读GNU documentationspecification或查阅手册页。

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

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

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