编译32位的内核,该怎么编译linux内核处理

13264人阅读
Linux(53)
& & 一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序。
&& 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM64T)已经开始广泛的使用起来了,甚至于你现在要是想买32位的处理器根本就没有。64位的系统在性能和处理能力上相对32位系统也都有很大的提高。所以现在很多用户已经选择使用64位的系统了。
&&& 有一些软件,在安装过程中需要对部分代码进行编译以便在不同的发布版本都可以很好的运行。那么当我们在64位系统上安装32位的软件时,它的编译就会出错,因为软件的二进制部分是32位的,但是编译出来的部分是64位的,所以我们就需要让我们的64位系统可以编译32位的程序,并且需要默认就是编译32位的程序。
&& 通过查阅资料,发现可以使用-m32来使得gcc编译32位程序(在x86_64系统上),使用-m elf_i386参数可以使得64位的ld能够兼容32位的库,但是编译时是使用自己的一个命令,所以没有办法给他加参数,但是这个命令也是要调用gcc和ld得,所以我们可以通过修改gcc和ld来解决,也就是将上述的两个支持32位编译连接的参数默认给加上去:
将/usr/bin/gcc和/usr/bin/ld都改名为*.bin,就是改为: /usr/bin/gcc.bin和/usr/bin/ld.bin
然后写两个脚本:
/usr/bin/gcc:
gcc.bin -m32 $@
/usr/bin/ld:
ld.bin -m elf_i386 $@
& 这样就保证调用时将需要的参数加上,然后再调用真正的参数($@表示当前命令的所有参数,也就是把传给教本的所有参数再传给真正的命令),经测试可以解决问题。
可以用一个简单的C代码测试一下:
/* test.c */
#include &stdio.h&
int main()
printf(&sizeof long is %d\n&, sizeof(long));
}$ gcc test.c
$ file a.out
a.out: ELF 64-bit LSB executable ...
sizeof long is 8
&& 32位编译执行结果 (在64位系统编译32位程序需要给 GCC 加 -m32 参数):
$ gcc -m32 test.c
$ file a.out
a.out: ELF 32-bit LSB executable ...
sizeof long is 4
另外说明下在ubuntu上如果要用 -m32 参数就要安装如下的库:
$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib
如果每次在32位编译和64位编译之间切换的时候都要用mv指令移动,会很麻烦,可以用如下脚本来完成:
如果要64位编译那么就用gcc64.sh
mv -i /usr/bin/gcc /usr/bin/gcc.sh
mv -i /usr/bin/ld
/usr/bin/ld.sh
mv -i /usr/bin/gcc.bin /usr/bin/gcc
mv -i /usr/bin/ld.bin
/usr/bin/ld
如果用32位编译那么就用gcc32.sh:
mv -i /usr/bin/gcc /usr/bin/gcc.bin
mv -i /usr/bin/ld
/usr/bin/ld.bin
mv -i /usr/bin/gcc.sh /usr/bin/gcc
mv -i /usr/bin/ld.sh
/usr/bin/ld
参考链接:
.cn/s/blog_542eccgh.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:468502次
积分:5532
积分:5532
排名:第4084名
原创:120篇
转载:67篇
评论:59条
阅读:15711
阅读:5516
(2)(1)(10)(4)(22)(4)(3)(4)(4)(6)(2)(2)(3)(2)(2)(12)(10)(1)(2)(4)(1)(1)(5)(4)(8)(3)(4)(9)(1)(2)(7)(23)(6)(18)2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2017年3月 VC/MFC大版内专家分月排行榜第二2017年2月 VC/MFC大版内专家分月排行榜第二2016年8月 VC/MFC大版内专家分月排行榜第二2016年7月 VC/MFC大版内专家分月排行榜第二2016年6月 VC/MFC大版内专家分月排行榜第二2015年6月 VC/MFC大版内专家分月排行榜第二
2016年9月 VC/MFC大版内专家分月排行榜第三2016年4月 VC/MFC大版内专家分月排行榜第三2015年4月 VC/MFC大版内专家分月排行榜第三2012年8月 VC/MFC大版内专家分月排行榜第三
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。详解怎样进行内核编译及模块相关命令的使用方法
& & &在Linux的系统中有着 内核编译及模块相关命令,那么关于这个的方面,我们就要认真的来了解下了。所以今天我们就来讲解下怎样进行内核编译及模块相关命令的使用方法。
一 Linux内核相关信息
#查看Linux系统 &
[root@serv01 ~]# uname &
#查看所有信息 &
[root@serv01 ~]# uname -a &
Linux 2.6.32-131.0.15.el6.x86_64 #1 SMP Tue May 10 15:42:40 &
x86_64 x86_64 GNU/Linux &
#内核信息 &
[root@serv01 ~]# uname -r &
2.6.32-131.0.15.el6.x86_64 &
#/boot目录下 &
initrd-2.6.32-131.0.15.el6.x86_64kdump.img &
vmlinuz-2.6.32-131.0.15.el6.x86_64 &
#桌面版的内核存放位置 &
[root@larrywen boot]# cd/usr/src/kernels/2.6.32-131.0.15.el6.x86_64/ &
[root@larrywen 2.6.32-131.0.15.el6.x86_64]#ls &
arch &crypto & firmware &include ipc & & lib & & & mon &Module.symvers &samples security &System.map &usr &
block drivers &fs & & & &init & &kernel &Makefile &mm & & & & & & & net & & & & & & scripts &sound & &tools & & & virt &
#解压内核到/usr/src下 &
[root@serv01 ~]# tar -xvf linux-2.6.38.tar.gz-C /usr/src/ &
[root@serv01 ~]# cd /usr/src/linux-2.6.38/ &
[root@serv01 linux-2.6.38]# pwd &
/usr/src/linux-2.6.38 &
#已经安装好的版本有配置文件 &
[root@larrywen ule-sa2]# cd/usr/src/kernels/2.6.32-131.0.15.el6.x86_64/ &
[root@larrywen 2.6.32-131.0.15.el6.x86_64]#ls .config &
#查看配置文件 &
[root@serv01 linux-2.6.38]# vim/boot/config-2.6.32-131.0.15.el6.x86_64 &
#源码不区分32位和64位 &
#查看make帮助 &
#需要在linux-2.6.38目录下 &
[root@serv01 linux-2.6.38]# make help &
clean 清除,保留配置文件 &
mrproper 清除,不保留配置文件,更彻底 &
make menuconfig:图形界面 &
make xconfig:图形界面,需要安装QT &
#&*&:制作成内核 &
#&M&:制作成模块 &
二 编译配置
[root@serv01 linux-2.6.38]# make menuconfig &
&HOSTCC &scripts/basic/fixdep &
&HOSTCC &scripts/basic/docproc &
&HOSTCC &scripts/kconfig/conf.o &
&HOSTCC scripts/kconfig/kxgettext.o &
&***Unable to find the ncurses libraries or the &
&***required header files. &
&***'make menuconfig' requires the ncurses libraries. &
&***Install ncurses (ncurses-devel) and try again. &
make[1]: ***[scripts/kconfig/dochecklxdialog] Error 1 &
make: *** [menuconfig] Error 2 &
[root@serv01 linux-2.6.38]# yum install&ncurses-devel& -y &
#OCFS:Oracle Class FileSystem &
#配置后生成.config文件 &
[root@serv01 linux-2.6.38]# ls .config &
[root@serv01 linux-2.6.38]# vim Makefile &
[root@serv01 linux-2.6.38]# lsarch/x86/boot/ -d &
arch/x86/boot/ &
[root@serv01 linux-2.6.38]# make bzImage &
Root device is (8, 2) &
Setup is 14908 bytes (padded to 15360bytes). &
System is 3704 kB &
Kernel: arch/x86/boot/bzImage is ready &(#1) &
四 编译模块
[root@serv01 linux-2.6.38]# make modules &
五 安装模块
[root@serv01 linux-2.6.38]# makemoudule_install &
#make moudule_install拷贝到该目录 &
[root@serv01 linux-2.6.38]# ls/lib/modules/2.6.32-131.0.15.el6.x86_64/kernel/ &
[root@serv01 linux-2.6.38]# ls/lib/modules/2.6.38/kernel &
#出现这个错误是因为交换分区过小 &
/bin/sh: line 1: 10010 Killed & & & & & & & & &/sbin/depmod -ae -F System.map2.6.38 &
make: *** [_modinst_post] Error 137 &
[root@serv01 linux-2.6.38]# make install &
#可以比较下已有版本和编译的版本的不同,(编译版本:没选防火墙) &
[root@serv01 linux-2.6.38]# ls/lib/modules/2.6.38/kernel/net/ &
802 & 9p & bluetooth &can &dccp & & & & &ieee802154 &ipv6 llc & & & phonet &rfkill sctp & &wimax & & xfrm &
8021q atm &bridge & & core dns_resolver &ipv4 & & & &key &mac80211 &rds & & sched &sunrpc &wireless &
[root@serv01 linux-2.6.38]# ls/lib/modules/2.6.32-131.0.15.el6.x86_64/kernel/net/ &
802 & 9p & bluetooth &can &dccp & & & &ipv4 &key mac80211 & phonet &rfkill sctp & &wimax & & xfrm &
8021q atm &bridge & & core ieee802154 &ipv6 &llc netfilter &rds & & sched &sunrpc &wireless &
[root@serv01 linux-2.6.38]# ls /lib/modules/2.6.38/kernel/fs/ntfs/ntfs.ko &
[root@serv01 linux-2.6.38]# ls/boot/grub/grub.conf &
/boot/grub/grub.conf &
[root@serv01 linux-2.6.38]# cat/boot/grub/grub.conf &
# grub.conf generated by anaconda &
# # Note that you do not have to rerun grubafter making changes to this file &
# # NOTICE: You have a /boot partition. &Thismeans that &
# # & & & & all kernel and initrd paths are relative to /boot/, eg. &
# # & & & & root (hd0,0) &
# # & & & & kernel /vmlinuz-version ro root=/dev/sda2 &
# # & & & & initrd /initrd-[generic-]version.img &
# #boot=/dev/sda &
default=0 &
timeout=5 &
splashimage=(hd0,0)/grub/splash.xpm.gz &
hiddenmenu &
title Red Hat Enterprise Linux(2.6.32-131.0.15.el6.x86_64) &
& & & &root(hd0,0) &
& & & & & & &kernel/vmlinuz-2.6.32-131.0.15.el6.x86_64 ro &
& & & & & & &root=UUID=110fab7c-85c4-4bae-ada24d8rd_NO_LUKS &
& & & & & & &rd_NO_LVM rd_NO_MD rd_NO_DMLANG=en_US.UTF-8 &
& & & & & & &SYSFONT=latarcyrheb-sun16KEYBOARDTYPE=pc KEYTABLE=us &
& & & & & & &crashkernel=auto rhgb quiet &
& & & & & & & & & & initrd/initramfs-2.6.32-131.0.15.el6.x86_64.img &
[root@serv01 linux-2.6.38]# cat/boot/grub/grub.conf &
#/boot目录下新生成的文件 &
initramfs-2.6.38.img &
vmlinuz-2.6.38 &
#会在这个文件中新加一个内核信息 &
[root@serv01 linux-2.6.38]# cat/boot/grub/grub.conf &
#出现错误一般是交换分区过小,我们可以增加交换分区。如何增加交换分区,请参考此文:系统运维技巧(三)&&利用dd命令增加交换分区 &
七 模块相关命令使用
#查看当前系统加载的模块 &
[root@serv01 linux-2.6.38]# lsmod &
#手工加载模块 &
[root@serv01 linux-2.6.38]# cd/lib/modules/2.6.38 &
[root@serv01 linux-2.6.38]# cd kernel/ns &
[root@serv01 linux-2.6.38]# insmod/lib/modules/2.6.38/kernel/fs/fat/fat.ko &
[root@serv01 linux-2.6.38]# lsmod |grep fat &
[root@serv01 linux-2.6.38]# insmod/lib/modules/2.6.38/kernel/fs/fat/vfat.ko &
[root@serv01 linux-2.6.38]# lsmod |grep fat &
#卸载模块,可以跟模块名,也可以跟全路径 &
[root@serv01 linux-2.6.38]# rmmod fat &
ERROR:Module fat is in use by vfat &
[root@serv01 linux-2.6.38]# rmmod vfat &
[root@serv01 linux-2.6.38]# lsmod |grep fat &
#模块之间有依赖,先加这个不能加上 &
[root@serv01 linux-2.6.38]# insmod/lib/modules/2.6.38/kernel/fs/fat/vfat.ko &
#自动处理依赖关系,不需要加全路径 &
[root@serv01 linux-2.6.38]# modprobe vfat &
[root@serv01 linux-2.6.38]# lsmod |grep fat &
#-r参数,表示remove &
[root@serv01 linux-2.6.38]# modprobe -r fat &
[root@serv01 linux-2.6.38]# modprobe -rvfat &
#记录模块依赖 &
[root@serv01 linux-2.6.38]# vim/lib/modules/2.6.32-131.0.15.el6.x86_64/modules.dep &
[root@larrywen pdf]# pwd &
/opt/soft/ule-sa2/pdf &
[root@larrywen pdf]# ls ule-kerenl.pdf &
ule-kerenl.pdf &
[root@larrywen pdf]# ls ule-module.pdf &
ule-module.pdf &
#查看模块信息 &
[root@serv01 linux-2.6.38]# modinfo vfat &
filename: & & &/lib/modules/2.6.32-131.0.15.el6.x86_64/kernel/fs/fat/vfat.ko &
author: & & & & Gordon Chaffee &
description: & &VFAT filesystem support &
license: & & & &GPL &
srcversion: & & ACCC2F7E976 &
depends: & & & &fat &
vermagic: & & & 2.6.32-131.0.15.el6.x86_64 SMPmod_unload modversions2012年11月 挨踢职涯大版内专家分月排行榜第二2011年9月 Linux/Unix社区大版内专家分月排行榜第二
2012年1月 Linux/Unix社区大版内专家分月排行榜第三2011年8月 C/C++大版内专家分月排行榜第三2011年8月 Linux/Unix社区大版内专家分月排行榜第三2010年4月 C/C++大版内专家分月排行榜第三
2012年11月 挨踢职涯大版内专家分月排行榜第二2011年9月 Linux/Unix社区大版内专家分月排行榜第二
2012年1月 Linux/Unix社区大版内专家分月排行榜第三2011年8月 C/C++大版内专家分月排行榜第三2011年8月 Linux/Unix社区大版内专家分月排行榜第三2010年4月 C/C++大版内专家分月排行榜第三
2012年11月 挨踢职涯大版内专家分月排行榜第二2011年9月 Linux/Unix社区大版内专家分月排行榜第二
2012年1月 Linux/Unix社区大版内专家分月排行榜第三2011年8月 C/C++大版内专家分月排行榜第三2011年8月 Linux/Unix社区大版内专家分月排行榜第三2010年4月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 怎么编译内核 的文章

 

随机推荐