99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

實現簡略版C/C++RuntimeLibrary(MiniCRT)-創新互聯

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

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

在這里插入圖片描述

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)

當用戶釋放某一塊空間時,堆分配算法會判別被釋放塊前后兩個塊是否為空閑塊,

如果是,則將它們合并成一個大的空閑塊。

void* malloc(unsigned long size)

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

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

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

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

3 IO與文件操作 stdio.c

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

4 字符串相關操作 string.c

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

5 格式化字符串 printf.c

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

實現的相關內容列舉如下:

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

Mini CRT將以庫文件和頭文件的形式提供給用戶。我們建立的minicrt.h的頭文件,包含了所有相關的常數定義、宏定義,以及Mini CRT所實現的函數聲明等。當用戶程序使用Mini CRT 時,僅需要#include "minicrt.h"即可,而無須像標準的CRT一樣,需要獨立的包含相關文件,比如stdio.hstdlib.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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化