因为操作系统内核程序kernel实现的功能很多,为了减少编写难度,肯定要使用C语言编写,这就要求内核是在保护模式下使用汇编和C语言编写的。并且为了内核调试方便,选择生成ELF格式的内核程序。并且内核的汇编代码肯定是已经进入保护模式下编写的,才能够和C语言编写的代码链接在一起。
当时书上的操作系统环境、编译环境、汇编源码等等都是32位的,但是现在大部分都是64位了,所以大部分命令可能都需要增加32位标志才可以使用。
--汇编程序编译链接
nasm -f elf32 hello.asm -o hh32.o
ld -m elf_i386 -o hh32 hh32.o
nasm -f elf64 hello.asm -o hh64.o
ld -m elf_x86_64 -o hh64 hh64.o
------------------------------------------------------------c语言程序编译命令
------hello.c
#include <stdio.h>
main()
{
printf("Hello World!\n");
}
--C语言程序编译链接
gcc -m32 -o hello32 hello.c
gcc -m64 -o hello64 hello.c
--查看elf信息
readelf -h hh32
readelf -h hh64
readelf -l hh32
readelf -l hh64
--查看elf信息
readelf -h hello32
readelf -h hello64
readelf -l hello32
readelf -l hello64
因为操作系统环境、编译环境都是64位的了,有时候编译32位程序可能会报错,是因为没有安装32位的库文件。
解决在linux下编译32程序
gcc -m32 -o hello32 hello.c 报错
出现“/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录问题”
centos64位编译32位代码,出现/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录,需要安装32位的glibc库文件。
安装32位glibc库文件命令:
sudo yum install glibc-devel.i686(安装C库文件)
sudo dnf install glibc-devel.i686(fedora命令)
安装32位glibc++库文件命令
sudo yum install libstdc++-devel.i686
sudo dnf install libstdc++-devel.i686(fedora命令)