如何让GDB反汇编整个函数?汇编跳转代码反汇编不完整问题
如何让GDB完整反汇编自定义汇编函数?
我太懂你这个痛点了!你写的这段汇编代码逻辑没问题,但GDB只反汇编到cond标签前,本质是因为GDB默认靠符号表的元数据来识别函数的边界,而你手动写的汇编没给它足够的判断信息。
先看你原有的代码:
function: cmp $1, %rax je cond mov $0, %rdi jmp end cond: mov $1, %rdi end: mov $60, %rax syscall
在这段代码里,function只是一个普通标签,汇编器不会主动告诉GDB它是一个完整的函数,也没指定它的结束位置。GDB看到下一个符号cond,就默认function的范围到cond之前为止,自然就看不到后面的代码了。而C编译器生成的代码会自动添加函数类型的元数据和长度信息,GDB能准确识别整个函数的范围。
下面给你两个最实用的解决方法:
方法1:修改汇编代码,添加函数元数据
给汇编器明确标记function是一个函数,并指定它的长度,这样GDB就能直接识别整个函数的范围了。修改后的代码如下:
.type function, @function # 标记这是一个函数符号 function: cmp $1, %rax je cond mov $0, %rdi jmp end cond: mov $1, %rdi end: mov $60, %rax syscall .size function, .-function # 指定函数长度:当前地址减去function的起始地址
用这个代码汇编后,再输入disas function,GDB就会完整显示从function到end的全部代码了——因为.type和.size指令给ELF文件的符号表添加了函数的类型和长度信息,GDB能准确读取到。
方法2:在GDB中手动指定反汇编范围
如果不想修改汇编代码,也可以在GDB里直接指定要反汇编的起始和结束符号,比如:
disas function, end
这个命令会强制GDB反汇编从function标签到end标签之间的所有代码,直接绕过符号表的限制,快速看到完整的函数逻辑。
另外还有个小技巧:如果不知道结束符号,也可以用地址范围,比如disas function,+32(假设函数大概32字节长),但指定标签的方式显然更准确。
内容的提问来源于stack exchange,提问作者AAJ
相关产品推荐
相关产品推荐

