第十三章 运行库实现<?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 获得argc和argv;
2 堆初始化;
3 IO初始化;
3.5 do_global_ctors(); //构造函数
4 main(argc, argv);
5 exit();
}
堆的实现
实现系统调用brk,在堆初始化是申请固定的空间,用链表形式管理。每个节点都有一个头。并实现malloc和free函数
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++的一些特性支持。
new与delete
支持利用C库的堆操作实现
C++全局构造与析构
构造函数主要实现的的是依靠特殊的段合并后形成构造函数数组,而析构函数则依赖atexit函数。
由于Linux的全局构造还需要crtbegin和crtend两个部分,所以也需要crtbegin.cpp和crtend.cpp两个文件。
析构部分则需要实现atexit函数,并在exit函数中实现析构。
stream和string
4 如何使用C++运行库
转载于:https://blog.51cto.com/lindo/386449