一个操作系统的实现中关于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
搞定。
汇编用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
搞定。
相关文章推荐
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- VB实现的16位和32位md5加密代码分享
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- C#实现判断操作系统是否为Win8以上版本
- VB的32位程序在64位系统中出现文件和注册表自动转向的解决方法
- 解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)[原创]_php技巧_脚本之家
- js获取本机操作系统类型的两种方法
- Linux操作系统添加新硬盘方法
- Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
- java如何获取本地操作系统进程列表
- Linux rdesktop操作系统下远程登录Windows XP桌面
- 32位操作系统认出超出4G内存的方法
- C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
- Linux rpm tar 操作系统下软件的安装与卸载方法
- JavaScript 获取用户客户端操作系统版本
- jsp 获取客户端的浏览器和操作系统信息