[编译链接装载系列]之聊聊目标文件与ELF格式

【嵌入式开发】ELF文件 在嵌入式ARM开发的世界中,您会频繁地接触到各种各样的文件。其中,(汇编源文件)、(C语言源文件)、(目标文件)、(静态库文件)和最终生成的二进制文件(通常没有特定后缀,或者如, )构成了整个软件开发流程的核心。而ELF(Executable and Linkable Format,可执行链接格式)正是贯穿这一切的标准、灵活、可扩展的二进制文件格式。想象一下,您的嵌入式系统是一个复杂的乐高积木王国。您有许多不同的小块(比如各种函数、数据),它们由不同的工程师(编译器)制作,存放在不同的盒子(源文件)里。 阅读详情

编译器编译源代码后生成的文件叫做目标文件,从结构上讲它是已经编译后的可执行文件格式,只是还没有经过链接,其中可能有些符号或有些地址还没有调整。它本身就是按照可执行文件格式存储的,跟真正的可执行文件在结构上稍有不同。

目标文件的格式:

现在 PC 平台流行的可执行文件格式主要是 Windows 下的 PE( Portable Executable,可移植可执行 ) 和 Linux 的 ELF( Executable and Linkable Format,可执行链接格式 ),它们都是 COFF (Common Object Fifle Format,一般目标文件格式 )格式的变种。从广义上看,目标文件和可执行文件的格式其实几乎是一样的,在 Linux 下,我们可以将他们统称为 ELF 文件;在 Windows 下可以统称为 PE-COFF 文件格式。

这里写图片描述

在 Linux 下使用 file 命令查看相应的文件格式:

这里写图片描述

目标文件是什么样的

目标文件是什么样的呢? 下面我们通过一个具体的例子来看一下。如不加说明,以下分析都是基于 32 位 x86 平台,如何在 64 位系统下编译 32 位可执行程序,需要安装 32 位版本的 glibc库,然后在编译时加上选项 “-m32”,如下所示:

这里写图片描述
这里写图片描述

源代码如下:

这里写图片描述

下面我们用 GCC 编译这个文件(只编译不链接),然后用 objdump 查看 ELF 文件的基本信息,如下:

这里写图片描述

我们可以看到目标文件是由很多的“节”(Section)组成的,有 .text节、.data节、.bss节、.rodata节、.comment—注释信息节和 .note.GNU-stack—堆栈提示节等。目标文件将所有信息按不同的属性以“节”(Section)的形式存储,有时候也叫“段”(Segment),很难在中文的翻译上加以区分,其实它们两个还是有区别的。

Section 和 Segment 的区别

在汇编源码中,通常用语法关键字 section 或 segment 来表示一段区域,在程序中“逻辑地”划分一段区域,这个区域就是节。此时所说的 section 和 segment 都是汇编语法中的关键字,它们在语法中都表示“节”,不是段,只是不同编译器的关键字不同而已。经过汇编生成目标文件之后,由这些 section 和 segment 修饰的程序区域便成为了“节”(section)。

但是操作系统加载程序时,不关心节的数量和大小,只关心节的属性,因为程序是要加载到内存中才能运行,而内存的访问会涉及到全局描述符表中段描述符的访问权限等属性,操作系统通过设置 GDT 全局描述符表来构建段描述符,在段描述符中指定段的位置、大小和属性。操作系统加载程序时不需要对逐个节进行加载,只要给出相同权限的节的集合就行了,比如把所有只读可执行的节归并到一块,所有可读可写的节归并到一块,这样操作系统就能为它们分配不同的段选择子,从而指向不同段描述符,实现不同的访问权限。

汇编器只生成了目标文件,尚未链接,因此将“节”合并的工作是由链接器来完成的,链接器将目标文件中属性相同的节合并成一个大的 section 集合,这个集合称为 segment,也就是段,就是平时说的可执行程序内存空间中的代码段和数据段。

总结下就是“节”出现于目标文件中,段诞生于可执行文件中,某个节(section)属于某个段(segment),段是由节组成的。给加载器用的也是段。为了不纠结到底应该用哪个,所以后面直接用英文来表示。

挖掘 SimpleSec

【ARM汇编语言基础】-ELF文件格式内部结构详解(一) 本文详细介绍了ELF文件格式的内部结构,从基础编译过程到高级语言低级语言的区别,再到交叉编译的原理。文章首先讲解了程序从源代码到机器指令的编译流程,重点阐述了C/C++等高级语言如何通过GCC编译器转换为可执行的ELF二进制文件。随后对比了高级语言和低级语言(如汇编)的特性和适用场景。最后探讨了交叉编译的概念,展示了如何在不同架构平台上生成目标二进制文件。全文为理解程序编译和逆向工程提供了基础性参考。 阅读详情

相关推荐

PE文件格式高清结构图

希望对你学习有帮助.. 含最新 windows 10 系统下的 pe 结构图..

Windows编译ELF的血泪史

在Win下GCC使用命令nasm -f elf -o foo.o foo.asm  一直报错:File not recognize 换了一个版本的GCC还是不行 最后用了工具ELFParser检查才发现 貌似Win下的GCC不支持生成ELF格式文件啊 求大牛指正

XboxMicro 2595

win环境下编译elf文件

winaaaa为什么要大于20字啊 不要啊

从C文件到可执行elf文件

摘要:本文主要为你解释一个C文件是如何被一步步处理成可执行的elf格式文件的。 本文来源: 从C文件ELF  说明:所有本文的用例是以下hello.c程序: #include int main(int argc, char *argv[]) { printf("hello world\n"); return 0; } 1.预处理

河西无名式 4944

Windows下的ELF文件解析代码C++

ELF(Executable and Linkable Format)是Unix及类Unix系统下可执行文件、共享库等二进制文件标准格式ELF文件结构: (1) ELF header (2) Program header table,对应于segments (3) Section header table,对应于sections (4) 被Program header table或S...

程序员の墨梅 6258

从C代码到elf文件(1)

从C代码到elf文件(2)–obj文件 工作加班太多实在没时间写,今天终于有一点空闲,继续吧。我们从《深入理解计算机系统》的第七章—链接 中的例子入手。进而对照编译生成的obj文件和C代码分析obj的关键点。 C程序例子 一共两个简单的C源文件,分别是swap.c和main.c。 swap.c: extern int buf[]; int *bufp0 = &buf[0]; i

pro_technician的专栏 1872

windows平台下用elf作为目标文件格式

windows平台下用elf作为目标文件格式                                  ------22:46 2008-10-8 ljhhh0123-    近来发现一个Tiny C Compiler,一个ANSI C编译器,支持linux和windows平台,短小精悍,支持部分GNUC扩展,包括嵌入AT&T汇编等,在偶然间发现它生成的目标文件格式竟是elf(Relo

Li Junhui的专栏 3958

可执行文件的组成及其作用:从零到一带你拆解执行文件

然而,了解可执行文件的组成,能帮助我们更好地理解程序的执行机制,也能帮助我们在遇到复杂问题时,精准定位问题的根源。无论你是刚入门的小白,还是已经摸爬滚打多年的老手,这篇文章都会帮助你深入了解可执行文件是怎么一回事,它到底是怎么从一堆源码文件到达我们手中的“程序”,以及它背后那些我们常常忽略的细节。当你运行一个程序时,操作系统会读取可执行文件,并根据程序头中的信息将文件的各个部分加载到内存中。文件头的作用可以理解为整个文件的“身份证”,它告诉操作系统:这个文件是一个可执行程序,应该如何加载它,如何进行执行。

探索技术、创意与生活的交汇点,分享个人成长与思考,带你发现生活中的美好与智慧 1505

objdump逆向工程实战:从目标文件到安全漏洞挖掘

本文通过实战案例,详细介绍了如何使用objdump工具进行逆向工程安全漏洞挖掘。从分析目标文件的符号表和反汇编代码入手,演示了如何定位不安全的函数调用(如strcpy)和评估程序攻击面,为安全研究员和开发者提供了一套高效的二进制文件分析方法。

weixin_29159127的博客 1067

Go逆向不再头疼:golang_loader_assist让IDA Pro秒懂Go二进制的终极指南

Go逆向一直是安全研究者CTF玩家的共同痛点:Go二进制文件结构特殊、函数名混乱、字符串散落各处,丢进IDA Pro里常常只剩一堆难以阅读的`sub_`和`off_`。而今天要介绍的 **golang_loader_assist**,正是一款专门解决"IDA Pro看不懂Go二进制"问题的开源**Go逆向辅助工具**。它由知名安全研究员Tim "diff" Strazzere(Red Naga团

gitblog_00207的博客 442

C/C++程序编译步骤详解

C/C++语言很多人都比较熟悉,这基本上是每位大学生必学的一门编程语言,通常还都是作为程序设计入门语言学的,并且课程大多安排在大一。刚上大学,孩子们还都很乖,学习也比较认真,用心。所以,C/C++语言掌握地也都不错,不用说编译程序,就是写个上几百行的程序都不在话下,但是他们真的知道C/C++程序编译的步骤么?我想很多人都不甚清楚,如果他接下来学过“编译原理”,也许能说个大概。VC的“舒适”开发环境

menuconfig的专栏 938

0.PE文件格式(Portable Executable File Format)

目录 可执行文件 识别PE文件 PE文件结构 PE文件的两种状态 PE(Portable Executable File Format)可移植的执行体文件格式. 可执行文件 可执行文件(executable file)指的是可以由操作系统进行加载执行的文件.在操作系统存储空间中浮动定位的二进制可执行程序.它可以加载到内存中,由操作系统加载并执行.特定的CPU指令集(如X86指令集)对应的不同平台之间的可执行程序不可直接移植运行. 可执行文件格式: Windows PE(Portable

kernelhack 4322

PE(Portable Executable) File Format(Chinese) - PE(可移植的可执行文件) 文件格式说明(中文)

PE文件结构(PE文件简介) [2008/3/27 15:56:00| By:perfecter]1、 PE文件简介PE(Portable Executable,可移植的可执行文件文件是指在Microsoft Windows95及其之后的Microsoft操作系统上运行的可执行文件,包括.EXE文件和.DLL文件。可移植性(Portable)是指在任何机器(Intel 386 、MI

纪飞的博客 5942

探密PE文件格式(Portable Executable File Format)(上)

开篇语:本文只是我学习PE过程中的一些学习笔记,没有什么技术含量。:) PE格式WINDOWS下最常用的可执行文件格式。本文将用win32汇编进行描述。------------------------------| IMAGE_DOS_HEADER | <-------DOS MZ 文件头------------------------------

wensir的老窝 3746

嵌入式系统那些事-文件视角下的arm elf解读

这篇文章笔者继续文件视角下的arm elf的解读,elf(Executable Linkable Format)是在linux下使用的一种可执行文件格式,我们的arm架构上通常都是部署的linux系统,因此elf文件也是跟arm架构强相关的一种文件格式。通过对其进行解读,可以帮助我们了解这样的一个文件是如何生成的,内部的结构是怎样的,如何在嵌入式的arm设备上加载运行起来,从而加深对整个系统运行机制的理解。

linus_ben的博客 1770

被隐藏了的过程——编译链接

        作为一名程序员,从闭着眼也能打出来的“hello world!”到完成一个大型程序,其中离不开对代码的调试改正。而我今天要给大家说的就是程序运行过程中,那些被系统软件的运行机制机理所掩盖的一些情况,这样我们在遇到错误的时候就能游刃有余,收放自如了。         在平常的应用程序开发过程中,我们很少需要关注编译链接的过程,因为通常都是在集成的开发环境下运行的,这样的开发环...

IT_Bonnie的博客 661

ELF文件详解

一、ELF概述 1、ELF的定义 ELF(Executable and Linkable Format)文件是一种目标文件格式,常见的ELF格式文件包括:可执行文件、可重定位文件(.o)、共享目标文件(.so)、核心转储文件等。 ELF主要用于Linux平台,Windows下是PE/COFF格式。 2、ELF文件的结构 一个完整的ELF文件一般会包括如下几个内容:ELF头、Section头、Segment头和Section。 其中由Section头组成的集合称为Section头表,...

PeakJin的博客 2万+

ELF文件格式简介

  简单了解下ELF文件格式。 1 简介   可执行链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行文件目标代码、共享库和核心转储(core dump)的标准文件格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。比如它支持不同的字节序和地址范围,所以它不会不兼容某一特别的 CPU 或指令架构。这也使得 ELF 格式能够被运行于众多不同平台的各种操作系统所广泛采纳。   E.

梦的灰色边沿... 1万+
上一篇: 内存寻址之分页机制
下一篇: [编译链接装载]之静态链接
Tanswer_
博客等级 码龄10年 231粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值