繁体   English   中英

如何导航 glibc 源代码?

[英]How to navigate glibc source?

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

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

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

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


更新

例如,尝试在 glibc 中hidden_def的定义。 这是一个带你到hidden_def1的宏,这是一个带你到hidden_def2的宏,这是一个带你到hidden_asm的宏,这是一个带你到hidden_asm1的宏,此时......

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

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

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

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

如果要在本地索引项目,请使用 cscope、ctags、GLOBAL 标签或 clangd 来索引项目,然后使用该工具特定的界面来搜索定义。

例如,尝试在 glibc 中查找 hidden_​​def 的定义

在 google 中hidden_def glibc 我的第一个点击是 woboq.org https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550

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

然后选择__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相同的目录中。 或者在名为stdlibsetjmp目录中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM