诡异的指令导致gdb step后程序segmentation fault

可以看到pc寄存器里面的是scanner_alloc+10的位置, 但是从反汇编源码,有效的指令位置是scanner_alloc+9。

gcc版本: gcc (Debian 8.3.0-6) 8.3.0
gdb版本: GNU gdb (Debian 8.2.1-2+b3) 8.2.1
image

是在偶然用gdb调试时,走到此位置,触发segmentation fault,起初怀疑是gdb的bug,在断点时把指令位置搞错了。

后面发现用objdump + addr2line去查看汇编和源码的对应关系时,也有此问题。。。

使用gcc (GCC) 15.2.1 20250924编译出来的代码,发现0x64指令前面填充了3个字节0x66 0x66 0x66,该问题就解决了,程序没有再crash了,指令也对上了。
image

image

(#.#)找到答案了:https://stackoverflow.com/questions/33429912/program-compiled-with-fpic-crashes-while-stepping-over-thread-local-variable-in

是gcc下cc1编译器的bug,0x64前面填充的0x66就是修复方案。

gcc修复的commit:https://github.com/gcc-mirror/gcc/commit/fd082a66f8be44616584164672eeb8e2779c5593#diff-02d1db6e2a85e54d6f2e085bdbb3fbe72d422fb0aa5c3c4b5f1497a810e7a304

posted @ 2026-05-23 14:51  yghr  阅读(10)  评论(0)    收藏  举报