ARM 2410 可執行檔案的函式入口問題

2021-06-09 20:52:16 字數 1782 閱讀 5139

1.先看啟動**:

.text

.global _start

_start:

ldr sp, =4096

bl disable_watch_dog

bl memsetup

bl copy_2th_to_sdram

bl create_page_table

bl mmu_init

ldr sp, =0xb4000000

ldr pc, =0xb0004000//此處,指定了跳轉到main.o處執行(在lds檔案中指定了main.o在sdram的位置)

#bl main

halt_loop:

b halt_loop

2.然後看lds檔案:

sections

second 0xb0004000 : at(2048)//此處,指定main.o執行在0xb0004000

}3.然後看主函式兩種不同的書寫格式

第一種格式為:(正確)

void delay(unsigned int time);//delay函式為宣告,無**,不產生操作指令

int main(void)

void delay(unsigned int time)

反彙編為:

b0004000:的入口函式為main,位址為b0004000

b0004000:e3a0320a movr3, #-1610612736; 0xa0000000

b0004004:e5932050 ldrr2, [r3, #80]

(省略)

b0004024 :

b0004024:e3500000 cmpr0, #0; 0x0

b0004028:d1a0f00e movlepc, lr

第二種格式為:(有問題)

void delay(unsigned int time)//函式,產生操作指令,入口位址的函式發生了變化

int main(void)

反彙編為:

b0004000 ://b0004000的入口變成了delay函式,不能進入main函式

b0004000:e3500000 cmpr0, #0; 0x0

b0004004:d1a0f00e movlepc, lr

(省略)

b0004018 :

b0004018:e3a0320a movr3, #-1610612736; 0xa0000000

b000401c:e5932050 ldrr2, [r3, #80]

總結:

1.如果用ldr pc, =***指令跳轉到乙個可重定位檔案執行,那個我們希望成為入口函式的函式要寫在最前邊,其他產生操作指令的動作、函式定義要寫在他的後邊。

2.如果入口函式呼叫其他函式,而這個函式又在本檔案中定義,那這個函式一樣會在入口函式前展開。

3.解決辦法:

a.把入口函式需要呼叫的函式都寫在另乙個檔案中,然後用#include包含過來

b.  把要呼叫的函式,加上宣告:static inline ,變成內聯函式。

API函式執行可執行檔案

shellexecute hwnd hwnd,父視窗控制代碼 lpcstr lpoperation,操作型別 lpcstr lpfile,要進行操作的檔案或路徑 lpcstr lpparameters,當lpoperation為 explore 時指定要傳遞的引數,通常設為null lpcstr l...

linux 執行可執行檔案

1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...

Linux的可執行檔案

linux的可執行檔案 用ls f命令,後買帶 的就是可執行檔案。linux下,當你使用.執行乙個程式時,首先是shell來接管你的輸入,然後用fork派生子程序,最後用execv系列將你的那個程式的 交給核心 1。檢查你執行的檔案的屬性,其屬性在它的i節點中描述,如果你的那個檔案不是可執行的屬性,...