首页 > 解决方案 > 如何导航 glibc 源?

问题描述

我正在尝试学习 glibc 源代码,并且发现导航非常强大。我不是指代码本身,而是简单地找到它:它似乎是一个宏和包装器的迷宫,因此仅仅找到我想要的实际代码是相当困难的。

不仅是系统相关的东西,比如setjmp,甚至是可移植的函数,比如fprintf: 在每种情况下,我都很难在 C 中找到真正的定义。很容易找到开始,但它通常是一个空壳包装定义和宏。

这感觉就像现代版的 goto 语句一样,意大利面条问题又来了。

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


更新

例如,尝试查找hidden_defglibc 中的定义。这是一个带你去的宏hidden_def1,这是一个带你去的宏hidden_def2,这是一个带你去的宏hidden_asm,这是一个带你去的宏hidden_asm1,此时...

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

这并不罕见:它似乎是贯穿整个源代码的惯例。有人怎么追?GNU 开发人员如何遵循它?

标签: cglibc

解决方案


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

在https://code.woboq.org/userspace/glibchttps://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

我用火狐。我打字ctrl+f和打字hidden_def。输入 Enter 直到我# define hidden_defhttps://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550找到。

然后选择__hidden_ver1并键入ctrl+c ctrl+fctrl+v搜索它。在网络浏览器中。我输入 enter 直到找到https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#540__hidden_ver2就在第 542 行的下方。

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

这是一个带你到 hidden_​​def1 的宏

至少在 woboq.org 托管的版本中,没有您提到的此类宏。

有人怎么追?

虽然IDE是一个强大的帮助,但每个项目都是独一无二的,并且需要不同的设置,这需要时间来弄清楚。主要是浏览源代码grep(或更快的替代方案,例如ag,对于 glibc 等大型项目非常有用)并浏览结果列表。

不仅是系统相关的东西,比如 setjmp

开发人员是(应该是 :) 理智的人 - 在大多数情况下,名为的函数setjmp将位于名为setjmp.c. 或setjmp.S。或与setjmp.h. 或在名为stdlibor的目录setjmp中。

在 github 搜索栏中输入setjmphttps://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 这样的便携功能

如上所述,搜索名为 fprintf 的文件。你很快就能找到https://github.com/bminor/glibc/blob/master/stdio-common/fprintf.c


推荐阅读