arm-elf-gcc交叉編譯器的使用教程

arm-elf-gcc交叉編譯器的使用教程

一開始須要安裝arm-elf-gcc,可是這是一個32位的程序,我是安裝了64位的系統,聽說安裝ia32.libs依賴庫能運行這個,可是看到博客上面前人安裝完了系統圖標少了一半,而後就怕了。通過了翻看ubuntu論壇和各類博客,才知道14版以後的ubuntu64位官方已經拋棄了ia32.libs這個依賴庫,在源列表中也是找不到的。可是官方自身已經支持32位,自帶32位依賴庫,在根目錄下面就有一個lib32文件夾。ubuntu

安裝教程

博主使用的是arm-elf-tools-20040427.sh的編譯器,比較老舊,但不影響使用。編輯器

  1. 打開終端
  2. 切換到arm-elf-tools-200427.sh所在路徑
  3. 增長執行權限
    sudo chmod 755 arm-elf-tools-20040427.sh
  4. 安裝
    sudo sh arm-elf-tools-20040427.sh

以上,安裝完成函數

注:文件arm-elf-tools-20040427.sh的大小有17M,這個腳本就是安裝文件。沒事不要用普通的文本編輯器打開,高級點的文本編輯器能夠。測試

使用教程

首先上一份簡單的測試代碼3d

int max( int* pt, int size )
{
    int max_v = -32768;
    int* tmp = &pt[size];
    int* pi = pt;
    
    while(pi<tmp){
        if( *pi>max_v ){
            max_v = *pi;
        
        }
        pi++;
    }
    
    return max_v;   
}
  1. arm-elf-gcc -S max.c
    獲得由c文件生成的彙編文件max.s
    1code

  2. arm-elf-gcc -c max.s
    由彙編文件編譯獲得Object文件max.o
    2blog

  3. arm-elf-readelf -a max.o > max_elfinfo
    這個命令將給出所有的Object文件信息,保存在max_elfinfo這個文件中
    3教程

  4. 查看一下max_elfinfo文件:ELF_header
    4編譯器

  5. 查看一下max_elfinfo文件:Section_header
    5
    5_2博客

  6. hexdump -C max.o > max_hex
    直接打印出Object文件的所有字節,保存在max_hex文件中
    6
    以上面的.real.text爲例子
    6_2

  7. Elf最後輸出的內容
    7
    .rel.text告訴連接器指令中的哪些地方須要作重定位;
    .symtab是符號表。Ndx列是每一個符號所在的Section編號
  8. arm-elf-ld.real -o max2.out max.o
    連接指定Object文件,max2.out爲生成的文件,max.o爲源文件
    8
    因爲沒有__gccmain函數入口,故有warning,此處先無論,綠色即爲新生成文件
  9. 用readelf命令分析新生成的max2.out
    arm-elf-readelf -a max2.out > max2_elfinfo
    9
    9_2
    9_3

  10. 調用不一樣c文件中的子函數
    程序修改後以下:
    10
    10_2
    10_3

  11. 編譯兩份c文件生成 .o 文件
    11

  12. arm-elf-ld.real -o main2.out main.o encrypt_char.o -lc
    main2.out是連接生成的文件,main.o encrypt_char.o是參與連接的源文件,-lc 容許連接器搜索默認的路徑,當你使用了系統自帶的頭文件或子函數時,須要添加該選項以便連接器能順利連接到對應庫
    12

  13. arm-elf-objdump -S main2.out > main2_1.s
    反彙編連接後的.out文件,和連接前的.o文件反彙編結果進行比較
    13
    新生成的main2_1.s文件裏面比原來的多了不少內容,最大的不一樣在於區分了各個文件的代碼段
    13_2
    13_3
    13_4

相關文章
相關標籤/搜索