链接脚本在编程中的高级运用之二——运行时库和C++特性支持

本文深入探讨链接脚本在运行时库的应用,特别是如何支持C++对象的构造和析构函数。通过分析X86架构下Ubuntu64的Glibc运行时库,揭示了程序开始前后的关键步骤,如构造函数的执行、运行时库的角色。同时,讨论了__attribute__((constructor))和__attribute__((destructor))在构造析构过程中的作用,以及默认链接脚本如何确保构造函数先于main执行,析构函数后于main执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在链接脚本在编程中的高级运用之一可变长数组中已经讲述了编译链接的原理,并且以uboot命令为例详细介绍链接脚本如何实现可变长数组。本章在前者的基础上继续讲述链接脚本在运行时库中的高级应用技巧,以及编译器如何支持类对象的构造和析构函数。本章的应用原则上类似于可变长数组,但本章更加侧重讲述运行时库的实现原理,其不仅通过链接脚本的section来实现可变长数组去支持任意多类对象的构造函数和析构函数,而且还支持特定函数体的“可变长”。

一、运行时库和类对象的构造、析构函数

很多程序员以为程序的开始就是main,事实上main只是程序的中间的一部分,在main之前和之后都要完成很多工作。其中就包括以下几个主要的部分:

  1. 类对象的构造函数需要在main函数执行前完成,而类对象的析构函数需要在main函数执行后完成。

  2. 我们都知道现代操作系统都有多进程多线程的概念,而main函数怎么没看到相关的数据结构呢?这些都是运行时库的工作。

  3. 程序里面可以直接printf将数据输出到0对应的显示控制台,这个设备文件怎么初始化的,是不是应该先初始化和先打开才能用的。

运行时库才是程序的真正开始和真正结束的地方。本章重点链接脚本如何支持类对象的构造和析构函数。其他特性内容分析留待以后再做讲解。

以下是基于X86架构的ubuntu64平台对Glibc的运行时库进行分析。

二、程序演示例程

1.程序


2.运行结果


给某函数添加__attribute__((constructor))属性,编译器会将该函数名指针添加到名为.ctorssection, 添加__attribute__((destructor))属性,则会将函数名指针添加到.dtors。即是将函数名地址添加到.ctors.dtors指示的可变长数组。记住,只是函数名地址,而不是函数体。

另外,classTest()是类classTest的同名函数,是构造函数,编译器也会将该函数地址填入到.ctors,即编译器判定某个函数为类的构造函数后,自动给该函数添加__attribute__((constructor))属性;同理,对析构函数~classTest()添加__attribute__((destructor))属性,将该函数地址加入.dtors。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值