第十三章 运行库实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

1    C语言库

基本功能及原则

(1)       具有自己的入口         mini_crt_entry
(2)       进程退出函数             exit
(3)       堆操作                           malloc
(4)       文件操作                       fopen  fread  fwrite  fclose  fseek
(5)       格式化字符串和输出操作  printf  sprint
(6)       注册函数                       atexit

 

入口函数

Void mini_crt_entry(void)
{
           1  获得argcargv;
           2  堆初始化;
           3  IO初始化;
           3.5 do_global_ctors();               //构造函数
           4  main(argc, argv);
           5  exit();
}

 

堆的实现

实现系统调用brk,在堆初始化是申请固定的空间,用链表形式管理。每个节点都有一个头。并实现mallocfree函数

 

IO与文件操作

各个文件操作都是对系统调用的简单封装

 

字符串相关操作

格式化字符串 printf

 

2    如何使用Mini CRT

$gcc  -c      -fno-builtin        -fnostdlib          -fno-stack-protector         \
           entry.c      malloc.c   stdio.c      string.c    printf.c
$ar    -rs    minicrt.a
           malloc.o   printf.o     stdio.o      string.o  (entry.o)

 

$gcc  -c      –ggdb       -fno-builtin        -fnostdlib          -fno-stack-protector         test.c
$ld     -static       -e      mini_crt_entry         entry.o     test.o       minicrt.a  -o      test

 

3    C++运行库

一般C++运行库都是依赖于C运行库的,它们仅仅包含C++的一些特性支持。
newdelete

支持利用C库的堆操作实现

 

C++全局构造与析构

构造函数主要实现的的是依靠特殊的段合并后形成构造函数数组,而析构函数则依赖atexit函数。
由于Linux的全局构造还需要crtbegincrtend两个部分,所以也需要crtbegin.cppcrtend.cpp两个文件。
析构部分则需要实现atexit函数,并在exit函数中实现析构。

 

streamstring

 

4    如何使用C++运行库