Сказать, что у меня есть исполняемый двоичный файл, полученный в результате компиляции некоторого кода C, и его имя a.out
.
Как известно, разобрать его можно командой objdump -d a.out
. Вот пример:
00000000004006b6 <main>:
4006b6: 55 push %rbp
4006b7: 48 89 e5 mov %rsp,%rbp
4006ba: 89 7d ec mov %edi,-0x14(%rbp)
4006bd: 48 89 75 e0 mov %rsi,-0x20(%rbp)
4006c1: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%rbp)
4006c8: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%rbp)
4006cf: 8b 55 f4 mov -0xc(%rbp),%edx
4006d2: 8b 45 f8 mov -0x8(%rbp),%eax
4006d5: 01 d0 add %edx,%eax
4006d7: 89 45 fc mov %eax,-0x4(%rbp)
...
...
Теперь я хочу знать, можем ли мы перечислить код C, соответствующий разборке, что означает что-то, как показано ниже:
4006c1: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%rbp) // int i = 1;
4006c8: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%rbp) // int j = 2;
Одним словом, я знаю, что movl $0x2,-0x8(%rbp)
- это присвоить переменной целое число 2
, но, как вы видите, это не очень ясно, я думаю, есть ли какой-нибудь способ автоматически и немедленно перевести movl $0x2,-0x8(%rbp)
в int j = 2
, это было бы очень полезный.
objdump -dS
чередует разборку со строками исходного кода. В неоптимизированном коде это довольно просто. - person Peter Cordes   schedule 20.01.2020