zoukankan      html  css  js  c++  java
  • 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***

  • 相关阅读:
    Linux操作系统原理
    html标签简介(常用)
    Git常用命名
    Nuxt.js vue服务端渲染
    Sequelize 和 MySQL 对照Sequelize 和 MySQL 对照
    VScode 自定义用户代码块
    python对一个文本的解析
    API管理工具
    Flutter教程- Dart语言规范-知识点整理
    RESTful API
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3508086.html
Copyright © 2011-2022 走看看