GCC、glibc、栈展开和重定位 - 一个战争故事

主要观点:作者一直想写一篇关于特定 bug 的文章,介绍了在 Wolfi OS 中调试 glibc 相关 bug 的过程,包括感谢相关人员、背景故事、重现 bug、初始调试、寻找最小可重现示例、GCC 15 的影响、深入研究 glibc 和 libgcc、二分 GCC 以及上游修复等。
关键信息

  • 感谢朋友 Gabriel F. T. Gomes 和队友 Dann Frazier 以及上游 GCC 和 glibc 开发者。
  • Wolfi OS 有设置 C/C++强化编译器标志的包,其中 -z now 和 -fno-strict-aliasing 对 bug 重要。
  • 安装 py3-matplotlib 或 Emacs 会导致 glibc 崩溃,通过 GDB 调试得到堆栈跟踪。
  • 尝试创建最小可重现示例,最终编写简单程序触发问题。
  • GCC 15 上传后,bug 在新的 glibc 构建中消失,经调试发现是 GCC 15 中的一个提交导致。
  • 上游最终找到并修复了真正的问题,是链接器定义 __ehdr_start 的方式有问题。
    重要细节
  • 在初始调试中,对堆栈跟踪的分析发现问题与栈展开有关,但 Emacs 源代码中未找到奇怪之处。
  • 二分 GCC 花费了几天时间,找到可能修复 bug 的提交,但仍不理解其原因。
  • 上游修复添加了优化屏障以防止编译器进行重定位。
  • 作者打算以后多写这类 bug 的博客,且还有一个关于 glibc 的 bug 待写。
  • 解释了 -z now 和 -fno-strict-aliasing 标志的重要性及相关讨论。
阅读 10
0 条评论