一个操作系统的实现中关于64位和32位的问题


  linux X86_64在进行汇编连接的时候出问题。64位系统和32位文件问题。

  汇编用nasm编译,C用gcc编译。编译没有出现问题,都生成64位文件,提供给32位操作系统使用时链接的时候出现了问题,需要加上一些参数。

  用nasm编译生成ELF文件,也就是简单的内核。

  使用汇编编写Hello world时,指令ld -s-o hello hello.o改为ld-m elf_i386 -s-o hello hello.o,加上了-m elf_i386这些参数。原因是我们编译的时候是编译成i386的目标文件(nasm -f elf hello.asm),这个是给32位的elf,所以连接的时候也要指明i386。

  使用汇编+C语言编写Hello world时,指令gcc -c bar.c -o bar.o改为gcc -m32  -c  bar.c  -o bar.o;指令ld -s -o foobar bar.o foo.o改为ld -m elf_i386 -s -o foobar foo.o bar.o。前者加上了-m32这个参数,让gcc 产生32位的代码,后者像上面那样加上了-m elf_i386这些参数,就是说在链接的时候以32位的方式进行链接。

  具体的-m32 和 -m elf_i386 请自行查阅gcc (man gcc)。

  如果你是高版本的gcc(可能是由于更新内核造成的),可能简单的使用-m32 的时候会提示以下错误:

   > In file included from /usr/include/stdio.h:28:0,
   > from test.c:1:
   > /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
   > compilation terminated.

  这应该是缺少构建32 位可执行程序缺少的包,使用以下指令安装:
  sudo apt-get install libc6-dev-i386
  搞定。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值