prl*_*prl 6 gcc x86-64 osdev binutils
在对此问题的评论中, Unexpected Behaviour in simple Pointer Algoriths in kernel space C code 中,Michael Petch 写道,“64 位 ELF 格式支持 32 位代码段。”
我有一个工作程序,其中包含 32 位和 64 位代码以及它们之间的切换。我一直无法弄清楚如何将编译器生成的 32 位和 64 位代码链接在一起而不出现链接器错误,因此所有 32 位代码都是用汇编语言编写的。随着项目变得越来越复杂,32位汇编代码的维护也变得更加繁重。
这是我所拥有的:
test32.cc 是用-m32. 
所有其他源文件都是在没有该标志的情况下使用-mcmodel=kernel.
在链接描述文件中:
OUTPUT_FORMAT("elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
在生成文件中:
LD := ld
LDFLAGS := -Map $(TARGET).map -n --script $(LDSCRIPT)
$(LD) $(LDFLAGS) -b elf32-x86-64 $(OBJS64) -b elf32-i386 $(OBJS32) -o $@
我收到错误:
ld: i386 architecture of input file 'test32.o' is incompatible with i386:x86-64 output
将 OUTPUT_ARCH 更改为 i386 会导致所有 64 位目标模块出现类似错误。
我正在使用:
 gcc 5.4.1 
 GNU ld(GNU Binutils for Ubuntu)2.26.1