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