C++前序——(2)目标文件

本文介绍了C++程序编译后的目标文件,特别是Linux下的ELF格式。内容涵盖目标文件结构,包括.text、.data、.bss等段的作用,以及如何通过ELF文件头和段表获取段信息。同时,文章讨论了数据段、bss段、代码段和符号表的内容,强调了强弱符号的概念和在链接过程中的作用。
摘要由CSDN通过智能技术生成

一、目标文件

我们知道,程序在经过预编译、编译以及汇编之后就得到了目标文件。而在window中,可执行程序的格式是PE,在Linux中是ELF。其实目标文件和可执行文件的格式几乎是一样的,广义上将两者都看作是ELF文件。在这里,我们主要讨论Linux下ELF格式的目标文件。实际上,在Linux中,不光目标文件和可执行文件是按照ELF文件格式存储的,还有动态链接库和静态链接库中的文件都是以ELF文件格式存储的,他们统称为ELF文件。

二、目标文件的结构

目标文件中除去机器指令代码和数据,还有链接时需要的符号表、调试信息等等。在目标文件中,这些信息都是以“段”的形式存储的(得益于COFF中关于“段”的机制,而ELF就是由COFF发展而来的文件格式)。

下图是目标文件中的结构:

(1)

首先将以下程序进行编译,得到main.o目标文件,我们随后对它进行分析。

#include <stdio.h>
#include <stdlib.h>

int gdata1 = 10;
int gdata2 = 0;
int gdata3;

static int gdata4 = 20;
static int gdata5 = 0;
static int gdata6;

int main()
{
        int ldata1 = 30;
        int ldata2 = 0;
        int ldata3;

        static int ldata4 = 40;
        static int ldata5 = 0;
        static int ldata6;

        exit(0);
}

我们先利用“objdump”来查看目标文件中的结构。

$  objdump  -h  main.o    ——>  查看该ELF文件中的关键段的基本信息

(2)

在上图中,我们看到了5个段的信息,主要的几个段就是.text、.data、.bss、.comment。其中,.text和.data都有“CONTENTS”标志,而.bss却没有,这表明

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值