在对这个问题的评论中, Unexpected behaviour in simple pointer arithmetics 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)
在Makefile中:
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(Ubuntu的GNU Binutils)2.26.1