将32位和64位代码链接到一个二进制文件中

时间:2018-03-25 06:12:33

标签: gcc x86-64 osdev binutils

在对这个问题的评论中, 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

0 个答案:

没有答案