使用gcc編譯出二進位制檔案給uboot中go的命令執行.
test.c 檔案如下
***************= start of test.c ***********************************====
#include
typedef void (*pr)(const char *fmt, ...);
int main(int argc, char **argv)
***************= end of test.c ***********************************====
makefile 檔案如下:
1. 使用gcc的-c選項聲場.o檔案
2. 使用ld並指定lds檔案生成elf檔案
3. 使用objcopy去掉符號表, 生成二進位制檔案
***************= start of makefile ***********************************====
cross_compile ?= /opt/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
cc := $gcc
ld := $ld
nm := $nm
objcopy := $objcopy
objdump := $objdump
cflags := -fno-builtin -wall -wstrict-prototypes -fno-stack-protector -fno-common -nostdinc -static -fpic
cflags += -isystem /opt/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/include
cflags += -marm -mabi=aapcs-linux -mno-thumb-interwork -march=armv5
#ldflags := -ttext 0x82000000 -e main --oformat binary
ldflags := -bstatic -t test.lds -v
# output map file
ldflags += -map test.map
ldflags += -l /opt/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0 -lgcc
all:
$(cc) $ -c go_test.c -o go_test.o
$(ld) $ go_test.o -o go_test.elf
$(nm) -n go_test.elf > go_test.map
$(objcopy) -s -o binary go_test.elf go_test.bin
cp go_test.bin /tftpboot/
***************= end of makefile ***********************************====
test.lds 檔案如下:
output_format : 輸出的檔案格式
output_arch : 輸出檔案的cpu型別
entry : 輸出檔案的入口, 與ld中的-e選項等效
指定其實位址為 : 0x82000000, 根據uboot中載入位址而定
***************= start of test.lds ***********************************====
output_format("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
output_arch(arm)
entry(main)
sections
.data :
.bss :
}***************= end of test.lds ***********************************====
使用上面3個件便可編譯出 go_test.bin的二進位制檔案, 然後拷貝到 /tftpboot目錄下, 並在uboot中輸入:
#tftp 82000000 go_test.bin
#go 82000000
執行這條命令後輸出如下:
hello wolrd
可見go_test.bin正常執行.
錯誤解決:
1. go_test.o:(.arm.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr1' : 更換乙個gcc工具鏈即可, 原來使用arm-2010q1 出現這個錯誤. 後來更換成arm-eabi-4.4.0就可以了. 不過arm-eabi-4.4.0不能生成linux可執行的elf檔案.
2. go_test.o:could not read symbols: file in wrong format : 由於makefile編寫錯誤造成的, 沒個cc變數賦值,而使用i386 gcc編譯. 使用file命令可檢視go_test.o檔案的格式.
二進位制檔案
本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制 而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制 應該怎麼樣解釋。二進位制檔案的讀取是是要告訴元素的型別 編碼方式 文字檔案則預設為char型別。文字檔案是一種特殊的二進...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...