前言
在編譯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變量的時候遵循一定的規則,這樣才能更好地避免出錯