關(guān)鍵詞:鏈接器的意義、鏈接器的工作內(nèi)容鸦列、程序的啟動過程惹挟、自定義程序入口函數(shù)
1. 鏈接器的意義
鏈接器的主要作用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確的銜接盯桦。即協(xié)調(diào)目標文件和庫文件。
2. 目標文件(.o
)的秘密
- 各個段沒有具體的起始地址渤刃,只有段大小信息
- 各個標識符沒有實際地址拥峦,只有段中的相對地址
- 段和標識符的實際地址需要鏈接器具體確定
3. 鏈接器的工作內(nèi)容
-
將目標文件和庫文件整合為最終的可執(zhí)行程序
1)合并各個目標文件的段(.text, .data, .bss)
2)確定各個段和段中標識符的最終地址(重定位)
4. main()是否為第一個被調(diào)用的函數(shù)?
在Linux的默認情況下(gcc編譯器下):
1) 程序加載后卖子,_start()
是第一個被調(diào)用執(zhí)行的函數(shù)
2)_start()
函數(shù)準備好參數(shù)后立即調(diào)用_libc_start_main()
函數(shù)
3)_libc_start_main()
函數(shù)初始化運行環(huán)境后調(diào)用main()
函數(shù)執(zhí)行
_start()
函數(shù)的入口地址是代碼段(.text)的起始地址
5. _libc_start_main()
函數(shù)的作用:
1) 調(diào)用_libc_csu_init()
函數(shù):完成必要的初始化操作
2)啟動程序的第一個線程(主線程)略号,main()
為線程入口
3)注冊_libc_csu_fini()
函數(shù):程序運行終止是被調(diào)用
6. 程序的啟動過程
7. 自定義程序入口函數(shù)
- gcc提供
-e
選項用于在鏈接時指定入口函數(shù) - 自定義入口函數(shù)時必須使用
-nostartfiles
選項進行鏈接
#include <stdio.h>
#include <stdlib.h>
int program()
{
printf("jacob2359\n");
exit(0);
}
輸入:gcc -e program -nostartfiles program.o -o program.out
輸出結(jié)果:
jacob2359
聲明:此文章為本人在學(xué)習(xí)狄泰軟件學(xué)院《十二月提升計劃》所做的筆記,參考書籍《專業(yè)嵌入式軟件開發(fā)》——李云,文章中包含狄泰軟件資料內(nèi)容和《專業(yè)嵌入式軟件開發(fā)》資料內(nèi)容玄柠,一切版權(quán)歸狄泰軟件和《專業(yè)嵌入式軟件開發(fā)》所有突梦!