我最近在为基于 Motorola 68000 的系统(SEGA Mega Drive)链接多个目标文件时遇到了一个小问题。问题是,当一个目标文件的输入段结束而下一个开始时,链接器用零填充内存地址,以便下一个目标文件开始在四字节边界上对齐。下面的文本是链接器输出的内存映射。如您所见,.text 输出部分包含三个目标文件。前两个(main.o、swap.o)是用 C 语言编写的,使用m68k-elf-gcc编译和组装。第三个(swap_asm.o)是用68000汇编手写的,使用vasm组装. swap.o 开头的函数通常从地址 0x0000001E 开始。但是,链接器用两个字节*填充*swap.o文件的开头,特别是0x0000。所以,swap.o 从 0x00000020 开始。但是,swap_asm.o 没有对齐,而是从一个非四字节对齐的地址 0x00000036 开始。有没有办法让链接器不添加任何填充并立即启动 swap.o?我知道有一些解决方法,比如用 NOP 填充空间,但我想知道是否有办法不做 *fill*?
.text 0x00000000 0x4c
main.o(.text)
.text 0x00000000 0x1e main.o
0x00000000 main
swap.o(.text)
*fill* 0x0000001e 0x2
.text 0x00000020 0x16 swap.o
0x00000020 swap
swap_asm.o(.text)
.text 0x00000036 0x16 swap_asm.o
0x00000036 swap_asm