GDB Dis-Flavor 设置为 Intel,但显示 AT&T 风格
GDB Dis-Flavor set to Intel, but showing AT&T-style
我已经将 gdb-debugger 的 disassembly-flavor
设置为 Intel
(两者:su 和普通用户),但无论如何它仍然显示AT&T
表示法中的汇编代码:
patrick@localhost:~/Dokumente/Projekte$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) break main
Breakpoint 1 at 0x40050e: file firstprog.c, line 5.
(gdb) run
Starting program: /home/patrick/Dokumente/Projekte/a.out
Breakpoint 1, main () at firstprog.c:5
5 for(i=0; i < 10; i++)
(gdb) show disassembly
The disassembly flavor is "intel".
(gdb) info registers
rax 0x400506 4195590
rbx 0x0 0
rcx 0x0 0
rdx 0x7fffffffe2d8 140737488347864
rsi 0x7fffffffe2c8 140737488347848
rdi 0x1 1
rbp 0x7fffffffe1e0 0x7fffffffe1e0
(gdb) info register eip
Invalid register `eip'
我没有重新启动计算机。我的 OS 是 Kali Linux amd64。
我有以下问题:
- 为什么 gdb 仍然显示
AT&T
符号?
- 为什么寄存器
EIP
(指令指针)显示为无效寄存器?
您误解了反汇编风味的含义。这恰恰意味着:当您以人类可读的(大概)形式查看机器代码时,反汇编是什么样子的。
要打印寄存器(或在任何其他上下文中使用寄存器),您需要使用 $reg
,例如 $rip
或 $pc
、$eax
等。
如果我用 at&t 语法反汇编我的一个程序,gdb 会显示:
0x00000000007378f0 <+0>: push %rbp
0x00000000007378f1 <+1>: mov %rsp,%rbp
0x00000000007378f4 <+4>: sub [=10=]x20,%rsp
0x00000000007378f8 <+8>: movl [=10=]x0,-0x4(%rbp)
0x00000000007378ff <+15>: mov %edi,-0x8(%rbp)
0x0000000000737902 <+18>: mov %rsi,-0x10(%rbp)
=> 0x0000000000737906 <+22>: mov -0x10(%rbp),%rsi
0x000000000073790a <+26>: mov (%rsi),%rdi
0x000000000073790d <+29>: callq 0x737950 <FindLibPath(char const*)>
0x0000000000737912 <+34>: xor %eax,%eax
然后这样做:
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main(int, char**):
0x00000000007378f0 <+0>: push rbp
0x00000000007378f1 <+1>: mov rbp,rsp
0x00000000007378f4 <+4>: sub rsp,0x20
0x00000000007378f8 <+8>: mov DWORD PTR [rbp-0x4],0x0
0x00000000007378ff <+15>: mov DWORD PTR [rbp-0x8],edi
0x0000000000737902 <+18>: mov QWORD PTR [rbp-0x10],rsi
=> 0x0000000000737906 <+22>: mov rsi,QWORD PTR [rbp-0x10]
0x000000000073790a <+26>: mov rdi,QWORD PTR [rsi]
0x000000000073790d <+29>: call 0x737950 <FindLibPath(char const*)>
0x0000000000737912 <+34>: xor eax,eax
你可以看出区别。但是寄存器的名称以及您在 gdb 命令行上使用寄存器的方式并没有改变,在这两种情况下您都需要 $reg
。
我已经将 gdb-debugger 的 disassembly-flavor
设置为 Intel
(两者:su 和普通用户),但无论如何它仍然显示AT&T
表示法中的汇编代码:
patrick@localhost:~/Dokumente/Projekte$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) break main
Breakpoint 1 at 0x40050e: file firstprog.c, line 5.
(gdb) run
Starting program: /home/patrick/Dokumente/Projekte/a.out
Breakpoint 1, main () at firstprog.c:5
5 for(i=0; i < 10; i++)
(gdb) show disassembly
The disassembly flavor is "intel".
(gdb) info registers
rax 0x400506 4195590
rbx 0x0 0
rcx 0x0 0
rdx 0x7fffffffe2d8 140737488347864
rsi 0x7fffffffe2c8 140737488347848
rdi 0x1 1
rbp 0x7fffffffe1e0 0x7fffffffe1e0
(gdb) info register eip
Invalid register `eip'
我没有重新启动计算机。我的 OS 是 Kali Linux amd64。 我有以下问题:
- 为什么 gdb 仍然显示
AT&T
符号? - 为什么寄存器
EIP
(指令指针)显示为无效寄存器?
您误解了反汇编风味的含义。这恰恰意味着:当您以人类可读的(大概)形式查看机器代码时,反汇编是什么样子的。
要打印寄存器(或在任何其他上下文中使用寄存器),您需要使用 $reg
,例如 $rip
或 $pc
、$eax
等。
如果我用 at&t 语法反汇编我的一个程序,gdb 会显示:
0x00000000007378f0 <+0>: push %rbp
0x00000000007378f1 <+1>: mov %rsp,%rbp
0x00000000007378f4 <+4>: sub [=10=]x20,%rsp
0x00000000007378f8 <+8>: movl [=10=]x0,-0x4(%rbp)
0x00000000007378ff <+15>: mov %edi,-0x8(%rbp)
0x0000000000737902 <+18>: mov %rsi,-0x10(%rbp)
=> 0x0000000000737906 <+22>: mov -0x10(%rbp),%rsi
0x000000000073790a <+26>: mov (%rsi),%rdi
0x000000000073790d <+29>: callq 0x737950 <FindLibPath(char const*)>
0x0000000000737912 <+34>: xor %eax,%eax
然后这样做:
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main(int, char**):
0x00000000007378f0 <+0>: push rbp
0x00000000007378f1 <+1>: mov rbp,rsp
0x00000000007378f4 <+4>: sub rsp,0x20
0x00000000007378f8 <+8>: mov DWORD PTR [rbp-0x4],0x0
0x00000000007378ff <+15>: mov DWORD PTR [rbp-0x8],edi
0x0000000000737902 <+18>: mov QWORD PTR [rbp-0x10],rsi
=> 0x0000000000737906 <+22>: mov rsi,QWORD PTR [rbp-0x10]
0x000000000073790a <+26>: mov rdi,QWORD PTR [rsi]
0x000000000073790d <+29>: call 0x737950 <FindLibPath(char const*)>
0x0000000000737912 <+34>: xor eax,eax
你可以看出区别。但是寄存器的名称以及您在 gdb 命令行上使用寄存器的方式并没有改变,在这两种情况下您都需要 $reg
。