為了熟悉C/C++語言特性,了解底層知識,總結(jié)《程序員的自我修養(yǎng)–鏈接、裝載與庫》內(nèi)容
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、化德網(wǎng)站維護(hù)、網(wǎng)站推廣。二、參考資料《程序員的自我修養(yǎng)–鏈接、裝載與庫》
github git@github.com:youzhonghui/MiniCRT.git
【C++】【筆記】實現(xiàn)32位簡單版Windows和Linux雙平臺的C++運行庫
三、實現(xiàn) 目錄結(jié)構(gòu)通常我們會把CRT的各個函數(shù)的聲明放在不同的頭文件中,比如 IO相關(guān)的位于stdio.h
;字符串和堆相關(guān)的放在stdlib.h
中。為了簡單起見,將Mini CRT中所有函數(shù)的聲明都放在minicrt.h
中。
CRT支持Linux和Windows兩個平臺,功能包括
入口函數(shù)功能 entry.c
堆管理 malloc.c
基本IO stdio.c
字符串操作 string.c
打印顯示 printf.c
支持兩個平臺
#ifdef WIN32
//Windows 平臺demo
#else
//Linux 平臺demo
#endif
支持C和C++
#ifdef __cplusplus
extern "C" {#endif
………………………………
#ifdef __cplusplus
}
#endif
功能詳解
1 入口函數(shù)功能 entry.c
void mini_crt_entry(void)2 堆管理 malloc.c使用雙向鏈表管理堆空間
typedef struct _heap_header
{enum{ HEAP_BLOCK_FREE = 0XABABABAB,
HEAP_BLOCK_USED = 0XCDCDCDCD
}type;
unsigned long size;
struct _heap_header* next;
struct _heap_header* prev;
}heap_header;
void free(void* ptr)
當(dāng)用戶釋放某一塊空間時,堆分配算法會判別被釋放塊前后兩個塊是否為空閑塊,
如果是,則將它們合并成一個大的空閑塊。
void* malloc(unsigned long size)
3 IO與文件操作 stdio.c當(dāng)用戶要申請一塊內(nèi)存時,堆分配算法將遍歷整個鏈表,直到找到一塊足夠大的空閑塊,
如果這個空閑塊小于申請大小的兩倍,那么直接將這個空閑塊標(biāo)記為占用塊,然后將它的地址返回給用戶;
如果空閑塊大小大于所申請的大小這個空閑塊大于申請大小的兩倍),那么這個空閑塊將被分割成兩塊,
其中一塊大小為申請的大小,標(biāo)記為占用,另外一塊為空閑塊.
4 字符串相關(guān)操作 string.c在傳統(tǒng)的C語言和UNIX里面,IO和文件是同一個概念,所有的IO都是通過對文件的操作來實現(xiàn)的。因此,只要實現(xiàn)了文件的基本操作(
fopen、fread、fwrite、fclose和 fseek
),即是完成了Mini CRT的IO部分
5 格式化字符串 printf.c字符串相關(guān)的操作也是CRT的一部分,包括計算字符串長度、比較兩個字符串、整數(shù)與字符串之間的轉(zhuǎn)換等。由于這部分功能無須涉及任何與內(nèi)核交互,是純粹的用戶態(tài)的計算,所以它們的實現(xiàn)相對比較簡單。
MiniCRT 使用說明
printf
是一個典型的變長參數(shù)函數(shù),即參數(shù)數(shù)量不確定實現(xiàn)的相關(guān)內(nèi)容列舉如下:
printf
實現(xiàn)僅支持%d
、%s
,且不支持格式控制(比如%08d
)。- 實現(xiàn)
fprintf
和vfprintf
,實際上printf
是fprintf
的特殊形式,即目標(biāo)文件為標(biāo)準(zhǔn)輸出的fprintf
。- 實現(xiàn)與文件字符串操作相關(guān)的幾個函數(shù),
fputc
和fputs
。
Mini CRT將以庫文件和頭文件的形式提供給用戶。我們建立的minicrt.h
的頭文件,包含了所有相關(guān)的常數(shù)定義、宏定義,以及Mini CRT所實現(xiàn)的函數(shù)聲明等。當(dāng)用戶程序使用Mini CRT 時,僅需要#include "minicrt.h"
即可,而無須像標(biāo)準(zhǔn)的CRT一樣,需要獨立的包含相關(guān)文件,比如stdio.h
、stdlib.h
等。
1 用戶程序中引用頭文件 #include “minicrt.h”
2 將MiniCRT程序編譯成庫文件,由于動態(tài)庫的實現(xiàn)比靜態(tài)庫要復(fù)雜,所以MiniCRT僅僅以靜態(tài)庫的形式提供給最終用戶。
在Linux中 使用命令
gcc -c -fno-builtin -nostdlib -fno-stack-protector -m64 entry.c malloc.c stdio.c string.c printf.c ar -rs minicrt.a malloc.o printf.o stdio.o string.o
-fno-builtin
參數(shù)是指關(guān)閉GCC的內(nèi)置函數(shù)功能,默認(rèn)情況下GCC會把strlen
、strcmp
等這些常用函數(shù)展開成它內(nèi)部的實現(xiàn)。-nostdlib
表示不使用任何來自glibc、GCC的庫文件和啟動文件,它包含了-nostartfiles
這個參數(shù)。-fno-stack-protector
是指關(guān)閉堆棧保護(hù)功能,最近版本的GCC會在vfprintf
這樣的變長參數(shù)函數(shù)中插入堆棧保護(hù)函數(shù),如果不關(guān)閉,我們在使用Mini CRT時會發(fā)生“stack chk fail”函數(shù)未定義的錯誤。3 將用戶程序預(yù)處理、編譯、匯編成二進(jìn)制文件
在Linux中 使用命令
gcc -c -ggdb -fno-builtin -nostdlib -fno-stack-protector -m64 test.c
4 二進(jìn)制文件鏈接靜態(tài)庫,生成可執(zhí)行文件
ld -static -m elf_x86_64 -e mini_crt_entry entry.o test.o minicrt.a -o test
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:實現(xiàn)簡略版C/C++RuntimeLibrary(MiniCRT)-創(chuàng)新互聯(lián)
文章起源:http://vcdvsql.cn/article16/csihdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站建設(shè)、微信小程序、網(wǎng)站排名、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容