代码之家  ›  专栏  ›  技术社区  ›  SRobertJames

如何浏览glibc源代码?

  •  0
  • SRobertJames  · 技术社区  · 4 年前

    我正在努力学习油嘴滑舌的来源,我发现 航行 相当可怕。我指的不是代码本身,而是简单地找到它:它似乎是一个由宏和包装器组成的迷宫,所以仅仅找到我想要的实际代码是相当困难的。

    不仅仅是依赖于系统的东西,比如 setjmp ,但即使是便携式功能,如 fprintf :在每种情况下,我都很难在C中找到真正的定义。很容易找到开始,但通常是一个空壳包装定义和宏。

    这感觉就像是现代的goto语句,意大利面条问题再次出现。

    如何导航glibc并找到lib函数的实际实现?


    使现代化

    例如,请尝试查找的定义 hidden_def 油嘴滑舌。这是一个宏 hidden_def1 ,这是一个宏 hidden_def2 ,这是一个宏 hidden_asm ,这是一个宏 hidden_asm1 ,此时。。。

    此外,这些宏中的每一个都定义在几个不同的文件中 #define s控制实际调用的定义。

    这并不罕见:在整个源代码中,这似乎是一种礼节。有人是怎么理解的?GNU开发者如何遵循它?

    0 回复  |  直到 4 年前
        1
  •  1
  •   KamilCuk    4 年前

    如何导航glibc并找到lib函数的实际实现?

    在搜索栏中键入函数 https://code.woboq.org/userspace/glibc 或在 https://github.com/bminor/glibc 。手动导航结果,直到找到定义为止。

    如果要对项目进行本地索引,请使用cscope、ctags、GLOBAL标记或clangd对项目进行索引,然后使用特定于工具的界面搜索定义。

    例如,尝试在glibc中查找hidden_def的定义

    类型 hidden_def glibc 进入谷歌。我的第一个热门是woboq.org https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550 .

    我用萤火虫。I类型 ctrl+f 和类型 hidden_def 。键入Enter,直到找到为止 # define hidden_def https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550 .

    然后选择 __hidden_ver1 和类型 ctrl+c ctrl+f ctrl+v 并在web浏览器中搜索。我键入enter,直到找到为止 https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#540 . __hidden_ver2 就在542线上的下方。

    在大多数情况下,你只需要一个浏览器、谷歌、coboq.org和github.org。

    这是一个宏,将带您进入hidden_def1

    没有像你提到的那样的宏,至少在woboq.org上托管的版本是这样。

    有人是怎么理解的?

    虽然 IDE 是一个强大的帮助,每个项目都是独特的,需要不同的设置,这需要时间来解决。大多数浏览源代码是 grep (或更快的替代方案,如 ag ,对于像glibc这样的大型项目非常有用)和查看结果列表。

    不仅仅是依赖于系统的东西,比如setjmp

    开发人员是(应该是:)理智的人——在大多数情况下,一个名为 setjmp 将在名为的文件中 setjmp.c setjmp.S 。或在与相同的目录中 setjmp.h 。或在名为的目录内 stdlib setjmp .

    类型 setjmp 在github搜索栏中。 https://github.com/bminor/glibc/search?q=setjmp 您可以看到,每个体系结构都有多个定义 powerpc s390 等等。但是文件都是命名的 setjmp 回去在上键入“转到文件” https://github.com/bminor/glibc 。搜索名为的文件 x86/setjmp 。有3种实现方式,最标准的似乎是 https://github.com/bminor/glibc/blob/master/sysdeps/x86_64/setjmp.S .

    甚至像fprintf这样的可移植功能

    如上所述,saerch用于名为fprintf的文件。你很快就会发现 https://github.com/bminor/glibc/blob/master/stdio-common/fprintf.c .