c - 如何导航 glibc 源?
问题描述
我正在尝试学习 glibc 源代码,并且发现导航非常强大。我不是指代码本身,而是简单地找到它:它似乎是一个宏和包装器的迷宫,因此仅仅找到我想要的实际代码是相当困难的。
不仅是系统相关的东西,比如setjmp
,甚至是可移植的函数,比如fprintf
: 在每种情况下,我都很难在 C 中找到真正的定义。很容易找到开始,但它通常是一个空壳包装定义和宏。
这感觉就像现代版的 goto 语句一样,意大利面条问题又来了。
如何导航 glibc 并找到 lib 函数的实际实现?
更新
例如,尝试查找hidden_def
glibc 中的定义。这是一个带你去的宏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 的定义
输入hidden_def glibc
谷歌。我的第一个目标是 woboq.org https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550。
我用火狐。我打字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
搜索它。在网络浏览器中。我输入 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
or的目录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。
推荐阅读
- javascript - 加载资源失败:服务器响应状态为 400()
- python - 使用 Pillow 为图像添加水印
- ios - Xcode tableView didSelectRowAt 无法正常工作
- actionscript-3 - Adobe AIR Flex:动态改变 VGroup 的宽度
- python - 测试结果显示 0 次测试运行
- mongodb - mongodb中的条件检查和查找
- java - Wildfly 版本 23 在部署 WAR 时出错并且无法配置组件
- java - Webflux 将 Mono 的结果存储到会话变量
- google-apps-script - 是否有任何 api 可以邀请新用户松弛工作空间(无偿)?
- kubernetes - 如何从 Helm Repository 获取 Helm Chart 的特定 appVersion