使用GDB调试x86汇编时遇符号文件无代码段错误求助
问题原因与解决方案
核心问题
你的汇编代码没有将执行代码放入标准的.text代码段,而是把_start入口点的指令直接写在了.data数据段之后。GNU汇编器(GAS)不会自动为代码创建.text段,这导致链接生成的可执行文件没有可识别的代码段,GDB因此报错Can't find any code sections in symbol file。
修正后的汇编代码
将_start的执行代码移到显式声明的.text段中,调整后的dodawanie.s如下:
.code32 SYSCALL = 0x80 SYSEXIT = 1 EXIT_SUCCESS = 0 SYSWRITE = 4 STDOUT = 1 .global _start .text # 显式标记可执行代码段 _start: mov $SYSEXIT, %eax mov $EXIT_SUCCESS, %ebx int $SYSCALL .data # 数据段放在代码段之后 liczba1: .long 0x10304008, 0x701100FF, 0x45100020, 0x08570030 liczba2: .long 0xF040500C, 0x00220026, 0x321000CB, 0x04520031 number1: .long 0xFF, 0xFF, 0x01, 0xFF number2: .long 0xEE, 0xEE, 0xE1, 0xEE
修正后的Makefile
你之前添加的-g参数是多余的,as的--gstabs选项已经足够生成调试信息。恢复讲师提供的Makefile即可:
all: dodawanie dodawanie: dodawanie.o ld dodawanie.o -o dodawanie dodawanie.o: dodawanie.s as --gstabs dodawanie.s -o dodawanie.o
验证步骤
- 执行
make重新编译生成可执行文件 - 启动GDB:
gdb dodawanie - 此时GDB可以正常识别代码段,你可以通过
break _start设置断点,run启动程序,再用info stack或x/10x $esp观察栈内容
额外提示
当前代码仅执行退出系统调用,几乎没有栈操作。如果需要观察栈内容的变化,建议添加压栈/弹栈指令,例如:
_start: push %eax # 将eax寄存器值压入栈 push %ebx # 将ebx寄存器值压入栈 pop %ebx # 从栈弹出值到ebx pop %eax # 从栈弹出值到eax mov $SYSEXIT, %eax mov $EXIT_SUCCESS, %ebx int $SYSCALL
内容的提问来源于stack exchange,提问作者Quarol
相关产品推荐
相关产品推荐

