arm-elf-gcc交叉編譯器的使用教程
一開始需要安裝arm-elf-gcc,但是這是一個32位的程序,我是安裝了64位的系統,據說安裝ia32.libs依賴庫能運行這個,但是看到博客上面前人安裝完了系統圖標少了一半,然后就怕了。經過了翻看ubuntu論壇和各種博客,才知道14版之后的ubuntu64位官方已經拋棄了ia32.libs這個依賴庫,在源列表中也是找不到的。但是官方自身已經支持32位,自帶32位依賴庫,在根目錄下面就有一個lib32文件夾。
安裝教程
博主使用的是arm-elf-tools-20040427.sh的編譯器,比較老舊,但不影響使用。
- 打開終端
- 切換到arm-elf-tools-200427.sh所在路徑
- 增加執行權限
sudo chmod 755 arm-elf-tools-20040427.sh
- 安裝
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;
}
-
arm-elf-gcc -S max.c
得到由c文件生成的匯編文件max.s
-
arm-elf-gcc -c max.s
由匯編文件編譯得到Object文件max.o
-
arm-elf-readelf -a max.o > max_elfinfo
這個命令將給出全部的Object文件信息,保存在max_elfinfo這個文件中
-
查看一下max_elfinfo文件:ELF_header
-
查看一下max_elfinfo文件:Section_header
-
hexdump -C max.o > max_hex
直接打印出Object文件的全部字節,保存在max_hex文件中
以上面的.real.text為例子
-
Elf最后輸出的內容
.rel.text告訴鏈接器指令中的哪些地方需要做重定位;
.symtab是符號表。Ndx列是每個符號所在的Section編號 -
arm-elf-ld.real -o max2.out max.o
鏈接指定Object文件,max2.out為生成的文件,max.o為源文件
由於沒有__gccmain函數入口,故有warning,此處先不管,綠色即為新生成文件 -
用readelf命令分析新生成的max2.out
arm-elf-readelf -a max2.out > max2_elfinfo
-
調用不同c文件中的子函數
程序修改后如下:
-
編譯兩份c文件生成 .o 文件
-
arm-elf-ld.real -o main2.out main.o encrypt_char.o -lc
main2.out是鏈接生成的文件,main.o encrypt_char.o是參與鏈接的源文件,-lc 允許鏈接器搜索默認的路徑,當你使用了系統自帶的頭文件或子函數時,需要添加該選項以便鏈接器能順利鏈接到對應庫
-
arm-elf-objdump -S main2.out > main2_1.s
反匯編鏈接后的.out文件,和鏈接前的.o文件反匯編結果進行比較
新生成的main2_1.s文件里面比原來的多了很多內容,最大的不同在於區分了各個文件的代碼段