免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3440 | 回复: 0
打印 上一主题 下一主题

编译arm-linux工具链 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-10 13:56 |只看该作者 |倒序浏览
1.下载
ftp://mirrors.kernel.org/gnu/binutils/binutils-2.18.tar.gz
ftp://mirrors.kernel.org/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.gz
ftp://mirrors.kernel.org/gnu/gdb/gdb-6.8.tar.gz
ftp://mirrors.kernel.org/gnu/glibc/glibc-2.7.tar.gz
ftp://mirrors.kernel.org/gnu/glibc/glibc-ports-2.7.tar.gz
http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/glibc-2.7-libgcc_eh-1.patch
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.gz
http://www.mpfr.org/mpfr-current/mpfr-2.3.2.tar.gz
ftp://ftp.gmplib.org/pub/gmp-4.2.4.tar.gz
2.建立工作目录
我的工作目录放在一个单独的盘上,/mnt/hdc1。你可以任选一个目录做工作目录,例如~/work。将下载的文件全部放到工作目录下。
工作目录中建立目录build,用来放解压后的源码和build时产生的文件,最终产生的工具放到/usr/armtools下。
3.设置环境变量
在etc/ld.so.conf中加上一行/usr/local/lib,用来设置动态库的搜索目录,已经有的话就不用加了,因为gmp和mpfr会装到这里,不加以后的编译通不过。
开一个终端窗口
export TARGET=arm-linux
export PREFIX=/usr/armtools
export PATH=$PATH:/usr/armtools/bin
export BUILD_DIR=/mnt/hdc1/build
4.安装gmp和mpfr库,这两个库是gcc需要的,老版本如果不用fortan77的话不需要,但新版本只编译c也需要。有的话就不用装了。
cd /mnt/hdc1        进入工作目录
cd build
tar -zxvf ../gmp-4.2.4.tar.gz    这里有个技巧,打完gm后直接按tab键文件名会自动补全。后面需要输入目录的地方都可以这么用。
cd gmp-4.2.4
./configure
make
make check        文档里说这个非常重要。
make install
cd ..
rm -rf gmp-4.2.4    装完源目录没用了,删掉,节省空间。
ldconfig /usr/local/bin
tar -zxvf ../mpfr-2.3.2.tar.gz    这里有个技巧,打完gm后直接按tab键文件名会自动补全。后面需要输入目录的地方都可以这么用。
cd mpfr-2.3.2
./configure
make
make check        文档里说这个非常重要。
make install
cd ..
rm -rf mpfr-2.3.2    装完源目录没用了,删掉,节省空间。
ldconfig /usr/local/bin    更新一下缓存
完成,这一步一般不会出问题。
5.编译binutils
tar -zxvf ../binutils-2.18.tar.gz
mkdir binutils-2.18-build
cd binutils-2.18-build
../binutils-2.18/configure --target=$TARGET --prefix=$PREFIX
make
make install
cd ..
rm -rf binutils-2.18
rm -rf binutils-2.18-build
ok,这一步也很简单,完成后armtools里会有很多文件。
6.编译bootstrap gcc
tar -zxvf ../gcc-4.3.2.tar.gz
mkdir gcc-4.3.2-build
cd gcc-4.3.2-build
../gcc-4.3.2/configure --target=$TARGET --prefix=$PREFIX
--enable-languages=c --with-local-prefix=$PREFIX/arm-linux
--without-headers --with-newlib --disable-shared --disable-threads
--disable-libmudflap --disable-libssp
这一步参数比较多,大概说一下
--target=$TARGET    目标,arm-linux,就是要产生linux下编译arm程序的编译器
--prefix=$PREFIX    安装目录
--enable-languages=c     只产生c编译器
--with-local-prefix=$PREFIX/arm-linux     不知道有啥用,实在不想再编译一遍试验了,谁有空可以试试不加行不行。
--without-headers     不使用头文件,因为还没有glibc
--with-newlib     这个不太明白,似乎是编译一个自带的库
--disable-shared     不编译共享库
--disable-threads     不编译线程支持
--disable-libmudflap     禁止mudflap库,这个库需要glibc支持
--disable-libssp     禁止ssp库,这个库需要glibc支持
make all-gcc        编译安装gcc
make install-gcc
make all-target-libgcc        编译安装库,不做的话编译glibc时找不到库
make install-target-libgcc
cd ..
rm -rf gcc-4.3.2-build
7.建立linux头文件
tar -zxvf ../linux-2.6.27.tar.gz
cd linux-2.6.27
make ARCH=arm menuconfig
菜单最下面选择load一个arm板子的config文件,我load的arch/arm/configs/assabet_defconfig,然后保存为.config。退出
make ARCH=arm CROSS_COMPILE=$PREFIX/bin/arm-linux-        出现CC什么的时候就可以停止了。
cd ..
2.6.27版和2.6.26.5版比目录结构发生了变化,所以编译glibc时要改路径,否则找不到头文件。编译glibc时候用到了特定arm芯片(例如我用的sa1100)的头文件,难道编译出来的glibc只能用在特定的芯片上吗,有知道的说一下。
8.编译glibc
tar -zxvf ../glibc-2.7.tar.gz
cd glibc-2.7
tar -zxvf ../../glibc-ports-2.7.tar.gz    glibc本身是不支持arm等的,需要加这个port。
mv glibc-ports-2.7 ports
打补丁,sed -i 's/aaa/bbb/' file 就是把file里的aaa替换成bbb,bbb里面的&代表 aaa,\t代表tab,\n代表换行。你也可以用文本编辑器来做,用sed做要注意不要打错任何一个字符,空格啦,大小写啦都要注意。
sed -i 's/-nostdinc -isystem $ccheaders /-nostdinc -isystem $ccheaders -isystem $ccheaders-fixed /' configure.in
sed -i 's/-isystem $cxxheaders /-isystem $cxxheaders -isystem $cxxheaders-fixed /' configure.in
sed -i 's/# define UNDOCARGS_5\tUNDOCARGS_4/&\n\n# define
DOCARGS_6\tUNDOCARGS_5\n# define UNDOCARGS_6\tUNDOCARGS_5/'
ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
sed -i 's/#include /&\n#include /' ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h
sed -i 's/__deprecated/__attribute__((deprecated))/' ../linux-2.6.27/arch/arm/include/asm/memory.h
patch -p1  t-linux-core
         cp ./t-linux-core ./t-linux
       *
         编译
         cd ~/tars/BuildDir
         mkdir gcc-core
         cd gcc-core
         ../../SourceDir/gcc-2.95.3/configure \
                                 --target=arm-linux \
                                 --prefix=~/armtools \
                                 --enable-languages=c \
                                 --with-local-prefix=~/armtools/arm-linux \
                                 --without-headers \
                                 --with-newlib \
                                 --disable-shared
         make all install
       * ./configure 时需要gmp和mpfr库支持,下载,安装,顺利,已做成pet包。换了一台机重新编译的时候,发现编译mpfr的时候会出错,找不到库,还是要加上下面那个路径。
       * ./configure 通过
* make 出错,查看arm-linux/libgcc/config.log,说找不到libmpfr.so.1,估
计是做的pet包没有将ld搜索路径加上,先加上环境变量试下,回头再修改pet包。 export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
       * 加上后上个问题没有了,又有新问题。
       * config.log says:
* configure:2747: checking for /mnt/hdc1/build/gcc-core/./gcc/xgcc
-B/mnt/hdc1/build/gcc-core/./gcc/ -B/mnt/hdc1/armtools/arm-linux/bin/
-B/mnt/hdc1/armtools/arm-linux/lib/ -isystem
/mnt/hdc1/armtools/arm-linux/include -isystem
/mnt/hdc1/armtools/arm-linux/sys-include option to accept ANSI C
configure:2817: /mnt/hdc1/build/gcc-core/./gcc/xgcc
-B/mnt/hdc1/build/gcc-core/./gcc/ -B/mnt/hdc1/armtools/arm-linux/bin/
-B/mnt/hdc1/armtools/arm-linux/lib/ -isystem
/mnt/hdc1/armtools/arm-linux/include -isystem
/mnt/hdc1/armtools/arm-linux/sys-include -c -O2 -g -g -O2 conftest.c
>&5
         conftest.c:10:19: error: stdio.h: No such file or directory
         conftest.c:11:23: error: sys/types.h: No such file or directory
         conftest.c:12:22: error: sys/stat.h: No such file or directory
         conftest.c:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
         conftest.c:44: error: expected declaration specifiers or '...' before 'FILE'
         configure:2823: $? = 1
       * try to add --disable-libiberty and make it
       * 上面的没用,改--disable-shared为--disable-threads,似乎这个错误过去了
       * 发现修改t-linux里的-D__gthr_posix_h这个现在已经没用了。-Dinhibit_libc这个参数似乎可以用--with-newlib代替。
       * 然后又出找不到crti.o的错误。重新加上--disable-shared,搞定
       * 然后又出问题,c编译器不能建立可执行文件。找不到crt1.o。查看发现gcc编译完后进行了编译测试,但这时候还没有这些启动文件,据说这些是编译glibc产生的。
       * configure时加上--disable-libmudflap,不加似乎也行,不要理会错误,直接make install就可以把gcc装上了。似乎有问题,make glibc的时候找不到头文件。
       * 加上--disable-libssp --disable-libgomp终于编译通过了,make install没有问题。
       * 重新make一次,不知道怎么又出错了,奇怪。而且make clean有的时候只显示几行,而有的时候显示一大堆,不知道为什么。
       * 改成make all-gcc和make install-gcc通过,不知道行不行。
3. 编译glibc
      1. 因为现在glibc包不支持arm,所以要加上port包,解压port包到glibc原目录,改名为ports。
      2.
         CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../../SourceDir/glibc-2.2.3/configure --host=arm-linux \
                         --prefix=~/armtools/arm-linux --enable-add-ons --with-headers=~armtools/arm-linux/include
      3. 报错configure: error: forced unwind support is required
4. 回到gcc,try make all-target-libgcc make install-target- libgcc
通过,但上述问题还在。第二次编译产生cannot compute sizeof(long double) 的错误。这个错误又好像不
是这个引起。结果是下面两句写错了。还是不对,加上--build=i686-pc-linux-gnu后通过
      5. 加上两句echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache,然后 configure加上
--cache-file=config.cache,通过。这两句可以直接把双引号里的内容写到configure后面做参
数,而不用--cache- file参数。
      6. make又出问题,找不到../include/limits.h,打补丁http://sources.redhat.com/bugzilla/show_bug.cgi?id=5442后通过。
glibc/libc/configure.in
if test -n "$sysheaders"; then
ccheaders=`$CC -print-file-name=include`
-  SYSINCLUDES="-nostdinc -isystem $ccheaders \
+  SYSINCLUDES="-nostdinc -isystem $ccheaders -isystem $ccheaders-fixed \
      1. 再出问题,找不到errno.h,copy linux源目录下include/asm-generic到armtools/arm-linux/include下,通过
      2. /usr/local/arm-linux/include/asm/memory.h:191: error: expected '=', ',', ';', 'asm' or '__attribute' before 'unsigned'
         /usr/local/arm-linux/include/asm/memory.h:196: error: expected '=', ',', ';', 'asm' or '__attribute' before 'void'
      3. 找不到解决方法,尝试修改autoconf.h里的#define CONFIG_ENABLE_WARN_DEPRECATED 1为0,无效
4. 找了好久,分析源码,终于找到问题所在,但在网上查不到解决办法,只能自己改了,应该不会有其它问题。这个问题的原因是
ioperm.c(port里arm 中带的)包含了linux头文件asm/page.h,page.h又包含了linux
/memory.h,memory.h包含了linux /compiler.h,这里面有个条件编译,如果定义了__KERNEL__就会包含
compiler_gcc4.h等等,反正会定义一个 __deprecated属性,而如果没有定义__KERNEL__就不会定义这个属性,但是
memory.h里两次用到这个属性,结果就出问题。我的改法是把memory.h里的 __deprecated改成
__attribute__((deprecated))。第二次编译又没发现这个问题,奇怪。可能是升级了linux版本的原因。
      5. 然后不出所料,还是有问题,: Assembler messages:
         :2: Error: bad instruction `docargs_6'
         :2: Error: bad instruction `undocargs_6',这个网上有解决办法。
      6.
         改ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h里增加蓝色的两行
         # define DOCARGS_5 DOCARGS_4
         # define UNDOCARGS_5 UNDOCARGS_4
         # define DOCARGS_6 DOCARGS_5
         # define UNDOCARGS_6 UNDOCARGS_5
         # ifdef IS_IN_libpthread
         #  define CENABLE bl PLTJMP(__pthread_enable_asynccancel)
         #  define CDISABLE bl PLTJMP(__pthread_disable_asynccancel)
      7. lowlevelloch.c:34出问题
         在ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h里加一行
          #include
          #include
         +#include
      8. 终于make通过了,make install
      9. 通过,开始编译gcc
     10.
         ../../SourceDir/gcc-2.95.3/configure --target=arm-linux --prefix=~/armtools \
                                 --enable-languages=c,c++ --with-local-prefix=~armtools/arm-linux
     11. make
     12. make install
     13. 成功
     14. 编译一个例子,然后准备开始第二次编译工具链
     15. 看到有新的linux,换用新的linux,结果好多问题,include/asm下的东西都移走了,移到arch/arm/include/asm下了,编译glibc又出好多新问题
16. 第二次编译glibc产生cannot compute sizeof(long double) 的错误。这个是
configure自动识别build类型错误,并且认为不是交叉编译造成的,加上--build=i686-pc-linux-gnu后通过
configure,但make产生redefinition of '__copysign' 的错误,改成--build=i386-linux-
gnu后通过
     17. 又出config-name.h找不到的问题,这个文件应该是configure产生的。
     18. 看样子是和我用虚拟机有关,编译工具链个人感觉极考人品,顺不顺利看人品了。
     19. 上面发现的问题看来是和configure检查系统环境出现偏差有关
20. 改成CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux- ranlib
../glibc-2.7/configure --host=arm-linux --prefix=/mnt/hdc1 /armtools1
--enable-add-ons --with-headers=/mnt/hdc1/build/linux-2.6.27
/include:/mnt/hdc1/build/linux-2.6.27/arch/arm /include
cross_compiling=yes build_alias=i386-linux-gnu后配置通过,make出现问题。还是
因为linux改了目录结构引起的,拷贝需要的文件后ok
     21. 在编译gcc的时候不小心输错目录,在原文件目录下进行了编译,结果出错。一定不能在源文件目录下编译。
     22. 第三次编译glibc出ld找不到-lgcc的问题,是没有make all-target-libgcc和make install-target-libgcc
     23. 找不到-lgcc_eh,原因是没打补丁,又要退回去重做。
张贴者
dack
时间:
下午7:35
0
评论

2008年10月2日 星期四
Puppy Linux3.01菜单汉化方法
1,修改/usr/share/applications下的所有文件(100多个,每个文件只汉化一行),以pfind.desktop为例:
[Desktop Entry]
Encoding=UTF-8
Name=Pfind file finder
Icon=mini-search.xpm
Comment=Pfind file finder
Exec=pfind
Terminal=false
Type=Application
Categories=X-FilesystemFind
GenericName=Pfind file finder
只需把下面一行汉化即可:(汉化为Name=Pfind 文件查找)
Name=Pfind file finder
*************一百多个文件,尽管每个文件一行,仍然很麻烦啊。
---------------------------------
2,修改/usr/share/desktop-directories/下的所有文件(也很多,每个文件只汉化一行),以Calculate为例
[Desktop Entry]
Encoding=UTF-8
Name=Calculate
Icon=siag24.xpm
Type=Directory
只需把下面一行汉化即可:(汉化为Name=计算)
Name=Calculate
--------------------
3,修改/etc/xdg/templates/_root_.jwmrc这个文件,把其中Label=''之引号中的英文翻译为中文即可。
------------------
4,修改/root/.jwmrc这个文件,翻译其中的相关内容。如果上面三步已做,而你正好要安装一个软件,这一步可以省略。当你安装好软件,重启后,这个文件中的相关内容也变成中文的了。
张贴者
dack
时间:
下午6:16
0
评论

自己动手,汉化Puppy linux4.00
一 简介
Puppy Linux
Puppy
Linux是一个非常智能的Linux发行版,它是由澳大利亚教授Barry Kauler编制的。是一种类似Windows的Linux
,这种linux包含了所有重要的程序。而且它小到足以在早期的电脑的内存中运行。Puppy
几乎能在所有的硬件上运行。它易于操作,可以非常容易地适合个人偏好。许多志愿者不断为它编写软件。Puppy
有一个全球性的群体,每天24小时用英语通过互联网进行交流。
Puppy
易于操作,可以非常容易地适合个人偏好。麻雀虽小,但五脏俱全.在Puppy Linux
中系统工具、网络软件、办公应用、影音娱乐都一个都不会少的。整个Puppy Linux
可以装载在内存中。这意味着,所有的应用程序一眨眼的功夫就能启动,并且立即对用户的输入作出响应。 Puppy
Linux能从flash卡或者是任何的USB存储设备启动 。
Puppy linux 最新版为4.00。界面漂亮,安装简单,使用方便,中文支持很好,非常适合新手使用。
二,中文化过程:
  步骤概述:
1,安装中文字体。
2,下载中文locale包
3,通过菜单中当地化安装。
4,安装glibc-locale包
5,安装输入法。
   具体实现:
1,安装中文字体。在/root下建一.fonts目录,到以下地址下载中文字体:
文泉驿宋体
http://sourceforge.net/project/s ... p;package_id=156288
文泉驿正黑体
http://downloads.sourceforge.net ... .gz?use_mirror=osdn
2,下载中文下载中文locale包,解压,将其中前面带zh_的解压拷到/use/lib/local目录下:(也可只用zh_CN.uft8)
下载地址:在下面网站找,具体哪个目录,我忘了。也可以直接从DEBIAN,UBUTUN等已经中文化的LINUX中复制zh_CN.uft8这个目录过来,但记得要把UTF8改成小写或者下面配置输入法时写成大写。
http://dotpups.de/dotpups/
3,安装 locale:点'/menu/chooselocale contry localisation',弹出窗口上按“local'按钮。再弹出一个窗口,选择:zh_CN.uft8,点OK
4,安装glibc-locale包:
点“menu/setup/puppy pakage manager”,从中找到glibc_locales-2.5点一下就安装了。
5,安装输入法。
下面这个地址有个现成的安装包,下载单击就安装了。安装后按弹出的文件中的说明设置一下重启X就成了。
ftp://ftp.servage.net/dotpups/scim
6,菜单的汉化,见这个:
   http://hi.baidu.com/gsxlm/blog/item/0114dfdf22ff881648540374.html
   也可到下面下载菜单翻译器:
   http://dotpups.de/dotpups/
在system_uitinitls/internatiol_puppymenu目录下
   各种应用程序的汉化,可以用文本编辑器打开/usr/sbin/及其他一些目录找到下面的种种文件,(注意,有些编程的字词不要翻译,这个会编程的人都知道的。只管翻句子没错的。)可以一边翻译一边观看效果。
   三,一些有用的链接:

   中文项目论坛:
        http://e-pup.5d6d.com/
        http://hi.baidu.com/puppylinux
   英文论坛:
       http://www.murga-linux.com/puppy
   各种应用程序下载地址:
   http://distro.ibiblio.org/pub/linux/distributions/puppylinux/
   http://dotpups.de/dotpups/
   一些使用技巧和入门知识:
   http://hi.baidu.com/gsxlm"
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76419/showart_1404190.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP