从头开发一个RISC-V的操作系统(三)编译与链接

文章目录

  • 前提
  • GCC
    • GCC简介
    • GCC的主要执行步骤
    • GCC涉及的文件类型
  • ELF
    • ELF简介
    • ELF文件格式
    • ELF文件处理工具:Binutils
  • 练习
  • 参考链接

目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。

前提

这个系列的大部分文章和知识来自于:[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春,以及相关的github地址。

在这个过程中,这个系列相当于是我的学习笔记,做个记录。

GCC

GCC简介

我们在Linux下经常使用的GCC是由GNU开发的编译器套件。GCC的初衷是为GNU操作系统专门编写一款编译器,现在已经被大多数“Unix-like”操作系统采纳为标准的编译器。
现在来说,另一个常见的编译器套件还有LLVM,它是由苹果公司开发的。

GCC的主要执行步骤

一个.c程序到一个可执行文件主要包括这么几步:源程序->预处理->编译->汇编->链接。预处理有一些宏替换,注释取消等操作;编译则针对预处理的结果进行词法分析,语法分析,语义分析,优化后生成汇编指令;编译则是编译器将汇编语言代码转为CPU可执行的指令;链接是将汇编器生成的目标文件和一些标准库文件组合,生成最终的可执行程序。

GCC涉及的文件类型

  • .c:C源文件
  • .cc/.cpp:C++源文件
  • .i:经过预处理的C源文件
  • .s/.S:汇编语言源文件
  • .o:目标文件
  • .a/.so:编译后的静态文件和共享库(shared object)文件
  • .out:可执行文件

ELF

ELF简介

ELF(Executable Linkable Format)是一种Unix-like系统上的二进制文件格式标准。
ELF标准中定义的采用ELF格式的文件分为4类:
在这里插入图片描述
这里可以看下第四个是核心转储文件,如果你程序崩溃过,那你估计可能对这个文件有所了解。默认情况下程序崩溃时的dump文件是不会存储的,挺有意思。

ELF文件格式

ELF文件格式分为两种:运行视图(Execution View)和链接视图(Linking View)。
在这里插入图片描述
在这里插入图片描述

  • ELF Header: 描述文件的主要特性:类型,CPU架构,入口地址,现有部分的大小和偏移等等。
  • Program Header Table: 列举了所有有效的段(segments)和他们的属性。 程序头表需要加载器将文件中的节加载到虚拟内存段中(Execution View);
  • Section: 按照类型划分不同的节(Linking View)。
  • Section Header Table: 包含对每个节(sections)的具体描述。

ELF文件处理工具:Binutils

关于Binutils工具的具体知识自行百度即可。
这里阐述几个可能会使用的命令。

  • as:被gcc调用,输入汇编文件,输出目标文件。因此我们使用gcc来编译c程序生成可执行文件过程中汇编那一个步骤其实是调用了这个工具。
  • ld:GNU链接器,被gcc调用。
  • objcopy:执行文件格式转换。
  • objdump:显示ELF文件的信息。
  • readelf:显示更多ELF格式文件的信息

练习

  1. 编写一个简单的打印 “hello world!” 的程序源文件:hello.c

    #include<stdio.h>void main()
    {printf("hello world!");
    }
  2. 对源文件进行本地编译,生成针对支持 x86_64 指令集架构处理器的目标文件 hello.o。

    生成目标文件.o我们要使用-c参数

    $gcc - c hello.c -o hello.o
    
  3. 查看 hello.o 的文件的文件头信息。
    使用readelf查看hello.o文件,加上-h参数查看头信息。

    $readelf -h hello.o
    ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              REL (Relocatable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x0Start of program headers:          0 (bytes into file)Start of section headers:          712 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           0 (bytes)Number of program headers:         0Size of section headers:           64 (bytes)Number of section headers:         13Section header string table index: 12
    
  4. 查看 hello.o 的 Section header table。

    $readelf -S hell.o
    There are 13 section headers, starting at offset 0x2c8:Section Headers:[Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0[ 1] .text             PROGBITS        0000000000000000 000040 000018 00  AX  0   0  1[ 2] .rela.text        RELA            0000000000000000 000218 000030 18   I 10   1  8[ 3] .data             PROGBITS        0000000000000000 000058 000000 00  WA  0   0  1[ 4] .bss              NOBITS          0000000000000000 000058 000000 00  WA  0   0  1[ 5] .rodata           PROGBITS        0000000000000000 000058 00000d 00   A  0   0  1[ 6] .comment          PROGBITS        0000000000000000 000065 00002a 01  MS  0   0  1[ 7] .note.GNU-stack   PROGBITS        0000000000000000 00008f 000000 00      0   0  1[ 8] .eh_frame         PROGBITS        0000000000000000 000090 000038 00   A  0   0  8[ 9] .rela.eh_frame    RELA            0000000000000000 000248 000018 18   I 10   8  8[10] .symtab           SYMTAB          0000000000000000 0000c8 000120 18     11   9  8[11] .strtab           STRTAB          0000000000000000 0001e8 00002b 00      0   0  1[12] .shstrtab         STRTAB          0000000000000000 000260 000061 00      0   0  1
    Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),l (large), p (processor specific)
    
  5. 对 hello.o 反汇编,并查看 hello.c 的 C 程序源码和机器指令的对应关系。

$gcc -c -g hello.c -o hello.o
$objdump -S hello.chello.o:     file format elf64-x86-64Disassembly of section .text:0000000000000000 <main>:
#include<stdio.h>void main()
{0:   55                      push   %rbp1:   48 89 e5                mov    %rsp,%rbpprintf("hello world!");4:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # b <main+0xb>b:   b8 00 00 00 00          mov    $0x0,%eax10:   e8 00 00 00 00          callq  15 <main+0x15>
}15:   90                      nop16:   5d                      pop    %rbp17:   c3                      retq   

-g是为了添加调试信息,-S是为了反汇编的同时显示源码。

参考链接

  1. https://xinqiu.gitbooks.io/linux-inside-zh/content/Theory/linux-theory-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/593740.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开一家视频号小店需要多少费用?费用详细解读,不让你多花一分钱

大家好&#xff0c;我是电商花花。 今天来给大家聊聊视频号小店开店需要多少费用的问题&#xff0c;很多人都知道现在做视频号小店是红利&#xff0c;能赚钱&#xff0c;但是却不知道视频号小店也能做无货源电商模式。 接下来&#xff0c;我来给大家讲一下开一家视频号小店都…

Redis Stack 安装部署

参考&#xff1a;Run Redis Stack on Docker | Redis Redis-stack 初体验_redis stack-CSDN博客 【docker】运行redis_docker run redis-stack-server requirepass-CSDN博客 Redis Stack 是一组软件套件&#xff0c;它主要由三部分组成。 一个是 Redis Stack Server&#x…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

计算机视觉的应用26-关于Fast-R-CNN模型的应用场景,Fast-R-CNN模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用26-关于Fast-R-CNN模型的应用场景&#xff0c;Fast-R-CNN模型结构介绍。Fast R-CNN是一种深度学习模型&#xff0c;主要用于目标检测任务&#xff0c;尤其适用于图像中物体的识别与定位。该模型在基…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级&#xff1a;核心简洁&#xff0c;只提供了基本的功能&#xff0c;其他高级功能可以通过插件或扩展来添加。 b. 灵活性&#xff1a;允许开发者选择适合自己项目的组件和工具&#xff0c;没有强制的项目结构和设计模式。 c. 易于扩展&#xff1a;提…

Revit模型进入虚幻引擎UE5教程

一、背景 小伙伴们是否有Revit进入虚幻引擎交互的需求呢&#xff1f; 二、实现功能 1.Revit进入虚幻UE5,包含模型属性&#xff0c;材质等 2.实现BIM构件点选&#xff0c;高亮&#xff0c;属性展示 3.实现BIM模型分层显示&#xff0c;爆炸等效果 三、教程地址 教程&#x…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

HTML基础知识详解(上)(如何想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习前端基础时&#xff0c;必不可少的就是三大件&#xff08;html、css、javascript &#xff09;&#xff0c;而HTML&#xff08;超文本标记语言——HyperText Markup Language&#xff09;是构成 Web 世界的一砖一瓦&#xff0c;它定义了网页内容的含义和…

海外媒体发稿:旅游业媒体推广15种令人惊叹的效果-华媒舍

旅游业的媒体推广效果变得越来越重要。本文将介绍15种令人惊叹的旅游业媒体推广效果&#xff0c;并揭示背后的市场规律。让我们一起来了解吧&#xff01; 1. 线上旅游平台 线上旅游平台&#xff0c;如Booking、TripAdvisor等&#xff0c;提供了便捷的旅游信息搜索和预订服务。…

02-JDK新特性-函数式接口

函数式接口 什么是函数式接口 函数式接口(Functional Interface)就是有且仅有一个抽象方法&#xff0c;但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 Lambda 表达式。 我们可以在一个接口上使用 FunctionalInterface 注解&#xff0c;这样做可以检查它是否是…

51单片机入门_江协科技_21.2_74HC595 在Proteus中模拟8x8点阵屏环境搭建

1. 为了在proteus中模拟学习江协科技51单片机教程&#xff0c;需要在proteus中搭建74HC595驱动8x8点阵屏的仿真环境&#xff1b; 1.1. 因为连接单片机P0口作为点阵屏负极&#xff08;行选&#xff09;&#xff0c;所以需要先在P0口上接上上拉电阻RESPACK 8&#xff0c;1k欧姆阻…

单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分

单细胞RNA测序&#xff08;scRNA-seq&#xff09;入门可查看以下文章&#xff1a; 单细胞RNA测序&#xff08;scRNA-seq&#xff09;工作流程入门 单细胞RNA测序&#xff08;scRNA-seq&#xff09;细胞分离与扩增 1. NCBI查询scRNA-seq SRA数据 NCBI地址&#xff1a; https…