Chap-4 Section 4.4 C++相关问题

4.4 C++相关问题
C++的一些语言特性使之必须由编译器和链接器共同支持才能完成工作,最主要的又两个
方面,一个是C++的重复代码消除,另外一个是全局的构造和析构。另外由于C++语言的
各种特性,比如虚函数、函数重载、继承、异常机制等,使得背后的数据结构异常复杂,
这些数据结构往往在不同的编译器和链接器之间相互不能通用,使得C++程序的二进制兼容
性成了一个大问题。

4.4.1 重复代码消除
4.4.2 全局构造和析构
我们知道一般的C++/C程序是从main函数开始执行的,随着main函数的结束而结束。然而,
其实在main函数被调用之前,为了程序能够顺利执行,先要初始化进程的执行环境,比如
堆分配初始化、线程子系统等,关于main之前所执行的部分,将在以后介绍。C++的全局
构造函数也是在这一时期被执行的,我们知道C++的全局对象的构造函数在main之前被执行,
C++全局对象的析构函数在main之后被执行。
Linux下一般程序的入口是_start,这个函数是Linux系统库Glibc的一部分,当我们的程序
与Glibc库链接成一个可执行文件以后,这个函数就是程序的初始化部分的入口,程序的
初始化部分完成一系列初始化过程以后,会调用main函数来执行程序的主体,在main函数
执行完成以后,返回到初始化部分,进行一些清理工作,然后结束进程。对于一些特定的
操作必须在main函数之前被执行,还有一些操作必须在main函数之后被执行,其中具有代表性
的就是C++的全局对象的构造和析构函数,因此ELF文件还定义了两个特出的段:
1 .init 该段里面保存的是可执行指令,它构成了进程的初始化代码。因此,一个程序开始
运行时,在main函数被调用之前,Glibc的初始化部分安排执行这个段的代码。
2. .fini 该段保存这进程终止代码指令。因此,当一个程序的mina函数正常退出时,Glibc
会安排执行这个段中的代码。
我们可以用命令readelf -S test查看目标文件的段表,如图4.2.15:


***图4.2.15***
用readelf -s test查看目标文件的符号表,如图4.2.16:


***图4.2.16***

原文地址:https://www.cnblogs.com/miaoyong/p/3508086.html