建立交叉编译环境后root无法登陆linux。

具体情况如下
-----------------------------------------------------------
使用VMware 5.5安装red hat9,按照友善之臂上建立交叉编译环境的方法,操作如下:将arm-linux-gcc-3.3.2.tgz,arm-linux-gcc-2.95.3.tgz,arm-linux-gcc-3.4.1.tgz 考到/tmp,执行 cd /tmp tar xvzf arm-linux-gcc-3.3.2.tgz -C / tar xvzf arm-linux-gcc-2.95.3.tgz -C / tar xvzf arm-linux-gcc-3.4.1.tgz -C / 然后建立工作目录,最后运行命令 gedit /root/.bashrc在最后一行设置环境变量export ………… 之后 他说logout使之生效 然后用root就登录不了,有一条消息,大概意思:你上次会话不超过10秒,…………请高手解释一下,尝试了两次,都是在这里出的问题。
顺便问一个,这样建立交叉环境是不是个好的办法,网上看到很多别的方法。

第1个回答  2009-07-03
你这是建立交叉编译?
只看见你复制了一堆软件包到tmp,然后解压,然后安装了个编译器.貌似也没安装,没见编译和安装啊
你既然用tar的-v参数了,就要看他的信息啊.他报什么错了么?
我用的c到arm的交叉编译环境搭建方法,你参考一下
用的软件包:
linux-2.6.9.tar.gz
binutils-2.15.tar.gz
gcc-core-3.4.2.tar.bz2
gcc-g++3.4.2.tar.bz2
glibc-2.3.5.tar.gz
glibc-linuxthreads-2.3.5.tar.bz2
东西准备好了就开始搭建
[root@binnary ~ ]# mkdir /armtools
[root@binnary ~ ]#mkdir –p ~/tars/sourcedir
[root@binnary ~ ]#mkdir ~/tars/builddir
~/tars/sourcedir这个临时目录放源文件及解压缩后的源文件。 ~/tars/builddir在这里进行编译。
/armtools把arm-linux交叉编译环境安装在这里。

首先安装binutils
[root@binnary ~ ]# cd ~/tars/sourcedir
[root@binnary sourcedir]# tar -zxf binutils-2.15.tar.gz
[root@binnary sourcedir ]# cd ~/tars/builddir
[root@binnary builddir ]# mkdir binutils
[root@binnary builddir ]# cd binutils
[root@binnary binutils ]# ../../sourcedir/binutils-2.15/configure --target=arm-linux --prefix=/armtools
[root@binnary binutils ]# make
[root@binnary binutils ]# make install
该编译过程较慢,需要数十分钟,安装完成后查看/armtools/bin目录下的文件
[root@binnary binutils ]# export PATH=/armtools/bin:$PATH

然后解压缩,配置,拷贝头文件
[root@binnary binutils ]# cd ~/tars/sourcedir
[root@binnary sourcedir ]# tar -zxvf linux-2.6.9.tar.gz
[root@binnary sourcedir ]# cd linux-2.6.9
[root@binnary linux-2.6.9 ]# vi Makefile
修改
ARCH ?= $(SUBARCH)
将$(SUBARCH)改为arm
# CROSS_COMPILE ?=(注释掉) 然后新加一行
CROSS_COMPILE ?= arm-linux-
[root@binnary linux-2.6.9 ]# make menuconfig
然后设置顺序如下(我对应的开发板上s3c2440,你的板子是什么你找什么选)
System Type --->
ARM system type (Samsung S3C2410) --->
S3C24XX Implementations --->\S3C2410(System Type->ARM System Type->/Samsung S3C2410)
[root@binnary linux-2.6.9 ]# make include/linux/version.h
[root@binnary linux-2.6.9 ]# mkdir -p /armtools/arm-linux/include
[root@binnary linux-2.6.9 ]# cp -dR include/asm-arm /armtools/arm-linux/include/asm
[root@binnary linux-2.6.9 ]# cp -dR include/linux /armtools/arm-linux/include/linux
[root@binnary linux-2.6.9 ]# cp -dR ~/tars/sourcedir/linux-2.6.9/include/asm-generic /armtools/arm-linux/include/

再下来编译gcc-3.4.2
[root@binnary linux-2.6.9 ]# cd ~/tars/sourcedir
[root@binnary sourcedir ]# tar –jvxf gcc-core-3.4.2.tar.bz2
给gcc打一个补丁,在目录gcc-3.4.2/gcc/下编辑一个文件flow.c.diff,内容如下
RCS file: /cvs/gcc/gcc/gcc/flow.c,v
retrieving revision 1.593
retrieving revision 1.594
diff -u -r1.593 -r1.594
--- gcc/gcc/flow.c 2004/07/09 03:29:32 1.593
+++ gcc/gcc/flow.c 2004/08/02 13:19:39 1.594
@@ -1865,19 +1865,22 @@
rtx set_src = SET_SRC (pc_set (BB_END (bb)));
rtx cond_true = XEXP (set_src, 0);
rtx reg = XEXP (cond_true, 0);
+ enum rtx_code inv_cond;
if (GET_CODE (reg) == SUBREG)
reg = SUBREG_REG (reg);
/* We can only track conditional lifetimes if the condition is - in the form of a comparison of a register against zero. - If the condition is more complex than that, then it is safe - not to record any information. */
- if (REG_P (reg)
+ in the form of a reversible comparison of a register against + zero. If the condition is more complex than that, then it is + safe not to record any information. */
+ inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
+ if (inv_cond != UNKNOWN
+ && REG_P (reg)
&& XEXP (cond_true, 1) == const0_rtx)
{
rtx cond_false
- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
+ = gen_rtx_fmt_ee (inv_cond,
GET_MODE (cond_true),
XEXP (cond_true, 0),
XEXP (cond_true, 1));
if (GET_CODE (XEXP (set_src, 1)) == PC)
用此文件给flow.c打补丁,或者依此文件直接修改flow.c(修改前请备份这两个文件),flow.c.diff该补丁用于产生crti.o和crtn.o文件。
[root@binnary gcc ]# patch flow.c –p1 < ../../flow.c.diff [root@binnary gcc ]# cd ~/tars/builddir
[root@binnary builddir ]# mkdir gcc-core
[root@binnary builddir ]# cd gcc-core
[root@binnary gcc-core ]# ../../sourcedir/gcc-3.4.2/configure --target=arm-linux --prefix=/armtools --enable-languages=c --disable-shared --disable-threads --without-headers --with-newlib
其中选项--enable-languages=c表示只支持C语言,--disable-threads表示去掉thread功能,这个功能需要glibc的支持。--disable-shared表示只进行静态库编译,不支持共享库编译。
接下来执行编译和安装操作,命令如下:
[root@binnary gcc-core ]# make
[root@binnary gcc-core ]# make install

再再然后编译安装glibc
[root@binnary gcc-core ]# cd ~/tars/sourcedir
[root@binnary sourcedir ]# tar -zxvf glibc-2.3.5.tar.gz
[root@binnary sourcedir ]# cd glibc-2.3.5
[root@binnary glibc-2.3.5 ]# tar -jxvf ../glibc-linuxthreads-2.3.5.tar.gz
然后进行编译配置,glibc-2.3.5配置前必须新建一个编译目录,否则在glibc-2.3.5目录下不允许进行配置操作,此处在~/tars/builddir/目录下建立名为glibc的目录,配置操作如下:
[root@binnary glibc-2.3.5 ]# cd ~/tars/builddir
[root@binnary builddir ]# mkdir glibc
[root@binnary builddir ]# cd glibc
[root@binnary glibc ]# vi ~/tars/sourcedir/glibc2.3.5/sysdeps/unix/sysv/linux/arm/ioperm.c
将里面的BUS_ISA改为CTL_BUS_ISA
98 static int
99 init_iosys (void)
100 {
101 char systype[256];
102 int i, n;
103 static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
104 static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
105 size_t len = sizeof(io.base);
106
107 if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
108 && ! sysctl (ioshift_name, 3, &io.shift, &len, NULL, 0))
109 {
110 io.initdone = 1;
111 return 0;
112 }
[root@binnary glibc ]# vi ~/tars/sourcedir/glibc-2.3.5/Makeconfig
把里面的-lgcc_eh都删掉
505 ifneq ($(have-as-needed),yes)
506 libgcc_eh := -lgcc_eh $(libunwind)
507 else
508 libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
509 endif
510 gnulib := -lgcc $(libgcc_eh)
511 static-gnulib := -lgcc -lgcc_eh $(libunwind)
512 libc.so-gnulib := -lgcc
513 endif
[root@binnary glibc ]# export CC=arm-linux-gcc
[root@binnary glibc ]# ~/tars/sourcedir/glibc-2.3.5/configure \
--prefix=/armtools/arm-linux \ --host=arm-linux \ --build=i686-pc-linux-gnu \ --with-headers=/armtools/arm-linux/include \ --enable-add-ons=linuxthreads
配置完后编译和安装 glibc
[root@binnary glibc ]# make
[root@binnary glibc ]# make install

最后编译安装gcc 的c, c++ 编译器。
[root@binnary glibc ]# cd ~/tars/sourcedir/
[root@binnary sourcedir ]# tar -jxf gcc-g++-3.4.2.tar.bz2 [root@binnary sourcedir ]# cd ~/tars/builddir/
[root@binnary builddir ]# mkdir gcc
[root@binnary builddir ]# cd gcc
[root@binnary gcc ]# unset CC
[root@binnary gcc ]# ../../sourcedir/gcc-3.4.2/configure \
--prefix= /armtools\ --target=arm-linux \ --enable-languages=c,c++ \ --without-headers \ --disable-shared
[root@binnary gcc ]# make
[root@binnary gcc ]# make install

这就算是结束了.
测试的话你到/armtools/bin下写一个c程序
例如#cd /armtools/bin
#vim c1.c
写完之后#gcc -Wall -o c1 c1.c
如果你写的c1.c里面有调用math.h的话上面的命令变为
#gcc -Wall -o -lm c1 c1.c
完成之后#file c1.c
再#file c1
两者对比一下
你会发现一个是基于ASC-II一个是基于ARM的
这就说明你搭建成功了
最后你可以把你的/armtools打个包,保存起来,以备日后使用

中间很多编译的环节时间较长,如果一切顺利的做完大概需要两个小时.要有耐心哦

P.S. 终于完了,希望对你有帮助
第2个回答  2009-06-22
你的源代码都没编译...............交叉编译环境不是这样的..................你的这些是编译软件,先要安装再设置环境.......................
第3个回答  2009-06-22
为什么是 gedit /root/.bashrc呢?
应该是 gedit ~/.bashrc才对啊

另外这种方法容易导致一些问题。我自己想了一种方法就是把交叉工具链放到任意一个地方(推荐自己家目录下),然后交叉编译的时候输入完整路径。嫌麻烦的话可以定义一个别名
第4个回答  2009-06-23
其实可以放在任何地方,只要改好PATH,不过根据linux的目录规则,一般放在/usr/bin/下
相似回答