linux基本操作/ubuntu



目錄

 

linux下載命令

curl 的用法指南

解壓zst文件

linux中添加編譯工具鏈的方法

Linux 命令詳解./configure、make、make install 命令

Linux ARM交叉編譯工具鏈制作過程

新建目錄

LInux 強制重啟報錯The root filesystem on /dev/sda1 requires a manual fsck

svn安裝

linux清空jobs及后台執行


linux下載命令

首先安裝axel這個命令

sudo apt-get install axel

然后使用這個命令下載文件
例如:

axel http://soft.vpser.net/lnmp/lnmp0.8-full.tar.gz

curl 的用法指南

http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

curl 是常用的命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client)的 URL 工具的意思。它的功能非常強大,命令行參數多達幾十種。如果熟練的話,完全可以取代 Postman 這一類的圖形界面工具。

解壓zst文件

如果解壓失敗可以在windows下先用這個軟件:peazip試下

https://www.peazip.org/peazip-64bit.html

 

linux中添加編譯工具鏈的方法

1、vi /etc/profile

2、在最后添加編譯工具路徑,舉例:

      export PATH=$PATH:/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin
3、source /etc/profile

4、echo $PATH

1.在windows下下載任意一個版本的交叉工具鏈壓縮包(例如toolchain-4.4.6-farsight.tat.bz2),然后將此工具鏈復制到windows和ubuntu的共享文件夾share中。 
2.在ubuntu系統的/usr/local文夾下新建文件夾arm,並且設置權限:  
    $sudo mkdir /usr/local/arm  
    $sudo chmod 777 /usr/local/arm   
3.將共享文件夾中的交叉編譯工具壓縮包復制到/usr/local/arm文件夾下,並且解壓:  
    $sudo cp /mnt/hgfs/share/toolchain-4.4.6-farsight/tar.bz2 /usr/local/arm/  
    $sudo tar xvf /usr/local/arm/toolchain-4.4.6-farsight 
4.打開配置文件,修改環境變量,將交叉編譯器的路徑添加到PATH中:(.bashrc文件是在~目錄下的一個隱藏文件!)  
    $sudo vim ~/.bashrc
    然后在文件最后一行中加入內容:
    export PATH=$PATH:/usr/local/arm/toolchain-4.4.6/bin/ 
5.重啟配置文件更新環境變量,使之生效:  
    $source ~/.bashrc 
6.檢查是否將路徑加入到PATH中: 
    $echo $PATH 
7.測試工具鏈是否配置成功;  
    $arm-cortex_a8-linux-gnueabi-gcc -v      
   (1)如果顯示工具鏈的相關信息和版本,則表明配置成功。  
   (2)如果顯示找不到命令可能原因:64位系統缺少lib32stdc++6這個包,執行以下命令:   
        $sudo apt-get install lib32stdc++6 
8.新建一個hello.c源文件,然后用交叉工具鏈進行編譯測試:  
    $arm-cortex_a8-linux-gnueabi-gcc hello.c  
   (1)如果顯示找不到文件和目錄,則執行以下命令:   
        $sudo apt-get install lsb-core

Linux 命令詳解./configure、make、make install 命令

這些都是典型的使用GNU的AUTOCONF和AUTOMAKE產生的程序的安裝步驟

一、基本信息

  1、./configure 是用來檢測你的安裝平台的目標特征的。比如它會檢測你是不是有CC或GCC,並不是需要CC或GCC,它是個shell腳本。

  2、make 是用來編譯的,它從Makefile中讀取指令,然后編譯。

  3、make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。

  注意:AUTOMAKE和AUTOCONF是非常有用的用來發布C程序的東西。

二、詳細解釋

  1、configure命令

  這一步一般用來生成 Makefile,為下一步的編譯做准備,你可以通過在 configure 后加上參數來對安裝進行控制,比如代碼:./configure –prefix=/usr 意思是將該軟件安裝在 /usr 下面,執行文件就會安裝在 /usr/bin (而不是默認的 /usr/local/bin),資源文件就會安裝在 /usr/share(而不是默認的/usr/local/share)。同時一些軟件的配置文件你可以通過指定 –sys-config= 參數進行設定。有一些軟件還可以加上 –with、–enable、–without、–disable 等等參數對編譯加以控制,你可以通過允許 ./configure –help 察看詳細的說明幫助。

  雷小天博客

  2、make

  這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟件需要調用perl或python來進行編譯)。如果 在 make 過程中出現 error ,你就要記下錯誤代碼(注意不僅僅是最后一行),然后你可以向開發者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。

  可能遇到的錯誤:make *** 沒有指明目標並且找不到 makefile。 停止。問題很明了,沒有Makefile,怎么辦,原來是要先./configure 一下,再make。

  3、make insatll

  這條命令來進行安裝(當然有些軟件需要先運行 make check 或 make test 來進行一些測試),這一步一般需要你有 root 權限(因為要向系統寫入文件)。

三、擴展說明

  Linux的用戶可能知道,在Linux下安裝一個應用程序時,一般先運行腳本configure,然后用make來編譯源程序,在運行make install,最后運行make clean刪除一些臨時文件。使用上述三個自動工具,就可以生成configure腳本。運行configure腳本,就可以生成Makefile文件,然后就可以運行make、make install和make clean。

  configure是一個shell腳本,它可以自動設定源程序以符合各種不同平台上Unix系統的特性,並且根據系統叄數及環境產生合適的Makefile文件或是C的頭文件(header file),讓源程序可以很方便地在這些不同的平台上被編譯連接。

這時,就可運行configure腳本了,運行configure腳本,就可產生出符合GNU規范的Makefile文件了: $ ./configure

到此時,就可以運行make進行編譯,在運行make install進行安裝了,最后運行make clean刪除臨時文件。

$ make
$ make install           (注:運行這個要有足夠的權限)
$ make clean

  利用configure所產生的Makefile文件有幾個預設的目標可供使用,其中幾個重要的簡述如下:

  make all:產生我們設定的目標,即此范例中的可執行文件。只打make也可以,此時會開始編譯原始碼,然后連結,並且產生可執行文件。

  make clean:清除編譯產生的可執行文件及目標文件(object file,*.o)。

  make distclean:除了清除可執行文件和目標文件外,把configure所產生的Makefile也清除掉。

  make install:將程序安裝至系統中。如果原始碼編譯無誤,且執行結果正確,便可以把程序安裝至系統預設的可執行文件存放路徑。如果用bin_PROGRAMS宏的話,程序會被安裝至/usr/local/bin這個目錄。

  make dist:將程序和相關的檔案包裝成一個壓縮文件以供發布。執行完在目錄下會產生一個以PACKAGE-VERSION.tar.gz為名稱的文件。 PACKAGE和VERSION這兩個變數是根據configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定義。在此范例中會產生test-1.0.tar.gz的檔案。

  make distcheck:和make dist類似,但是加入檢查包裝后的壓縮文件是否正常。這個目標除了把程序和相關文件包裝成tar.gz文件外,還會自動把這個壓縮文件解開,執行 configure,並且進行make all 的動作,確認編譯無誤后,會顯示這個tar.gz文件可供發布了。這個檢查非常有用,檢查過關的包,基本上可以給任何一個具備GNU開發環境-的人去重新編譯。

參考:

Linux ARM交叉編譯工具鏈制作過程

https://www.itdaan.com/blog/2013/02/21/7c0731b1c444fb4bf61dc8495047ab78.html

一、下載源文件

源代碼文件及其版本與下載地址:

Binutils-2.19.tar.bz2

http://ftp.gnu.org/gnu/binutils/

gcc-4.4.4.tar.bz2

http://mirrors.kernel.org/gnu/gcc/gcc-4.4.4/

Glibc-2.11.2.tar.bz2

Glibc-ports-2.11.tar.bz2

http://ftp.gnu.org/gnu/glibc/

Gmp-4.2.tar.bz2

http://ftp.gnu.org/gnu/gmp/

Mpfr-2.4.0.tar.bz2

http://ftp.gnu.org/gnu/mpfr/

Linux-2.6.29.tar.bz2

Patch-2.6.29.bz2 

http://www.kernel.org/pub/linux/kernel/v2.6/

 

一般一個完整的交叉編譯器涉及到多個軟件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些輔助工具;gcc是用來生成交叉編譯器,主要生成arm-linux-gcc交叉編譯工具,而glibc主要提供用戶程序所需要的一些基本函數庫。

 

二、建立工作目錄

     編譯所用主機型號 FC12.i686

     第一次編譯時用的是root用戶(第二次用一般用戶karen,該用戶可以使用sudo指令)

     所有的工作目錄都在/home/Karen/cross下面建立完成,首先在/home/karen目錄下建立cross目錄

 [root@localhost  karen] mkdir cross

進入工作目錄:

[root@localhost  root]#cd /home/karen/cross           
 查看當前目錄:

[root@localhost  cross ]# pwd 
/home/karen/cross 

創建工具鏈文件夾:

[root@localhost  cross]# mkdir embedded-toolchains

在建立了頂層文件夾embedded- toolchains,下面在此文件夾下建立如下幾個目錄:

Ø  setup-dir,存放下載的壓縮包;

Ø  src-dir,存放binutils、gcc、glibc解壓之后的源文件;

Ø  kernel,存放內核文件,對內核的配置和編譯工作也在此完成;

Ø  build-dir ,編譯src-dir下面的源文件,這是GNU推薦的源文件目錄與編譯目錄分離的做法;

Ø  tool-chain,交叉編譯工具鏈的安裝位;

Ø  program,存放編寫程序;

Ø  doc,說明文檔和腳本文件;

    下面建立目錄,並拷貝源文件。

[root@localhost  cross] #cd embedded- toolchains
[root@localhost  embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost  embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost  embedded- toolchains] #cd setup-dir

 拷貝源文件:
這里我們采用直接拷貝源文件的方法,首先應該修改setup-dir的權限

[root@localhost  embedded- toolchains] #chmod 777 setup-dir

然后直接拷貝/home/karen目錄下的源文件到setup-dir目錄中,如下圖:

 建立編譯目錄:

[root@localhost  setup-dir] #cd ../build-dir
[root@localhost  build -dir] #mkdir build-binutils build-gcc build-glibc

三、輸出環境變量

輸出如下的環境變量方便我們編譯。

為簡化操作過程。下面就建立shell命令腳本environment-variables:
[root@localhost  build -dir] #cd ../doc
[root@localhost  doc] #mkdir scripts
[root@localhost  doc] #cd scripts
用編輯器vi編輯環境變量腳本envionment-variables:

[root@localhost  scripts] #vi envionment-variables  
export  PRJROOT=/home/mxl/diliuzhang/embedded- toolchains
export  TARGET=arm-linux
export  PREFIX=$PRJROOT/tool-chain
export  TARGET_PREFIX=$PREFIX/$TARGET
export  PATH=$PREFIX/bin:$PATH

截圖如下:

 

 

%% Q:為什么用了source ./environment-variables才正常執行,去掉source就沒有執行? %%

%%  如果用source 執行, 不需要腳本有執行權限, 權限為664也可以,執行命令如下:%%

%%  Source environment-variables %%

 

說明:

TARGET變量用來定義目標板的類型,以后會根據此目標板的類型來建立工具鏈。參

看表6-1所示。目標板的定義與主機的類型是沒有關系的,但是如果更改TARGET的值,

GNU工具鏈必須重新建立一次。
PREFIX變量提供了指針,指向目標板工具程序將被安裝的目錄。
TARGET_PREFIX變量指向與目標板相關的頭文件和鏈接庫將被安裝的目錄。
PATH變量指向二進制文件(可執行文件)將被安裝的目錄。

如果不慣用環境變量的,可以直接用絕對或相對路徑。如果不用環境變量,一般都用絕對路徑,相對路徑有時會失敗。環境變量也可以定義在.bashrc文件中,這樣就不用老是export這些變量了。

體系結構和TAEGET變量的對應如下表6-1所示:

表6-1 體系結構和TAEGET變量的對應

體系結構

TARGET變量的值

PowerPC

Powerpc-linux

ARM

arm-linux

MIPS(big endian)

mips-linux

MIPS(little endian)

mipsel-linux

MIPS64

mips64-linux

SuperH3

sh3-linux

SuperH4

sh4-linux

I386

i386-linux

Ia64

ia64-linux

M68k

m68k-linux

M88k

m88k-linux

Alpha

alpha-linux

Sparc

sparc-linux

Sparc64

sparc64-linux

四、建立二進制工具(binutils)

Binutils是GNU工具之一,它包括連接器、匯編器和其他用於目標文件和檔案的工具,它是二進制代碼的處理維護工具。安裝Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。對這些程序的簡單解釋如下。

Ø  addr2line  把程序地址轉換為文件名和行號。在命令行中給它一個地址和一個可執行文件名,它就會使用這個可執行文件的調試信息指出在給出的地址上是哪個文件以及行號。

Ø  ar  建立、修改、提取歸檔文件。歸檔文件是包含多個文件內容的一個大文件,其結構保證了可以恢復原始文件內容。

Ø  as  主要用來編譯GNU C編譯器gcc輸出的匯編文件,產生的目標文件由連接器ld連接。

Ø  c++filt  連接器使用它來過濾 C++ 和 Java 符號,防止重載函數沖突。

Ø  gprof  顯示程序調用段的各種數據。

Ø  ld  是連接器,它把一些目標和歸檔文件結合在一起,重定位數據,並連接符號引用。通常,建立一個新編譯程序的最后一步就是調用ld。

Ø  nm  列出目標文件中的符號。

Ø  objcopy  把一種目標文件中的內容復制到另一種類型的目標文件中。

Ø  objdump  顯示一個或者更多目標文件的信息。使用選項來控制其顯示的信息,它所顯示的信息通常只有編寫編譯工具的人才感興趣。

Ø  ranlib  產生歸檔文件索引,並將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。

Ø  readelf  顯示elf格式可執行文件的信息。

Ø  size  列出目標文件每一段的大小以及總體的大小。默認情況下,對於每個目標文件或者一個歸檔文件中的每個模塊只產生一行輸出。

Ø  strings  打印某個文件的可打印字符串,這些字符串最少4個字符長,也可以使用選項-n設置字符串的最小長度。默認情況下,它只打印目標文件初始化和可加載段中的可打印字符;對於其它類型的文件它打印整個文件的可打印字符。這個程序對於了解非文本文件的內容很有幫助。

Ø  strip  丟棄目標文件中的全部或者特定符號。

Ø  libiberty  包含許多GNU程序都會用到的函數,這些程序有getopt、obstack、strerror、strtol和strtoul。

Ø  libbfd  二進制文件描述庫。

Ø  libopcode  用來處理opcodes的庫,在生成一些應用程序的時候也會用到它。

Binutils工具安裝依賴於Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具

下面將分步介紹安裝binutils-2.19.2的過程。

[root@localhost  script] # cd $PRJROOT/src-dir
[root@localhost  src-dir] # tar jxvf ../setup-dir/binutils-2.19.tar.bz2
[root@localhost  src-dir] # cd $PRJROOT/build-dir/build-binutils
創建Makefile:

[root@localhost  build-binutils] #http://www.cnblogs.com/src-dir/binutils-2.19/configure --target=$TARGET --prefix=$PREFIX

   在build-binutils目錄下面生成Makefile文件,然后執行make,make install。完成后可以在$PREFIX/bin下面看到我們的新的binutil。

注意:每個工具的文件名的前綴都是前面為TARGET變量設定的值。如果目標板arm-linux,那么這些工具的文件名前綴就會是arm-linux-。這樣就可以根據目標板類型找到正確的工具程序。

  

五、建立內核頭文件

在這里我們使用時2.6.29的內核版本,因為交叉工具鏈工具鏈是針對特定的處理器和操作系統的,因此在編譯之前就需要對linux內核進行配制,可以通過“make config”或“make menuconfig”命令對內核進行配制,配制完成后,在linux源文件的目錄下就會生成一個.config文件,這就是我們所需要的文件。

Note: 目標板的內核版本是2.6.29

 

[root@localhost  embedded- toolchains] #cd kernel

[root@localhost  kernel] #tar jxvf ../setup-dir/ linux-2.6.29.tar.bz2                
[root@localhost  kernel] #bunzip2 ../setup-dir/ patch-2.6.29.bz2 
[root@localhost  kernel] #cd linux-2.6.29
給Linux內核打補丁:

[root@localhost  linux-2.6.29] #patch –p1  <  http://www.cnblogs.com/setup-dir/patch-2.6.29

然后就是配置內核,第一步是修改Makefile

修改 Makefile:

ARCH = arm                         

CROSS_COMPILE = arm-linux- menuconfig  

接着使用make menuconfig進入內核配置菜單

或者直接寫:

# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig ,注意在配置時一定要選擇處理器的類型,比如我的目標機使用的處理器是OMAP類型的,就選TI OMAP:

System Type -à

         ARM System Type -à

         (x) TI OMAP

配置完退出並保存。

配置完須執行make,參數如下:

[root@localhost linux-2.6.29]# make ARCH=arm CROSS_COMPILE=arm-linux- (執行過程中有錯誤出現也沒關系,主要目的是產生頭文件version.h和autoconf.h)

執行完檢查一下內核目錄中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,這是編譯glibc要用到的。version.h 和 autoconf.h 文件的存在,說明你生成了正確的頭文件。

接下來建立工具鏈需要的include目錄,並將內核頭文件復制過去。
[root@localhost  linux-2.6.29] #cd include
[root@localhost  include] #ln -s asm-arm asm

可以查看一下,經過編譯可以自動生成。如果已經生成鏈接,則不必重新鏈接。(2.6.29已自動生成)
[root@localhost  include] #cd asm
[root@localhost  asm] #ln -s arch-epxa arch  

[root@localhost  asm] #ln -s proc-armv proc

可以查看一下,經過編譯可以自動生成。如果已經生成鏈接,則不必重新鏈接。

復制頭文件到交叉編譯工具鏈的安裝目錄:

[root@localhost  asm] #mkdir –p $TARGET_PREFIX/include
[root@localhost asm] #cp –r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/include
[root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/include/asm-arm $TARGET_PREFIX/include/asm

[root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/include/asm-generic $TARGET_PREFIX/include

root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/include/asm  $TARGET_PREFIX/include

root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/mach-omap2/include/mach $TARGET_PREFIX/include/asm

Note: mach-xxx是根據目標板所用的cpu類型來選擇的

 

六、建立初始編譯器 (boot strap gcc)

這一步的目的主要是建立arm-linux-gcc工具,注意這個gcc沒有glibc庫的支持,所以只能用於編譯內核、BootLoader等不需要C庫支持的程序,后面創建C庫也要用到這個編譯器,所以創建它主要是為創建C庫做准備,如果只想編譯內核和BootLoader,那么安裝完這個就可以到此結束。安裝過程如下:

  [root@localhost  build-binutils] #cd $PRJROOT/setup-dir

重命名:
[root@localhost  setup-dir] #mv gcc-core-4.4.4.tar.bz2  gcc-4.4.4.tar.bz2 
[root@localhost  setup-dir] #cd $PRJROOT/src-dir
[root@localhost  src-dir] #tar jxvf ../setup-dir/gcc-4.4.4.tar.bz2

從 GCC-4.3起,安裝GCC將依賴於GMP-4.1以上版本和MPFR-2.3.2以上版本。如果將這兩個軟件包分別解壓到GCC源碼樹的根目錄下,並分別命名為"gmp"和"mpfr",那么GCC的編譯程序將自動將兩者與GCC一起編譯。建議盡可能使用最新的GMP和MPFR版本。

[root@localhost src-dir]# tar jxvf ../setup-dir/mpfr-2.4.0.tar.bz2

[root@localhost src-dir]# tar jxvf ../setup-dir/gmp-4.2.tar.bz2

[root@localhost src-dir]# mv mpfr-2.4.0 gcc-4.4.4/mpfr

[root@localhost src-dir]# mv gmp-4.2.0 gcc-4.4.4/gmp

•因為是交叉編譯器,還不需要目標板的系統頭文件,所以需要使用 --without-headers這個選項。否則會有很多*.h頭文件找不到的報錯

•--enable-language=c用來告訴配置腳本,需要產生的編譯器支持何種語言,現在只需支持C語言。雖然配置為c,c++也可以的

•--disable-threads 是因為threads需要libc的支持。

•--disable-decimal-float,需要libc的支持,而我們在初步編譯的時候尚未生成libc,否則出現以下的報錯:

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c: In function '__dfp_test_except':

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function)

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is reported only once

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.)

 

•--disable-shared,既然是第一次安裝ARM交叉編譯工具,那么本機的glibc支持的應該是本機的編譯工具庫,而不是ARM交叉編譯工具庫。forces GCC to link its internal libraries statically,沒有這個選項,會有 crti.o: No such file: No such file or directory collect2: ld returned 1 exit status

注:由於沒有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止兩個邊界檢查使用的庫。

同樣,由於第一次安裝ARM交叉編譯工具,那么支持的libc庫的頭文件也沒有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加兩個定義:-Dinhibit_libc  –D__gthr_posix_h

原文:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC

改后:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D_gthr_posix.h

編譯:
[root@localhost  src-dir] #cd $PRJROOT/build-dir/build-gcc

[root@localhost build-gcc]# http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-shared --disable-threads --disable-decimal-float –disable-libmudflap –disable-lipssp

 [root@localhost build-gcc]# make all-gcc

 [root@localhost build-gcc]# make install-gcc

 [root@localhost build-gcc]# make all-target-libgcc

 [root@localhost build-gcc]# make install-target-libgcc

注:很多資料中之有前面兩項,這只建立了gcc,沒有建立libgcc.a,這樣會在glibc的編譯中出現-lgcc沒有找到的錯誤。報告:

……/build-tools/build-glibc/libc_pic.a

i586-linux-gcc   -nostdlib -nostartfiles -r -o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o '-Wl,-(' /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-glibc/libc_pic.a -lgcc '-Wl,-)' -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT

/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4/http://www.cnblogs.com/http://www.cnblogs.com/ram-linux/bin/ld: cannot find -lgcc

在glibc的編譯中,還需要libgcc_eh.a(否則出現錯誤:-lgcc_eh沒有找到……bin/ld: cannot find -lgcc_eh),使用了--disable-shared的選項,將不會生成libgcc_eh.a,可以通過對libgcc.a的鏈接來實現。

[root@localhost build-gcc]#  ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

  Note:arm-linux-gcc與-print-libgcc-file-name之間有一個空格  

 運行報告:

“/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a” -> “libgcc.a”

裝完成后,查看結果:

[root@localhost  build-gcc] #ls $PREFIX/bin 

如果arm-linux-gcc等工具已經生成,表示boot trap gcc工具已經安裝成功

七、編譯glibc

  這一步是最為繁瑣的過程,目標板必須靠它來執行或者是開發大部分的應用程序。glibc套件常被稱為C鏈接庫,但是glibc實際產生很多鏈接庫,其中之一是C鏈接庫libc。因為嵌入式系統的限制,標准GNU C鏈接庫顯得太大,不適合應用在目標板上。所以需要尋找C鏈接庫的替代品,在這里現以標准GNU C為例建立工具鏈。

[root@localhost  build-gcc] #cd $PRJROOT/src-dir
[root@localhost  src-dir] # tar jxvf ../setup-dir/glibc-2.11.2.tar.bz2
[root@localhost  src-dir] # tar jxvf ../setup-dir/glibc-ports-2.11.tar.bz2

[root@localhost  src-dir] # mv –v glibc-ports-2.11 glibc-2.11.2/ports

[root@localhost  src-dir] # cd glibc-2.11.2

[root@localhost  glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-gcc_fix-1.patch

[root@localhost  glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-makefile_fix-1.patch

[root@localhost  glibc-2.11.2] # cd $PRJROOT/build-dir/build-glibc

[root@localhost build-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib /
http://www.cnblogs.com/src-dir/glibc-2.11.2/configure /
--host=arm-linux /
--prefix=$PREFIX/$TARGET /

--with-tls --disable-profile /
--enable-add-ons /

--with-headers=$PREFIX/$TARGET/include /
libc_cv_forced_unwind=yes /
libc_cv_c_cleanup=yes /

libc_cv_arm_tls=yes

 [root@localhost build-glibc] # make

 [root@localhost build-glibc] # make install

 

   注:以上完成后,請查看一下$TARGET_PREFIX/lib目錄下的文件libc.so,看看GROUP的內容是否指定到可以用於交叉編譯的庫,如果不是請修改,如下。

   libc.so 文件(所在目錄是$TARGET_PREFIX/lib),將GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改為GROUP ( libc.so.6 libc_nonshared.a)

這樣連接程序 ld 就會在 libc.so 所在的目錄查找它需要的庫,因為你的機子的/lib目錄可能已經裝了一個相同名字的庫,一個為編譯可以在你的宿主機上運行的程序的庫,而不是用於交叉編譯的。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 經過查看,發現libc.so中的GROUP已經是交叉編譯鏈的目錄,所以不用更改

對 libc.so 的修正·

 

vi $PREFIX /${TARGET}/lib/libc.so

 

去掉絕對路徑,修改后的內容如下:

 

/* GNU ld script

 

    Use the shared library, but some functions are only in

 

    the static library, so try that secondarily. */

 

OUTPUT_FORMAT(elf32-littlearm)

 

GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

八、建立全套編譯器 (full gcc)

[root@localhost  build-gcc] #http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX  --enable-languages=c,c++ --enable-shared

[root@localhost  build-gcc] #make all

[root@localhost  build-gcc] #make install

  

我們再來看看 $PREFIX/bin 里面多了哪些東西。你會發現多了 arm-linux-g++ 、和 arm-linux-c++ 幾個文件。

G++-gnu的 c++ 編譯器。

C++-gnu 的 c++ 編譯器。

至此,整個交叉編譯環境就建立完成了。

 九、完成工具鏈的設置

 root@localhost  build-gcc] # cd $TARGET_PREFIX/bin

查看文件是否為二進制文件:
[root@localhost  bin] # file as ar gcc ld nm ranlib strip   

查看缺省的搜尋路徑:
[root@localhost  bin] #arm-linux-gcc -print-search-dirs  

  十、測試和驗證交叉編譯工具

    下面編寫一個簡單的C程序,使用建立的工具鏈。、
[root@localhost  bin] #cd $PRJROOT/program
[root@localhost  program] #vi hello.c
#include <stdio.h>

int main(void)

{

           printf("hello linux/n");

           return 0;

}

[root@localhost  program] #arm-linux-gcc hello.c -o hello –static (制作靜態可執行文件)

 制作的可執行文件hello可以直接在目標機上運行。

 

GNU編譯工具鏈包括binutils,gcc,glibc

binutils:匯編器、連接器
gcc:預處理器、編譯器
glibc: C語言庫

編譯arm-linux-gcc要編譯兩次,第1次是不帶庫的純gcc,可以用來編譯裸機程序如linux內核,u-boot等.
然后用第1次編譯的gcc來編譯目標glibc(或者uclibc)
然后進行第二次gcc編譯.
准備以下源碼:

binutils-2.25.tar.bz2
gcc-4.9.2.tar.bz2
glibc-2.21.tar.xz
gmp-5.1.3.tar.xz
linux-3.4.106.tar.xz
mpc-1.0.3.tar.gz
mpfr-3.1.2.tar.xz
編譯順序:
gmp -> mpfr -> mpc -> binutils -> gcc -> glibc -> binutils -> gcc

1.依次編譯gmp,mpfr,mpc
默認安裝位置是/usr/local/lib

#./configure
#make
#make install

2.編譯binutils
# ./configure --host=i686-linux-gnu --disable-nls --disable-multilib --disable-shared --target=arm-linux-gnueabi --prefix=/home/toolchain/arm-linux-gnueabi-4.9.2 --with-sysroot=/home/toolchain/arm-linux-gnueabi-4.9.2/arm-linux-gnueabi/sysroot

#./configure --disable-nls --disable-multilib --disable-shared --target=arm-none-linux-gnueabi --prefix=/home/toolchain/arm-linux-gcc-nolibc
# make
# make install

3.編譯gcc
../configure --host=i686-linux-gnu  --enable-targets=all --disable-shared --enable-languages=c --disable-checking --disable-threads --disable-multilib --disable-nls --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --without-headers --with-newlib --disable-bootstrap --disable-libquadmath --disable-libatomic --with-cpu=arm920t --target=arm-none-linux-gnueabi --prefix=/home/toolchain/arm-none-linux-gnueabi

4.編譯glibc
#CC=arm-none-linux-gnueabi-gcc ../configure --host=arm-linux-gnueabi --prefix=/usr --enable-kernel=2.6.32 --with-headers=/home/gnu/linux-3.4.106/usr/include --disable-profile --with-tls --enable-shared -cache-file=config.cache
#make -j4
#make install_root=/home/toolchain/arm-linux-gcc/arm-linux-gnueabi/sysroot install

5.再編譯gcc
../configure --host=i686-linux-gnu --disable-shared --enable-targets=all --with-cpu=arm920t --enable-languages=c --disable-multilib --disable-nls --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-bootstrap --disable-libquadmath --disable-libatomic --target=arm-linux-gnueabi --enable-threads=posix --prefix=/home/toolchain/arm-linux-gnueabi-4.9.2 --with-sysroot=/home/toolchain/arm-linux-gnueabi-4.9.2/arm-linux-gnueabi/sysroot

環境變量:

【1】include頭文件路徑
除了默認的/usr/include, /usr/local/include等include路徑外,還可以通過設置環境變量來添加系統include的路徑:
# C
export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
# CPP
export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH

以上修改可以直接命令行輸入(一次性),可以在/etc/profile中完成(對所有用戶生效),也可以在用戶home目錄下的.bashrc或.bash_profile中添加(針對某個用戶生效),修改完后重新登錄即生效。

unset環境變量:

新建目錄

 

the root filesystem on /dev

LInux 強制重啟報錯The root filesystem on /dev/sda1 requires a manual fsck

修復問題磁盤

(initramfs) fsck /dev/sda1  

然后系統重啟

reboot

svn安裝

安裝svn
apt-get install subversion

linux清空jobs及后台執行

fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令

一、&

加在一個命令的最后,可以把這個命令放到后台執行,如

watch  -n 10 sh  test.sh  &  #每10s在后台執行一次test.sh腳本

二、ctrl + z

可以將一個正在前台執行的命令放到后台,並且處於暫停狀態。

三、jobs

查看當前有多少在后台運行的命令

jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。也就是說,jobs命令顯示的是當前shell環境中所起的后台正在運行或者被掛起的任務信息;

四、fg

將后台中的命令調至前台繼續運行。如果后台中有多個命令,可以用fg %jobnumber(是命令編號,不是進程號)將選中的命令調出。

五、bg

將一個在后台暫停的命令,變成在后台繼續執行。如果后台中有多個命令,可以用bg %jobnumber將選中的命令調出。

將任務轉移到后台運行:

先ctrl + z;再bg,這樣進程就被移到后台運行,終端還能繼續接受命令。

概念:當前任務

如果后台的任務號有2個,[1],[2];如果當第一個后台任務順利執行完畢,第二個后台任務還在執行中時,當前任務便會自動變成后台任務號碼“[2]” 的后台任務。所以可以得出一點,即當前任務是會變動的。當用戶輸入“fg”、“bg”和“stop”等命令時,如果不加任何引號,則所變動的均是當前任務

六、kill

    法子1:通過jobs命令查看job號(假設為num),然后執行kill %num
    法子2:通過ps命令查看job的進程號(PID,假設為pid),然后執行kill pid

前台進程的終止:Ctrl+c

kill的其他作用

kill除了可以終止進程,還能給進程發送其它信號,使用kill -l 可以察看kill支持的信號。

SIGTERM是不帶參數時kill發送的信號,意思是要進程終止運行,但執行與否還得看進程是否支持。如果進程還沒有終止,可以使用kill -SIGKILL pid,這是由內核來終止進程,進程不能監聽這個信號。

七、nohup

如果讓程序始終在后台執行,即使關閉當前的終端也執行(之前的&做不到),這時候需要nohup。該命令可以在你退出帳戶/關閉終端之后繼續運行相應的進程。關閉中斷后,在另一個終端jobs已經無法看到后台跑得程序了,此時利用ps(進程查看命令)
ps -aux | grep "test.sh" #a:顯示所有程序 u:以用戶為主的格式來顯示 x:顯示所有程序,不以終端機來區分

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM