实现简略版 C/C++ Runtime Library(Mini CRT)

实现简略版 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会把strlenstrcmp等这些常用函数展开成它内部的实现。
  • -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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Runtime Library是一套用于支持C++程序运行的库文件。在C++编程中,我们经常使用的一些函数,比如输入输出函数、字符串处理函数等,都属于C++ Runtime Library的一部分。这些库文件包含了标准的C++函数和类,可以提供给我们在程序中使用。在Visual Studio中,我们可以通过选择C/C++运行库来指定使用哪个本的C++ Runtime Library。\[1\]\[2\] 当在使用某个软件时出现Microsoft Visual C++ Runtime Library Runtime Error错误,通常是由于软件与C++ Runtime Library之间的冲突导致的。这种错误可能以多种方式出现,比如程序崩溃、自动关闭等。解决这个问题的方法通常是联系软件的支持团队,以获取更多的信息和解决方案。\[3\] #### 引用[.reference_title] - *1* [选择正确的C/C++ runtime library](https://blog.csdn.net/weixin_30731287/article/details/98864516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [CRT(C Runtime Library)—— C/C++运行时库](https://blog.csdn.net/lanchunhui/article/details/52566263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Microsoft Visual C++ Runtime Library Runtime Error的解决办法](https://blog.csdn.net/m0_54409538/article/details/124420440)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值