您的位置:首页 > 其它

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

2016-07-22 23:44 369 查看
  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

  搞定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统 32位 64位