制作一个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
  • 练习 3-1
  • 练习 3-2

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后 (生成调试信息)再反汇编发现源码和汇编指令
在这里插入图片描述

练习 3-1

  • 使⽤ gcc 编译代码并使⽤ binutils ⼯具对⽣成的⽬标文件和可执⾏文件(ELF 格式)进⾏分析。具体要求如下:
  • 编写⼀个简单的打印 “hello world!” 的程序源文件:hello.c
    对源文件进⾏本地编译,⽣成针对⽀持 x86_64 指令集架构处理器的⽬标文件 hello.o。
  • 查看 hello.o 的文件的文件头信息。
  • 查看 hello.o 的 Section header table。
  • 对 hello.o 反汇编,并查看 hello.c 的 C 程序源码和机器指令的对应关系。

练习 3-2

如下例⼦ C 语⾔代码

#include <stdio.h>
int global_init = 0x11111111;
const int global_const = 0x22222222;
void main()
{
static int static_var = 0x33333333;
static int static_var_uninit;
int auto_var = 0x44444444;
printf("hello world!\n");
return;
}
  • 请问编译为可执行文件后,global_init, global_const, static_var, static_var_uninit, auto_var 这些变量分别存放在那些 section ⾥
  • “hello world!\n” 这个字符串⼜在哪⾥?并尝试⽤⼯具查看并验证你的猜想
    在这里插入图片描述
    在这里插入图片描述
    auto_var变量 和"hello world!\n" 这个字符串在栈中,需要程序运行时才会有
    可以根据地址来判断从属于哪个节
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

便宜SSL证书

首先&#xff0c;我们需要了解什么是SSL证书。简单来说&#xff0c;SSL证书是一种用于加密网站数据传输的安全协议&#xff0c;它可以确保用户在访问网站时&#xff0c;数据能够安全地从服务器传输到用户的浏览器。没有SSL证书的网站&#xff0c;用户在访问时可能会遇到不安全的…

crmeb本地开发配置代理

crmeb 是一个开源的商城系统&#xff0c; v5 版本是一个前后端分离的项目&#xff0c; 我们从git仓库中下载下来的是一个文件夹&#xff0c;其结构是这样的 我的系统没有使用docker &#xff0c;使用的是 laragon 的系统 所以首先我们要在 nginx 中配置 之后&#xff0c; 我们…

十五届蓝桥杯分享会(一)

注&#xff1a;省赛4月&#xff0c;决赛6月 一、蓝桥杯整体介绍 1.十四届蓝桥杯软件电子赛参赛人数&#xff1a;C 8w&#xff0c;java/python 2w&#xff0c;web 4k&#xff0c;单片机 1.8w&#xff0c;嵌入式/EDA5k&#xff0c;物联网 300 1.1设计类参赛人数&#xff1a;平…

Emacs之dired模式重新绑定键值v(一百三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Python函数默认参数设置

在某些情况下&#xff0c;程序需要在定义函数时为一个或多个形参指定默认值&#xff0c;这样在调用函数时就可以省略为该形参传入参数值&#xff0c;而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下&#xff1a; 形参名 默认值 从上面的语法格式可以看出&…

什么是网站?

这篇文章是我学习网站开发&#xff0c;阶段性总结出来的。可以帮助你 通俗易懂 地更加深刻理解网站的这个玩意。 一&#xff0c;网站和网页的区别&#xff1f; 网站是由一个个网页组成。我们在浏览器上面看到的每一个页面就是网页&#xff0c;这些 相关的 网页组成一个网站。…

shell命令学习(1)——(待完善)

explainshell.com shell统计当前文件夹下的文件个数、目录个数Linux之shell常用命令&#xff08;三&#xff09; sort&#xff08;排序&#xff09;、uniq&#xff08;处理重复字符&#xff09; linux中shell将换行输入到文件中 shell脚本&#xff0c;将多行内容写入文件中 f…

[idea]idea连接clickhouse23.6.2.18

一、安装驱动 直接在pom.xml加上那个lz4也是必要的不然会报错 <dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.4.2</version></dependency><dependency><group…

数据链路层之VLAN基本概念和基本原理

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Numpy数组的数据类型汇总 (第4讲)

Numpy数组的数据类型 &#xff08;第4讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

python:傅里叶分析,傅里叶变换 FFT

使用python进行傅里叶分析&#xff0c;傅里叶变换 FFT 的一些关键概念的引入&#xff1a; 1.1.离散傅里叶变换&#xff08;DFT&#xff09; 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&…

无头浏览器与Selenium:探索无界爬虫的奇妙世界

selenium设置无头浏览器 背景 ​ 我们之前的selenium都是浏览器驱动自动打开一个网页&#xff0c;执行相关操作&#xff0c;其实也可以让其后台显示&#xff0c;不用在前台显示。 ​ 要设置无头浏览器&#xff0c;可以使用Selenium的Headless模式。在Headless模式下&#xf…

精密、低噪、CMOS、轨到轨输入输出运算放大器MS8605/8606

产品简述 MS8605 、 MS8606 是单通道和双通道的轨到轨输入输出单电 源供电运放。它们具有低的失调电压、低的输入电压电流噪声和 宽的信号带宽。 低失调、低噪、低输入偏置电流和宽带宽的特性结合使得 MS860X 运放适用于各种应用。其优异的性能能够应用于滤波 器、积分…

QT Windos平台下打包应用程序

一、windeployqt.exe windeployqt&#xff1a;是 Qt 框架自带的一个工具&#xff0c;用于将一个 Qt 应用程序在 Windows 操作系统下进行打包。它可以通过扫描应用程序的依赖项获取所需的 Qt 库文件、插件和翻译文件&#xff0c;以及复制应用程序可执行文件和所需的依赖项到指定…

Python---time库

目录 时间获取 时间格式化 程序计时 time库包含三类函数&#xff1a; 时间获取&#xff1a;time() ctime() gmtime() 时间格式化&#xff1a;strtime() strptime() 程序计时&#xff1a;sleep() perf_counter() 下面逐一介绍&#…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 1 “建立开发环境”

这个系列的文章将叙述如何借由 NXP 的“evkmimxrt1060_aws_remote_control_wifi_nxp”这支 Sample Code&#xff0c;达到 NXP RT1060EVK 经由 U-Blox EVK-JODY-W263 将资讯传到 AWS 上&#xff0c;并可借由手机对 RT1060 EVK 的 LED 进行远端控制。 整体架构如下图所示&#x…

大名鼎鼎的CleanMyMac X软件值不值得下载?

今天给大家推荐大名鼎鼎的Clean My Mac X&#xff08;以下简称CMM X&#xff09;&#xff0c;它是Mac上一款美观易用的系统优化清理工具&#xff0c;也是小编刚开始用Mac时的装机必备。它能够清理系统垃圾&#xff0c;提升电脑的运行速度&#xff0c;卸载许久不用的软件&#x…

横向扩展统一存储与备份服务器功能

Infortrend 更新了GS&#xff0c;GSe&#xff0c;GSe Pro统一存储系列的备份服务器功能。该功能降低数据备份成本&#xff0c;并提供灵活的备份策略。通过备份服务器功能&#xff0c;用户可以通过多种途径实现数据备份&#xff0c;包括公有云&#xff08;兼容S3&#xff09;、文…