bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

實現(xiàn)簡略版C/C++RuntimeLibrary(MiniCRT)-創(chuàng)新互聯(lián)

實現(xiàn)簡略版 C/C++ Runtime Library(Mini CRT) 一、意義

為了熟悉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)

當(dāng)用戶要申請一塊內(nèi)存時,堆分配算法將遍歷整個鏈表,直到找到一塊足夠大的空閑塊,

如果這個空閑塊小于申請大小的兩倍,那么直接將這個空閑塊標(biāo)記為占用塊,然后將它的地址返回給用戶;

如果空閑塊大小大于所申請的大小這個空閑塊大于申請大小的兩倍),那么這個空閑塊將被分割成兩塊,

其中一塊大小為申請的大小,標(biāo)記為占用,另外一塊為空閑塊.

3 IO與文件操作 stdio.c

在傳統(tǒng)的C語言和UNIX里面,IO和文件是同一個概念,所有的IO都是通過對文件的操作來實現(xiàn)的。因此,只要實現(xiàn)了文件的基本操作(fopen、fread、fwrite、fclose和 fseek),即是完成了Mini CRT的IO部分

4 字符串相關(guān)操作 string.c

字符串相關(guān)的操作也是CRT的一部分,包括計算字符串長度、比較兩個字符串、整數(shù)與字符串之間的轉(zhuǎn)換等。由于這部分功能無須涉及任何與內(nèi)核交互,是純粹的用戶態(tài)的計算,所以它們的實現(xiàn)相對比較簡單。

5 格式化字符串 printf.c

printf是一個典型的變長參數(shù)函數(shù),即參數(shù)數(shù)量不確定

實現(xiàn)的相關(guān)內(nèi)容列舉如下:

  • printf實現(xiàn)僅支持%d%s,且不支持格式控制(比如%08d)。
  • 實現(xiàn)fprintfvfprintf,實際上printffprintf的特殊形式,即目標(biāo)文件為標(biāo)準(zhǔn)輸出的fprintf
  • 實現(xiàn)與文件字符串操作相關(guān)的幾個函數(shù),fputcfputs
MiniCRT 使用說明

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.hstdlib.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會把strlenstrcmp等這些常用函數(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)

成都seo排名網(wǎng)站優(yōu)化