GNU 汇编程序 .long 声明归零

GNU Assembler .long Declaration Zeroed Out

使用 GNU Binutils 声明汇编代码时,例如:

.long MY_Label
.long MY_Second_label

Assemble 没有错误,但在进行十六进制转储时始终映射为清零的 32 位字符串,即使操作码和其他信息在地址 space 中将它们分开也是如此。我正在编译:

m68k-elf-gcc -c hello.s -o rom.o -nostdlib -static && m68k-elf-objcopy -O binary rom.o rom.bin

并转储我的二进制文件:

m68k-elf-objdump -D -m m68k --start-address=0x0000 --prefix-addresses -l -x -b binary --disassemble-zeroes rom.bin

我的汇编代码中缺少什么?

您从未 link 编辑过您的 .o 可重定位地址,因此地址仍然是占位符。 -c 告诉 GCC 不要 link,只是 assemble,所以 -static-nostdlib 没有意义。

如果您使用 objdump -drwC rom.o,您会在反汇编(-r 选项)旁边看到符号重定位。

从初始命令中删除 -c 并保持其他所有内容相同:

m68k-elf-gcc  hello.s -o rom.elf  -nostdlib -static