分类: LINUX
2011-07-12 15:35:06
目录
------------------------------------
0.交叉编译环境的搭建
1.环境变量设置
2.busybox移植及根文件系统的构建
3.Xserver移植
4.matchbox移植
5.gtk移植
6.测试
0.交叉编译环境的搭建
-------------------------------------
所需要的交叉编译工具链:S3C6410X Tool Chain 4.2.2 - EABI V0.0 - cross-4.2.2-eabi.tar
0.1.解压上述工具链获得文件夹:4.2.2-eabi/
0.2.在/usr/local/下面创建目录arm/ (注意,最好是放到这个目录,不然在以后的编译过程中可能出现一些错误)
0.3.将目录4.2.2-eabi/移动到/usr/local/arm/下面
0.4.设置环境变量:
编辑/etc/profile文件,在文件末尾添加:
PATH="$PATH:/usr/local/arm/4.2.2-eabi/usr/bin"
export PATH
使环境变量生效:
在终端输入命令: source /etc/profile
测试环境变量是否设置成功:
在终端输入:echo $PATH,如果输出的路径中包含了/usr/local/arm/4.2.2-eabi/usr/bin则说明环境变量设置成功
0.5.测试交叉编译工具链
在终端输入:arm-linux-gcc -v
显示如下:
Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with: /home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-unknown-linux-gnueabi --enable-languages=c,c++ --with-sysroot=/usr/local/arm/4.2.2-eabi/ --with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/usr/local/arm/4.2.2-eabi//gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t --with-float=soft --enable-cxx-flags=-msoft-float
Thread model: posix
gcc version 4.2.2
说明交叉编译工具链已经安装成功。
0.6需要修正的库的位置(将libc从2.6替换成2.7版的)
从 下载 libc6-dbg_2.7-10ubuntu3-mojo1_arm.deb并解压拷贝对应的文件覆盖到工具链的对应位置
sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/usr/lib/gconv/* /usr/local/arm/4.2.2-eabi/usr/lib/gconv
/
sudo cp -rfv /home/hanjinlai/Download/mojoarmchain/libc6-dbg_2.7-10ubuntu3-mojo1_arm/usr/lib/debug/ /usr/local/arm/4.2.2-eabi/lib/
1.环境变量设置
-------------------------------------
export PREFIX=/home/hanjinlai/Work/X/target/usr
export CC=arm-linux-gcc
export PKG_CONFIG_PATH=/home/hanjinlai/Work/X/target/usr/lib/pkgconfig
export LD_LIBRARY_PATH=/home/hanjinlai/Work/X/target/usr/lib
2.busybox移植
-------------------------------------
2.1.创建根文件系统目录rootfs及其子目录bin,sbin,boot,root,sys,srv,proc,usr等
2.2.编译busybox1.7.0:(所需要的源码包:busybox-1.7.0.tar.bz2)
2.2.1解压源码包,进入源码目录;
2.2.2配置busybox:在源码目录执行make menuconfig, 如果使用默认配置则直接退出、保存,如果需要配置自己的则更改相应的选项再保存退出。
选上以下选项可以支持Tab补全功能
Busybox Settings--->
Busybox Library Tuning--->
[ ] Tab competion
已经支持了mount nfs功能
2.2.3修改源码目录的Makefile:
将175行: ARCH ?= $(SUBARCH) 修改为: ARCH ?= arm
将176行: CROSS_COMPILE ?= 修改为: CROSS_COMPILE ?= arm-linux-
2.2.4正式编译busybox:在源码目录执行make编译
2.2.5安装busybox: 执行命令 make CONFIG_PREFIX=/***/rootfs(根文件系统目录) install
2.3.拷贝glibc库相关文件到根文件系统
glibc相关库文件在交叉编译工具链中已经有了,可以直接拷贝过来用
$ sudo cp /usr/local/arm/4.2.2-eabi/lib/*.so* /***/rootfs/lib/ -d
$ sudo cp /usr/local/arm/4.2.2-eabi/usr/arm-unknown-linux-gnueabi/lib/*.so* /***/rootfs/lib/ -d
2.4.创建配置文件:
2.4.1创建/etc/inittab, 内容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
2.4.2创建/etc/init.d/rcS,内容如下:(创建完成后改变其属性使它可以执行sudo chmod +x /etc/init.d/rcS)
#!/bin/sh(这段脚本主要用来自动生成设备文件)
#ifconfig eth0 192.168.1.17
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
2.4.3创建/etc/fstab文件,内容如下:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2.5.创建设备文件
在根文件系统的/dev目录下执行
$sudo mknod console c 5 1
$sudo mknod null c 1 3
这样我们的最基本的根文件系统就做好了。
2.6.测试已经制作好的根文件系统
在 PC上安装mkcramfs包,以便可以制作cramfs格式的文件
制作出根文件系统: $mkcramfs /***/rootfs/ rootfs.cramfs
烧录uboot,kernel,rootfs到开发板并重启开发板(如何烧录这些内容请参考第三节:内核及文件系统镜像的烧写)
系统正常启动,并进入shell,测试成功。
2.7.测试基本的C程序在根文件系统的运行
在PC上写一个最简单的hello.c程序:
#include
int main()
{
printf("hello!\n");
return 0;
}
编译程序:$arm-linux-gcc -o hello hello.c
将编译出来的hello复制到根文件系统的/bin或/sbin或/usr/bin或/usr/sbin等任一目录
重新制作根文件系统镜像rootfs.cramfs
重新烧写根文件系统镜像到开发板
重启动开发板,进入shell,执行hello程序,显示hello!
测试成功。
3.Xserver移植
---------------------------------------
3.1移植ncurses-5.6
$tar xzf ncurses.tar.gz
$cd ncurses-5.6
$./configure --host=arm-linux --with-shared --prefix=$PREFIX
$make
$make install
3.2移植libtool
$tar xzf libtool_1.5.6.orig.tar.gz
$cd libtool_1.5.6
$./configure --host=arm-linux --prefix=$PREFIX
$make
$make install
3.3移植zlib
$tar xzf zlib-1.2.3.tar.gz
$cd zlib-1.2.3
$./configure --shared --prefix=$PREFIX
$make
$make install
3.4移植libpng
$tar xjf libpng-1.2.23.tar.bz2
$cd libpng-1.2.23
$ ./configure --host=arm-linux --prefix=$PREFIX
$make
$make install
3.5移植expat
$tar xzf expat-2.0.1.tar.gz
$cd expat-2.0.1
$./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
$make
$make install
3.6移植freetype
$tar xzf freetype-2.3.9.tar.gz
$cd freetype-2.3.9
$ ./configure --host=arm-linux --build=i386-linux --target=arm-linux --prefix=$PREFIX
$make
$make install
3.7移植libxml2.0
$tar xzf libxml2-2.6.30.tar.gz
$cd libxml2-2.6.30
$ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
$make
$make install
3.8移植fontconfig-2.6.0
$tar xzf fontconfig-2.6.0.tar.gz
$cd fontconfig-2.6.0
$ ./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --disable-static --with-confdir=$PREFIX/etc/fonts --enable-libxml2 --with-arch=arm
$make
$make install
3.9移植libdrm
$tar xjf libdrm-2.3.0.tar.bz2
$cd libdrm-2.3.0
$ ./configure --host=arm-linux --build=i386-linux --prefix=$PREFIX
$make
$make install
3.10移植openssl
$tar xjf openssl-0.9.8g.tar.gz
$cd openssl-0.9.8g
$./config --prefix=$PREFIX shared zlib-dynamic enable-camellia
$make depend
$make install
3.11移植Xserver(《参考于嵌入式linux应用开发完全手册》一书)
X源码包:Xorg_git_20071119.tar.bz2,解压后进入源码目录
使用util/modules/build.sh来对源码进行编译
编译前的修改:
修改X server的配置参数,生成Xfbdev:
在 if test "$1" = "xserver" && test -n "$MESAPATH"; then
MOD_SPECIFIC="--with-mesa-source=${MESAPATH}"
fi
后面添加
if test "$1" = "xserver"; then
MOD_SPECIFIC="${MOD_SPECIFIC} --enable-kdrive --enable-xfbdev
--disable-ipv6 \
--disable-xorg \
--disable-xnest \
--disable-xvfb \
--disable-xevie \
--disable-xwin \
--disable-xsdl \
--disable-xephyr \
--disable-xfake \
--disable-kdrive-vesa \
--disable-dri"
fi
注释掉一些不需要的软件:
如:#build_doc,#build_mesa,#build_driver,#build_da
#build app xdriinfo, #build app xprop, #build app xsm等
修改出错的地方:
xserver/hw/kdrive/src/kaa.c:
pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp);改为:
pPixman=fbCreatePixmapBpp(pScreen,w,h,depth,bpp,usage_hint);
xserver/hw/xfree86/modes/xf86Crtc.c:
在#include "xf86.h前一行添加" #include "xf86Priv.h"
xserver/hw/xfree86/os-support/xf86_OSlib.h:
删除#include
添加#include
添加屏幕分辨率的支持:xserver/hw/kdrive/src/kmode.c:
在const KdMonitorTiming kdMonitorTimings[]数组中添加需要的分辨率
/* 800x480 modes */
{ 800, 480, 85, 56250, /* VESA */
32, 152, 248, KdSyncPositive, /* 53.674 */
1, 27, 31, KdSyncPositive, /* 85.061 */
},
{ 800, 480, 75, 49500, /* VESA */
16, 160, 256, KdSyncPositive, /* 46.875 */
1, 21, 25, KdSyncPositive, /* 75.000 */
},
/* DEFAULT */
#define MONITOR_TIMING_DEFAULT 9
{ 800, 480, 72, 50000, /* VESA */
56, 64, 240, KdSyncPositive, /* 48.077 */
37, 23, 66, KdSyncPositive, /* 72.188 */
},
{ 800, 480, 60, 40000, /* VESA */
40, 88, 256, KdSyncPositive, /* 37.879 */
1, 23, 28, KdSyncPositive, /* 60.317 */
},
{ 800, 480, 56, 36000, /* VESA */
24, 128, 224, KdSyncPositive, /* 35.156 */
1, 22, 25, KdSyncPositive, /* 56.250 */
}
编译程序: $ ./util/modular/build.sh -b $PREFIX
在编译libX11时要用到makekeys这个执行文件,但是这时是编译的arm文件,执行时报错,手动编译一个PC上能用的版本覆盖原来的文件gcc -o makekeys makekeys.c
4.mathcbox移植
--------------------------------------------------
4.1移植jpeg
./configure --build=i386-linux --host=arm-linux --target=arm-linux --enable-shared --enable-static --prefix=$PREFIX
4.2移植matchbox-window-manager-1.2和libmatchbox-1.9
5.gtk移植
---------------------------------------------------
5.1移植glib
[root@linux glib-2.8.0]# echo ac_cv_type_long_long=yes>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_stack_grows=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo glib_cv_uscore=no>>$ARCH-linux.cache
[root@linux glib-2.8.0]# echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH-linux.cache
[root@linux glib-2.8.0]# LIBS=`pkg-config --libs gthread-2.0` ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --cache-file=arm-linux.cache
5.2移植cairo
$tar xjf cairo-1.8.0.tar.bz2
$cd cairo-1.8.0
$ ./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX --enable-pdf=yes --enable-xlib=yes --enable-xlib-xrender=yes --enable-ps=yes --enable-freetype --enable-png
$make
$make install
5.3移植pango
$tar xjf pango-1.16.4.tar.bz2
$cd pango-1.16.4
$./configure --host=arm-linux --build=i386-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" CAIRO_CFLAGS="-I$PREFIX/include" CAIRO_LIBS="-L$PREFIX/lib" --prefix=$PREFIX
$make
$make install
5.4移植atk
$tar xjf atk-1.9.1.tar.bz2
$cd atk-1.9.1
$./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX
$make
$make install
5.5移植TIFF
$tar xjf tiff-3.7.4.tar.bz2
$cd tiff-3.7.4
$./configure --host=arm-linux CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" --prefix=$PREFIX
$make
$make install
5.6移植gtk
$tar xjf gtk-2.12.9.tar.bz2
$cd gtk-2.12.9
$ac_cv_func_XOpenDisplay=yes
$ac_cv_func_XextFindDisplay=yes
$ac_cv_func_XRenderQueryExtension=yes
$./configure --prefix=$PREFIX --host=arm-linux --build=i386-linux --enable-shared=yes --enable-static=yes --without-libtiff --disable-xkb --disable-glibtest --with-gdktarget=x11 --with-xinput=yes --enable-display-migration --without-libjpeg
修改config.h:
#define HAVE_XCONVERTCASE 1
/* #undef HAVE_XCONVERTCASE */
#define HAVE_SHAPE_EXT 1
/* #undef HAVE_SHAPE_EXT */
$make
$make install
6.测试
-----------------------------------------------------
将编译安装后的结果拷贝到已经做好的基本的文件系统里面
在/etc/init.d/rcS中增加:
#start Xserver
Xfbdev -mouse mouse -keybd keyboard >/dev/null 2>&1 &
#start matchbox-window-manager
export HOME=/home
export DISPLAY=:0.0
sleep 1
matchbox-window-manager &
启动系统可看到屏幕上X窗口和matchbox的指针
在超级终端里运行gtk-demo
显示出gtk-demo程序界面,移植成功。
注:测试前
确认 /usr/lib/xserver/SecurityPolicy 文件存在
确认 /usr/etc/gtk-2.0/gdk-pixbuf.loaders 文件存在
{/usr/bin/gdk-pixbuf-query-loaders > gdk-pixbuf.loaders 来生成}
确认 /usr/etc/pango/pango.modules 文件存在
{/usr/bin/pango-querymodules > pango.modules 来生成。
此文件会把pango+modules的相关资料调入/usr/lib/pango/1.16.4/modules中}