gcc生成二進位制檔案供uboot的go命令執行

2021-06-05 04:32:24 字數 2567 閱讀 5038

使用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...