广元建设机械网站,wordpress百度网站地图,prestashop和wordpress,品牌建设的路径有哪些本篇文章的内容 一、GCC#xff08;GUN Compiler Collection#xff09;1.1 GCC的命令格式1.2 GCC的主要执行步骤1.3 GCC涉及的文件类型 二、ELF简介2.1 ELF文件格式图2.2 ELF文件处理的相关工具2.3 练习 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记GUN Compiler Collection1.1 GCC的命令格式1.2 GCC的主要执行步骤1.3 GCC涉及的文件类型 二、ELF简介2.1 ELF文件格式图2.2 ELF文件处理的相关工具2.3 练习 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记计划从RISC-V的底层汇编指令学起结合C语言在Ubuntu 20.04上开发一个简易的操作系统。一个目的是通过实践操作学习和了解什么是操作系统第二个目的是为之后学习RISC-V的集成电路设计打下一定基础。本系列持续不定期更新分享出来和大家一同交流进步。 博主是微电子科学与工程专业的学生对软件和操作系统难免有理解不到位的地方。如有谬误敬请不吝告知不胜感激。 参考课程及文章 【Bilibili】[完结] 循序渐进学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 一、GCCGUN Compiler Collection GCC是一个由GNU一个自由软件基金会组织开发的遵循GPL许可证发行的编译器套件是一个编译器的集合。支持 C、C、Objective-C、Fortran、Ada 和 Go 语言等多种语言前端已被移植到多种计算机体系架构上如 x86、ARM、RISC-V 等。在之后的课程中使用的也是GCC作为编译工具。GCC 的初衷是为 GNU 操作系统专门编写一款编译器现已被大多数 “Unix-like”操作系统如 Linux、BSD、MacOS 等采纳为标准的编译器。
1.1 GCC的命令格式
GCC 操作选项 文件名
常用操作选项含义-E只做预处理将包含的宏语言头文件转化为C语言文件-c只编译生成机器指令不链接与库文件相连生成目标文件.o-S生成汇编代码-o file将输出的文件生成到由file指定文件名的文件中-g在输出的文件中加入支持调试的信息-v显示输出详细的命令执行过程信息
1.2 GCC的主要执行步骤 编译 编译使用cc1程序这里针对 C 语言不同的语言有自己的编译器编译器完成 “预处理” 和 “编译”“预处理” 指处理源文件中以 “#” 开头的预处理指令譬如 #include、#define 等“编译” 则针对预处理的结果进行一系列的词法分析、语法分析、语义分析优化后生成汇编指令存放在 .o 为后缀的目标文件中。
汇编 汇编使用as程序汇编器将汇编语言代码转换为机器CPU可以执行的指令。
链接 链接使用ld程序链接器将汇编器生成的目标文件和一些标准库譬如 libc的.o文件组合形成最终可执行的应用程序。 1.3 GCC涉及的文件类型
.cC 源文件.cc/.cxx/.cppC 源文件.i经过预处理的 C 源文件.s/.S汇编语言源文件.S文件中还包含宏指令.s文件中是纯汇编指令.h头header文件.o目标object文件.a/.so编译后的静态库archive文件和共享库shared object文件a.out可执行文件常见于Unix系统
二、ELF简介 ELFExecutable Linkable Format是一种 Unix-like系统上的二进制文件格式标准。ELF文件格式对于底层的操作系统开发非常重要当程序需要在底层进行优化调试排错等操作时ELF文件可以更好地帮助程序员完成任务。ELF 标准中定义的采用 ELF 格式的文件分为以下4类
2.1 ELF文件格式图 ELF格式是在程序编译链接过程中生成的文件采用的通用格式。如果直接用文本编辑器或二进制编辑器打开该文件无法直接看出文件中包含的信息因为该文件是用二进制书写的。但是其中每一个字节都有其特定的含义这些字节的排布遵从ELF文件格式。ELF文件中最主要的部分包括ELF文件头ELF Header、程序头表Program Header Table和节头表Section Header Table。 ELF文件头ELF Header中包含了该文件的一些基本信息例如该文件运行在哪种体系架构上运行的版本号等。 ELF文件的主体部分是多个程序节Section。如上图所示.text中一般存放指令程序的具体操作.init中一般存放一些初始化操作.data中存放程序要操作的数据例如在程序中定义的全局变量等。 在程序加载到内存前一般都要对各个节进行对齐操作。例如当程序按4KB进行分节时如果.test节中的内容本身很少且不加任何操作它就会按4KB的大小独占一部分区域。为了节省内存空间我们对各个节的内容按属性进行归并例如.text和.init都存放了一些程序运行的指令所以我们可以对齐进行归并形成了程序段Segment。一个程序段可以由多个程序节构成。 ELF程序头表Program Header Table从运行角度描述了程序的内容它是程序运行视图的体现。程序头表中包含了该文件中哪几个节要归并成一个段每一个段占用的大小入口地址等信息。其中包含的信息只有在运行时才会用到。 ELF节头表Section Header Table中存放的该文件中包含的节的信息包括节的名称节的入口地址节的大小等。节头表从链接的角度描述了程序的内容它是程序链接视图的体现。其中的信息只有链接时才会用到。
2.2 ELF文件处理的相关工具 对程序员而言手动查看和调试ELF文件的过程是十分繁琐的GNU为程序员提供了相关的处理工具软件存放在Binutils工具包中。该工具包中的小程序如下
ar归档文件将多个文件打包成一个大文件。as被 gcc 调用输入汇编文件输出目标文件供链接器 ld 连接。ldGNU 链接器。被 gcc 调用它把目标文件和各种库文件结合在一起重定位数据并链接符号引用。objcopy执行文件格式转换。objdump显示 ELF 文件的信息。readelf显示更多 ELF 格式文件的信息包括DWARF 调试信息。…
2.3 练习 使用gcc编译代码并使用Binutlis工具对生成的目标文件和可执行文件ELF格式进行分析具体要求如下 编写一个简单的打印“Hello world”的程序源文件hello.c对源文件进行本地编译生成针对支持x86_64指令集架构处理器的目标文件hello.o查看hello.o的文件的ELF文件头信息查看hello.o的节头表对hello.o进行反汇编并查看hello.c的程序源码和机器指令的对应关系 首先在Vim编辑器中编写一个简单的hello.c程序 如果我们需要hello.o文件说明只需要编译不需要链接所以在终端中输入如下代码
$ gcc -c hello.c -o hello.o查看hello.o文件中ELF文件头信息-h就表示查看文件头header
$ readelf -h hello.o查看hello.o的节头表-SW表示显示节头表并展宽表示
$ readelf -SW hello.o要对文件进行反汇编首先要重新编译程序并使用gdb使其携带调试信息之后使用objdump对程序hello.o进行反汇编。可以看到每一条C语句对应的汇编指令可以利用该工具对程序进行调试和优化。
$ rm hello.o
$ gcc -g -c hello.c
$ objdump -S hello.o原创笔记码字不易欢迎点赞收藏~ 如有谬误敬请在评论区不吝告知感激不尽博主将持续更新有关嵌入式开发、机器学习方面的学习笔记。