制作一个RISC-V的操作系统三-编译与链接

文章目录

  • GCC
    • GCC简介
    • GCC的命令格式
    • gcc -E
    • gcc -c
    • gcc -S
    • gcc -g
    • gcc -v
    • GCC的主要执行步骤
    • GCC涉及的文件类型
    • 针对多个源文件的处理
  • ELF
    • ELF介绍
    • ELF文件格式
    • ELF文件处理相关工具:Binutils(binary utility)
      • readlelf -h
      • readelf -S或readelf -SW(加W显示变宽)
      • objdump -S

GCC

GCC简介

制作一个RISC-V的操作系统三-编译与链接_第1张图片

GCC的命令格式

预处理: 把#define #include 这些#开头的宏语言转为标准的C语言
编译:C语言变成机器指令
链接:把编译后的指令文件与其他库链接到一块
调试需要加入调试信息

建议实战一下,观察区别
制作一个RISC-V的操作系统三-编译与链接_第2张图片
如该程序
在这里插入图片描述

gcc -E

当预处理该文件时并且将输出结果输出到E文件
在这里插入图片描述
打开E文件
制作一个RISC-V的操作系统三-编译与链接_第3张图片
可以看到代码非常多,但最后的main函数没有变化。上面的代码就是#include转换为C语言的结果

gcc -c

生成的可执行文件,但还没有链接
在这里插入图片描述
在这里插入图片描述

gcc -S

在这里插入图片描述
打开S文件查看,为汇编语言
制作一个RISC-V的操作系统三-编译与链接_第4张图片

gcc -g

制作一个RISC-V的操作系统三-编译与链接_第5张图片

gcc -v

可以看到一大串相关信息
制作一个RISC-V的操作系统三-编译与链接_第6张图片

GCC的主要执行步骤

Linux mv(英文全拼:move file)命令用来为文件或目录改名、或将文件或目录移入其它位置。

制作一个RISC-V的操作系统三-编译与链接_第7张图片
制作一个RISC-V的操作系统三-编译与链接_第8张图片

cc1:预处理和编译
在这里插入图片描述
as:生成O文件 机器指令

在这里插入图片描述
collect中有ld 链接
将各种标准库和O文件链接在一起
制作一个RISC-V的操作系统三-编译与链接_第9张图片

GCC涉及的文件类型

小写s:不包含#开头的代码
大写S:还包含#开头的代码
可执行文件默认为a.out
制作一个RISC-V的操作系统三-编译与链接_第10张图片

针对多个源文件的处理

制作一个RISC-V的操作系统三-编译与链接_第11张图片

ELF

ELF介绍

可重定位文件:链接才能把位置定下来
核心转储文件:程序崩溃时相关信息
制作一个RISC-V的操作系统三-编译与链接_第12张图片

ELF文件格式

二进制
ELF Header: ELF文件的基本信息 (如运行在哪种体系架构 版本号)
.text: 程序的指令
.init:程序初始化的指令
4K字节对齐
Programe Header Table:运行时用到,将哪些节放到一起合成段,段放哪里
Section Header Table:节的一些信息,定位之类的
制作一个RISC-V的操作系统三-编译与链接_第13张图片

ELF文件处理相关工具:Binutils(binary utility)

ar=tar:生成静态库要用到

制作一个RISC-V的操作系统三-编译与链接_第14张图片

readlelf -h

查看文件头 ELF-header
制作一个RISC-V的操作系统三-编译与链接_第15张图片

  • Magic:魔术 没啥大用,就是给ELF做一个特殊的标志,和别的东西区分开来

  • Class:文件类型 64位还是32位

readelf -S或readelf -SW(加W显示变宽)

查看Section Header Table
PROGBITS:可执行执行的意思
RELA:可重定位的
制作一个RISC-V的操作系统三-编译与链接_第16张图片

objdump -S

-S是将汇编显示源代码部分

此时反汇编结果中没有源码部分显示
制作一个RISC-V的操作系统三-编译与链接_第17张图片
当编译时加上-g后 (生成调试信息)再反汇编发现源码和汇编指令
制作一个RISC-V的操作系统三-编译与链接_第18张图片

你可能感兴趣的:(从零自制操作系统,risc-v,linux,运维)