加断点时GDB反汇编地址不同

GDB disassembly address different when adding breakpoint

这是我的带有行号的函数


8 |  void function(char* string) {
9 |       char buffer[16];
10|      strcpy(buffer,string); 
11|  }

这是 gdb disassemble function 输出

0x000011d4 <+0>:    push   %ebp
0x000011d5 <+1>:    mov    %esp,%ebp
0x000011d7 <+3>:    push   %ebx
0x000011d8 <+4>:    sub    [=11=]x14,%esp
0x000011db <+7>:    call   0x123d <__x86.get_pc_thunk.ax>
0x000011e0 <+12>:   add    [=11=]x2e20,%eax
0x000011e5 <+17>:   sub    [=11=]x8,%esp           <---- I want Break point here
0x000011e8 <+20>:   pushl  0x8(%ebp)
0x000011eb <+23>:   lea    -0x18(%ebp),%edx
0x000011ee <+26>:   push   %edx
0x000011ef <+27>:   mov    %eax,%ebx
0x000011f1 <+29>:   call   0x1030 <strcpy@plt>
0x000011f6 <+34>:   add    [=11=]x10,%esp
0x000011f9 <+37>:   nop
0x000011fa <+38>:   mov    -0x4(%ebp),%ebx
0x000011fd <+41>:   leave  
0x000011fe <+42>:   ret    

如果我使用以下命令在 0x000011e5 设置断点,

(gdb) b *0x000011e5

和运行程序,gdb忽略所有断点并退出。

但是,如果我指定,
b 9,有效。
这是输出

(gdb) b 10
Breakpoint 1 at 0x4011e5: file hello.c, line 10.

为什么地址不同?

Why are the address different

因为你有一个与位置无关的可执行文件,它链接在地址 0,但在运行时重新定位到不同的地址。