前言
在编译xilinx的uboot的时候出现了一个问题,始终报错:“strip: Unable to recognise the format of the input file `gen_eth_addr'”
1 分析
一般对于编译链接命令出现这样的错误,都是因为目标文件和命令的编译环境不一样导致的,但是我看了一下对于这个目标文件gen_eth_addr,使用的gcc进行编译的啊,为什么strip就不会认识呢?
在第一反应中,gcc/strip都应该是使用的系统安装是/usr/bin中指定的命令,对于这两个命令的环境应该是一样的,所以我多次尝试都不对,所以我觉得肯定是bash在调用gcc/strip命令时路径出现了问题。
使用type命令查看gcc和strip使用的路径:
root@~:type gcc
gcc is /usr/bin/gcc
root@~:type strip
strip is /home/timesys/linux-gnu/toolchain/bin/strip
果然gcc/strip使用的不是同一个编译环境,问题就处在这里,下面就是找为什么会这样和解决问题了。
查看环境变量看指定的PATH路径:
在这里我们果然看到一个问题:/usr/../bin等并不是在PATH的最前面,而我们知道shell执行命令的顺序是:shell内建命令-->外部命令(外部命令查找本地目录-->PATH指定的路径),而PATH指定的路径下越靠前的优先级越高。
所以这里我们看到/home/timesys/linux-gnu/toolchain/bin比/usr/bin/靠前,而且/home/timesys/linux-gnu/toolchain/bin中有strip命令,所以就被执行了。
由此,问题原因找到,就是由于PATH中的顺序导致的查找命令混乱,下面就是修改PATH的值了。
2 解决
PATH是属于环境变量,我们直接跟踪bash使用的脚本一步一步查找即可。
首先,bash启动时调用的文件是~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$HOME/bin :$PATH
export PATH
unset USERNAME
# New environment setting added by Sourcery CodeBench Lite for Xilinx GNU/Linux on Fri Feb 27 14:52:15 CST 2015 1.
# The unmodified version of this file is saved in /root/.bash_profile1216857457.
# Do NOT modify these lines; they are used to uninstall.
PATH="/home/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:${PATH}"
export PATH
# End comments by InstallAnywhere on Fri Feb 27 14:52:15 CST 2015 1.
# For Mips GNU/Linux
PATH="/home/timesys/linux-gnu/toolchain/bin:/home/timesys/linux-uclibc/toolchain/bin:${PATH}"
export PATH
我们将${PATH}均放到最前面,如下;
然后这里还调用了~/.bashrc,我们也去看一下:
这里引用了/etc/bashrc,也去看一下:
确保这里所有的PATH都是这样${PATH}在前面。
再看/etc/profile
在这个文件中出现的PATH也要改成统一的格式。
修改完这些文件,然后source,然后再看PATH的值:
OK,这就是我们需要的了,然后编译uboot顺利通过
3 总结
由于我这个虚拟机是前任装的,所以里面的一些配置不合符自己平时的习惯,所以导致了一些开始认为不应该出现的问题;但出现了问题就应该找到原因并解决。同时对于在一个虚拟机中安装多个交叉编译环境来说,我们在使用的时候一定要注意命令的调用路径,在配置PATH变量的时候遵循一定的规则,这样才能更好地避免出错