[英]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/glibc或https://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+f
和ctrl+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
相同的目录中。 或者在名为stdlib
或setjmp
目录中。
在 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.