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


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

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

安裝教程

博主使用的是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,這個腳本就是安裝文件。沒事不要用普通的文本編輯器打開,高級點的文本編輯器可以。

使用教程

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

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
    1

  2. arm-elf-gcc -c max.s
    由匯編文件編譯得到Object文件max.o
    2

  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


免責聲明!

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



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