Почему следующая инструкция не попадает в GDB? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть следующая программа, exitc.s:

[OP@localhost linking]$ cat exitc.s
    .section .text
    .globl _start

_start:
    call exit

Построен следующим образом:

[OP@localhost linking]$ as exitc.s -o exitc.o
[OP@localhost linking]$ ld exitc.o -o exitc -lc -I /usr/lib64/ld-linux-x86-64.so.2 

При запуске через gdb происходит следующее:

(gdb) disas _start
Dump of assembler code for function _start:
   0x0000000000401020 <+0>: callq  0x401010 <exit@plt>
End of assembler dump.
(gdb) break *_start
Breakpoint 1 at 0x401020
(gdb) run
Starting program: /path/to/linking/exitc 

Breakpoint 1, 0x0000000000401020 in _start ()
(gdb) disas _start
Dump of assembler code for function _start:
=> 0x0000000000401020 <+0>: callq  0x401010 <exit@plt>
End of assembler dump.
(gdb) si
0x0000000000401010 in exit@plt ()
(gdb) disas 0x401010
Dump of assembler code for function exit@plt:
=> 0x0000000000401010 <+0>: jmpq   *0x2002(%rip)        # 0x403018 <exit@got.plt>
   0x0000000000401016 <+6>: pushq  $0x0
   0x000000000040101b <+11>:    jmpq   0x401000
End of assembler dump.
(gdb) si
0x0000000000401016 in exit@plt ()
(gdb) disas 0x401010
Dump of assembler code for function exit@plt:
   0x0000000000401010 <+0>: jmpq   *0x2002(%rip)        # 0x403018 <exit@got.plt>
=> 0x0000000000401016 <+6>: pushq  $0x0
   0x000000000040101b <+11>:    jmpq   0x401000
End of assembler dump.

Почему на последнем этапе сборки не происходит переход?

1 Ответ

0 голосов
/ 10 апреля 2019

Почему на последнем шаге сборки не происходит переход?

JUMP выполняет , но просто переходит к следующей инструкции.

Это вполне ожидаемо, и именно так работает ленивое разрешение символов.Вы можете прочитать об этом, например, здесь .

...