从头开发一个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:                             ELF64
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            UNIX - System V
      ABI Version:                       0
      Type:                              REL (Relocatable file)
      Machine:                           Advanced Micro Devices X86-64
      Version:                           0x1
      Entry point address:               0x0
      Start of program headers:          0 (bytes into file)
      Start of section headers:          712 (bytes into file)
      Flags:                             0x0
      Size of this header:               64 (bytes)
      Size of program headers:           0 (bytes)
      Number of program headers:         0
      Size of section headers:           64 (bytes)
      Number of section headers:         13
      Section 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.c

hello.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
#include<stdio.h>

void main()
{
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
    printf("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,%eax
  10:   e8 00 00 00 00          callq  15 <main+0x15>
}
  15:   90                      nop
  16:   5d                      pop    %rbp
  17:   c3                      retq   

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

参考链接

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[StartingPoint][Tier2]Vaccine

Task 1 Besides SSH and HTTP, what other service is hosted on this box? (除了SSH和HTTP&#xff0c;这个盒子上还托管了什么其他服务) # nmap -sS -T4 10.129.230.43 --min-rate 1000 ftp Task 2 This service can be configured to allow login with any password fo…

SAP HCM get pernr无法查询到主数据

今天遇到一个比较奇怪的问题&#xff0c;就是ger pernr在2月的时候能找到员工主数据&#xff0c;但是在3月的时候无法找到员工主数据。首先SE36&#xff1a;逻辑数据库页面&#xff0c;看看标准逻辑数据库执行&#xff0c;是否能获取数据。 从上述标准的逻辑书而言&#xff0c;…

Linux操作系统的学习

Linux系统的目录结构 / 是所有目录的顶点目录结构像一颗倒挂的树 Linux常用命令 常见命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在&#xff0c;新…

深度学习每周学习总结P4(猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入部分2. 划分数据集3. 模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参数5. …

HTTP请求报文介绍

本章简要介绍渗透测试员在攻击Web应⽤程序时可能遇到的关键技术。 将分析HTTP协议、服务器和客⼾端常⽤的技术以及⽤于在各种情形下呈现数据的编码⽅案。 这些技术⼤都简单易懂&#xff0c;掌握其相关特性对于向Web应⽤程序发动有效攻击极其重要。 1.1 HTTP协议概述介绍 HTT…

【学习笔记】R语言入门与数据分析1

数据分析 数据分析的过程&#xff1a; 数据采集 数据存储 数据分析 数据挖掘 数据可视化 进行决策 数据挖掘 数据量大 复杂度高&#xff0c;容忍一定的误差限 追求相关性而非因果性 数据可视化 直观明了 R语言介绍 R是免费的&#xff08;开源软件、扩展性好&#xff09;…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

Socks5代理IP使用教程

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

220 基于matlab的考虑直齿轮热弹耦合的动力学分析

基于matlab的考虑直齿轮热弹耦合的动力学分析&#xff0c;输入主动轮、从动轮各类参数&#xff0c;考虑润滑油温度、润滑油粘度系数等参数&#xff0c;输出接触压力、接触点速度、摩擦系数、对流传热系数等结果。程序已调通&#xff0c;可直接运行。 220直齿轮热弹耦合 接触压力…

医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS

目录 ​移动手术工作站 主要解决的问题 主要硬件设备的对接 技术架构 手麻系统功能 手术进程 手术排班 手术记录 术前访视与评估 术中麻醉记录 麻醉总结 术后访视 模版配置 自动评分 文书模板 手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进…

三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab

先来了解几个概念&#xff1a; 1.1 节点向量&#xff1a; B-Spline需要定义曲线的节点向量U&#xff0c;它可以对应到Bezier曲线的参数u。 其元素个数 (m1) 和曲线阶数 k 、控制点个数n满足&#xff1a;m1k1n1 如果U的每段的距离是相等&#xff0c;那么这个B-Spline就被称为均…

亚马逊云的账单申诉

亚马逊云科技申诉通常涉及几个步骤&#xff0c;目的是解决账单错误或申请费用调整。以下是一个基本的指南&#xff0c;可以帮助你开始处理账单问题&#xff1a; 1. 审核账单 在开始申诉之前&#xff0c;首先登录到亚马逊云科技管理控制台。 导航到“账单仪表板”以查看当前的…

模型训练-保存训练数据

1.目的 找到一个可运行的代码&#xff0c;可以每个epoch打印训练数据&#xff0c;但是不会保存。因为在改进模型需要这些训练数据进行对比&#xff0c;所以需要将每个epoch的训练数据保存下来&#xff0c;写到一个文件中。 2.解决方案 直接问ChatGPT&#xff0c;提示词如下&…

AtCoder ABC248 A-D题解

比赛链接:ABC348 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int N;cin>>N;for(int i1;i<N;i){if(i%30)cout<<x<<endl;elsecout<<o<<endl;}return 0; } Problem B: 枚举即可。 #include <bit…

51蓝桥杯之DS18B20

DS18B20 基础知识 代码流程实现 将官方提供例程文件添加到工程中 添加onewire.c文件到keil4里面 一些代码补充知识 代码 #include "reg52.h" #include "onewire.h" #include "absacc.h" unsigned char num[10]{0xc0,0xf9,0xa4,0xb0,0x99,…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…

24/04/11总结

IO流(First edition): IO流&#xff1a;用于读入写出文件中的数据 流的方向&#xff08;输入指拿出来,输出指写进去) 输入流:读取 输出流:写出 操作文件类型 字节流:所有类型文件 字符流:纯文本 字节流: InputStream的子类:FileInputStream:操作本地文件的字节输入流 OutputSt…

工作流引擎常见API(以camunda为例)

在Camunda中&#xff0c;API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系&#xff1a; ProcessEngineServices 接口&#xff1a; RepositoryService&#xff1a; 负责管理流程定义和部署。RuntimeService&#xff1a; 负责管理流程实例的…

2023年通用人工智能AGI等级保护白皮书

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;2023年通用人工智能AGI等级保护白皮书》。 通用人工智能发展现状 本章主要介绍通用人工智能的基本情况&#xff0c;包括其发展历史、现状以及组成架构等内容。本文还将通过从技术角度出发来分…

PTA 应急救援站选址(floyd+打印路径)

大学城虎溪社区有很多居民小区&#xff0c;居民小区道路图是连通的。现要在该社区新建一个应急救援站&#xff0c;且该应急救援站要和某个小区建在一起。为了使应急救援最快速&#xff0c;经各部门商量决定&#xff1a;应急救援站建好后&#xff0c;离应急救援站最远的小区到应…