Glibc輔助執行庫 乙個部落格id 新浪部落格

2021-09-24 11:21:50 字數 2112 閱讀 5618

程式的一些特性的操作必須在main函式之前執行,還有一些操作必須在mian函式之後執行,這裡再提一下c++ 

因為最具代表性的就是c++ 的全域性物件的構造與析構函式

即c++ 的全域性物件建構函式在main 函式之前執行,而c++ 全域性物件的析構函式在main函式之後被執行。

linux 系統中,一般程式的入口是「 _start ", 這個函式是linux系統庫(

glibc)的一部分。當我們的程式與glibc庫鏈結在一起形成最終的可執行檔案以後,這個函式就是程式的初始化部分的入口,程式的初始化部分完成一系列初始化過程以後,就會呼叫main函式來執行程式的主體。在main函式執行完成以後,返回到初始化部分,會進行一系列清理工作,然後結束程序。

crt:c run time 的縮寫

用於初始化進入main之前的工作 ,全域性構造和析構  以及  退出 main函式 後的清理工作

crt1.o, crti.o, crt begin.o, crt end.o, crtn.o 

daemon.o  由我們自己的c程式檔案產生

可執行檔案  =  某幾個/全部(crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o )    +    daemon.o 

在標準的linux平台下,鏈結的順序是:   ld     crt1.o     crti.o      [user_objects]       [system_libraries]        crtn.o

crt1.o:起初也叫crt.o,包含了主函式的入口位址 _start 等,ctr.o == crt1.o

說白了就是呼叫main函式

由它負責呼叫__libc_start_main初始化libc    並且     呼叫main函式進入真正的程式主體。

有些鏈結器對鏈結時目標檔案和庫的順序有依賴性,

crt.o這個檔案必須被放在鏈結器命令列中的所有輸入檔案中的第乙個

crtbegin.o

crtend.o

# 真正c++全域性構造和析構是由crtbegin.o和crtend.o實現的

crtbegin.o和crtend.o是c++語言的啟動模組,由編譯器gcc提供;

而crt1.o則與crt0.o的作用類似,主要用於在呼叫main()之前做一些初始化工作,全域性符號_start就定義在這個模組中。

crtbegin.o和crtend.o主要用於c++語言,在.ctors和.dtors區中執行全域性構造(constructor)和析構(destructor)函式。

crti.o: init()函式的**      .init在main函式前執行

crtn.o :fini()函式的**  .finit在main函式後執行

# crti.o和crtn.o只是提供了main之前和之後執行**的機制

init段,.finit 段需要的一些輔助**,分別位於crti.o和crtn.o。

開始是來自crti.o的,而末尾是來自crtn.o的,中間才是真正程式的全域性構造或者析構函式,

也就是說程式的全域性構造和析構僅僅是_init和_finit的中間部分.

_start 函式呼叫: __libc_start_main 函式

__libc_start_main 會呼叫 __libc_csu_init, __libc_csu_fini,及main 函式

簡單表示為如下:

__libc_start_main (main,__libc_csu_init,__libc_csu_fini)

__libc_csu_init, 負責呼叫_init()

__libc_csu_fini, 負責呼叫_finit()

crtbegin.o    crtend.o檔案:

這兩個檔案是用於配合glibc實現c++全域性構造和析構的。

構造過程:

_start-->__lib_start_main-->__libc_csu_init-->_init--> __do_global_ctors

雜湊分治 乙個部落格id 新浪部落格

海量資料的排序問題 1.如果資料不重複,可以使用位圖 2.海量資料,記憶體有限 歸併排序 如 設有數列 初始狀態 6,202,100,301,38,8,1 第一次歸併後 比較次數 3 第二次歸併後 比較次數 4 第三次歸併後 比較次數 4 top k問題 分而治之 雜湊對映 雜湊統計 排序 對於最終...

gcc和g 區別 乙個部落格id 新浪部落格

誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些。2.編譯階段,g 會呼叫gcc,對於c 兩...

作業系統程序排程演算法 乙個部落格id 新浪部落格

先來先服務 fcfs,first come first served 在所有排程演算法中,最簡單的是非搶占式的fcfs演算法。演算法原理 程序按照它們請求cpu的順序使用cpu.就像你買東西去排隊,誰第乙個排,誰就先被執行,在它執行的過程中,不會中斷它。當其他人也想進入記憶體被執行,就要排隊等著,如...