当前位置: 首页 > news >正文

制作一个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简介

在这里插入图片描述

GCC的命令格式

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

建议实战一下,观察区别
在这里插入图片描述
如该程序
在这里插入图片描述

gcc -E

当预处理该文件时并且将输出结果输出到E文件
在这里插入图片描述
打开E文件
在这里插入图片描述
可以看到代码非常多,但最后的main函数没有变化。上面的代码就是#include<stdio.h>转换为C语言的结果

gcc -c

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

gcc -S

在这里插入图片描述
打开S文件查看,为汇编语言
在这里插入图片描述

gcc -g

在这里插入图片描述

gcc -v

可以看到一大串相关信息
在这里插入图片描述

GCC的主要执行步骤

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
collect中有ld 链接
将各种标准库和O文件链接在一起
在这里插入图片描述

GCC涉及的文件类型

小写s:不包含#开头的代码
大写S:还包含#开头的代码
可执行文件默认为a.out
在这里插入图片描述

针对多个源文件的处理

在这里插入图片描述

ELF

ELF介绍

可重定位文件:链接才能把位置定下来
核心转储文件:程序崩溃时相关信息
在这里插入图片描述

ELF文件格式

二进制
ELF Header: ELF文件的基本信息 (如运行在哪种体系架构 版本号)
.text: 程序的指令
.init:程序初始化的指令
4K字节对齐
Programe Header Table:运行时用到,将哪些节放到一起合成段,段放哪里
Section Header Table:节的一些信息,定位之类的
在这里插入图片描述

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

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

在这里插入图片描述

readlelf -h

查看文件头 ELF-header
在这里插入图片描述

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

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

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

查看Section Header Table
PROGBITS:可执行执行的意思
RELA:可重定位的
在这里插入图片描述

objdump -S

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

此时反汇编结果中没有源码部分显示
在这里插入图片描述
当编译时加上-g后 (生成调试信息)再反汇编发现源码和汇编指令
在这里插入图片描述

相关文章:

  • 后端部署-阿里云服务器-开设端口-域名解析-安全证书-备案
  • C#,数值计算——计算实对称矩阵所有特征值和特征向量的雅可比(Jacobi)方法与源程序
  • 源码安装git
  • 【BUG】SpringBoot项目Long类型数据返回前端精度丢失问题
  • Android Studio Giraffe版本遇到的问题
  • Backend - Django makemigrations
  • es常用查询编辑
  • SpringBoot集成i18n(多语言)
  • 精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的
  • java使用xstream框架生成xml文件
  • 5.【自动驾驶与机器人中的SLAM技术】2D点云的scan matching算法 和 检测退化场景的思路
  • Unity中Shader编译目标渲染器
  • Java转Go学习之旅 | Go入门(2)
  • Java零基础-if条件语句
  • 雷军:我的程序人生路
  • [译] React v16.8: 含有Hooks的版本
  • eclipse(luna)创建web工程
  • export和import的用法总结
  • gitlab-ci配置详解(一)
  • golang中接口赋值与方法集
  • JavaScript实现分页效果
  • java第三方包学习之lombok
  • js递归,无限分级树形折叠菜单
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • oldjun 检测网站的经验
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Solarized Scheme
  • vuex 学习笔记 01
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 电商搜索引擎的架构设计和性能优化
  • 好的网址,关于.net 4.0 ,vs 2010
  • 如何解决微信端直接跳WAP端
  • 如何设计一个比特币钱包服务
  • 入门到放弃node系列之Hello Word篇
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 新手搭建网站的主要流程
  • PostgreSQL之连接数修改
  • 函数计算新功能-----支持C#函数
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 数论-逆元
  • $(selector).each()和$.each()的区别
  • (二)springcloud实战之config配置中心
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (简单) HDU 2612 Find a way,BFS。
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) RFS+AutoItLibrary测试web对话框
  • ./configure、make、make install 命令
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args