2015-11-26 69 views
2

我试图导航并理解whoami(和其他coreutils)一直到最底层的源代码,就像练习一样。如何将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

  • 在哪里存储库中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(); 
    

    这大约是在我的兔子孔停止。在gnulib/lib/euidaccess.c中提到geteuid(),但未明确定义AFAICT。它在/usr/local/unistd.h中也被引用为extern,但是没有涉及抓取我可以看到的uid的繁重工作。

    我在这里通过grep geteuid在已知的系统头文件中包含,因为我在回溯其定义时遇到了问题。

    问题:如何进一步深入探索geteuid()的源代码?什么是快速探索这个代码库而不用四处搜索的最有效方式?

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

    +1

    'geteuid()'在'libc'中,Unix标准库。 – Barmar

    回答

    0

    通常您应该阅读geteuid的文档。您可以从开放组读取GNU documentation,specification或查阅手册页。

    如果不帮助你可以安装在C语言库的调试符号(这就是所谓的libc6-dbg或类似的东西),下载并libc6的源代码),那么你所指出的路径源文件时,你一步进入图书馆。

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

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

    +0

    我想我试图从一个更“硬的方法”,法医的方法来解决这个问题,看看geteuid的内部被定义为一个C函数,它触发系统调用。我一直无法找到代码的位置。它似乎没有像在原始评论中提到的那样在unistd.h或sys/types.h中定义。我会研究安装调试符号,看看有多远,让我。 – mag00