一開始須要安裝arm-elf-gcc,可是這是一個32位的程序,我是安裝了64位的系統,聽說安裝ia32.libs依賴庫能運行這個,可是看到博客上面前人安裝完了系統圖標少了一半,而後就怕了。通過了翻看ubuntu論壇和各類博客,才知道14版以後的ubuntu64位官方已經拋棄了ia32.libs這個依賴庫,在源列表中也是找不到的。可是官方自身已經支持32位,自帶32位依賴庫,在根目錄下面就有一個lib32文件夾。ubuntu
博主使用的是arm-elf-tools-20040427.sh的編譯器,比較老舊,但不影響使用。編輯器
sudo chmod 755 arm-elf-tools-20040427.sh
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; }
arm-elf-gcc -S max.c
獲得由c文件生成的彙編文件max.s
code
arm-elf-gcc -c max.s
由彙編文件編譯獲得Object文件max.o
blog
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爲例子
arm-elf-ld.real -o max2.out max.o
用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文件裏面比原來的多了不少內容,最大的不一樣在於區分了各個文件的代碼段