【发布时间】:2019-10-16 16:35:08
【问题描述】:
2019 年 12 月 2 日更新:
我在使用 m68k-elf 工具链时遇到了问题。我想做的是像这样翻译一个简单的68k汇编文件source.s:
.text
move.w %d0,%d1
进入一个目标文件,然后使用链接器脚本memmap.ldscript:
MEMORY
{
ROM1 (rx) : ORIGIN = 0x00, LENGTH = 16
ROM2 (rx) : ORIGIN = 0x10, LENGTH = 16
}
SECTIONS
{
.text :
{
*(.text)
} >ROM2
}
OUTPUT_FORMAT(binary)
将此目标文件链接到原始二进制文件。最终文件应如下所示(在十六进制编辑器中查看):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
如果我这样构建它
m68k-elf-as -o source.o source.s
m68k-elf-ld -T memmap.ldscript -o final.rom source.o
那么final.rom只包含:
30 01
所以节的代码被放置在 0x00 而不是 0x05。
我需要“原始”机器代码来刻录到 E(E)PROM。但我想使用链接器和链接器脚本能够将多个源文件中的部分组装成目标文件,然后将它们链接到一个最终的 ROM 中,其中部分位置由链接器脚本控制。 m68k-elf 可以吗?
【问题讨论】:
-
我认为这相当于在链接后执行 objcopy 步骤(其中包含该二进制行)。 gnu 将根据链接中的最低地址构建 rom 文件,因此如果您说 .text 从 0x05 开始,文件的第一个字节将是地址 0x05 的字节。如果你想填充它并制作一个内存图像样式的二进制文件,那么你需要将填充放在程序集中 .byte 0,0,0,0,0 并将地址设为 0x00。
-
如果您链接到 elf 或类似的东西,那么您将使用 objdump 或 readelf 或其他方式在正确的偏移量处看到您的指令,但是当您转换为二进制时,它将使用链接中的最低地址进行转换(0x05) 作为第一个字节。我的意思是,如果你制作了 .text 0x1000 和 .data 0x200,那么 objcopy -O 二进制文件的第一个字节就是 0x200 字节。如果你做了 .text 0x100 和 .data 0x200 那么第一个字节 0x100 地址等等。
-
ld --oformat=binary有帮助吗?