首页 > 编程语言 >代码3:构造最小的HelloWorld程序

代码3:构造最小的HelloWorld程序

时间:2024-07-03 17:30:44浏览次数:1  
标签:代码 程序 最小 HelloWorld 编译 gdb rsp hello out

Intro:

  • 绪论2:应用视角的操作系统。
  • 目的:通过精简程序,了解整个编译过程。

一、GCC 编译 hello.c 的全过程

.c (源代码) -> .i (预编译源代码) -gcc-> .S (汇编代码) -as-> .o -ld-> a.out

(一)GCC 编译

hello.c 中只有一行 printf("hello,world\n"); 指令(return 由编译器处理,代码中便没有指定)。于是根据上面的编译全流程,使用:

gcc -E hello.c | less # 查看预编译结果
gcc -c hello.c # 生成 hello.o
ld hello.o # 强行链接
objdump -d a.out | less # 查看可执行文件的内容

因为我们的代码中使用了 printf 这样一个外部依赖函数,所以 LD 会报错。如果去掉 printf 这一行则报错消失,并使用 ld hello.o -e main 指定程序的 entrypoint 来消除警告。

(二)GDB 调试

执行 ./a.out 会报错,接下来使用 GDB 单步调试。

gdb a.out # 进入调试命令行
(gdb) starti # 从第一条指令开始执行
(gdb) layout asm # 将汇编语言的 text ui 显示在整个界面上方
(gdb) si # stepi 单步执行

# 一些辅助命令
(gdb) info registers # 查看寄存器中的值
(gdb) p $rsp # 打印 rsp 寄存器,由于它是栈指针,所以结果是内存地址
(gdb) x $rsp # rsp 指针指向的值,相当于 *rsp 解引用

最后我们发现:返回指令导致问题。

二、使用汇编“强行”精简代码

上面尝试精简 C 程序的方法遇到了阻碍,于是课程从汇编角度入手:通过手动执行“系统调用”的方式,结束当前程序、而非异常退出。

movq $SYS_exit,  %rax   # exit(
movq $1,         %rdi   #   status=1
syscall                 # );

上面的程序把 “系统调用” 的参数放到寄存器中,然后执行 syscall,让操作系统接管程序。在此基础上,课程实现了最小的 Hello World 程序:minimal.S

gcc -c minimal.S # 得到 minimal.o
ld minimal.o # 链接
objdump -d a.out | wc -l # 查看行数

得到的可执行程序无论是大小还是行数,都远小于 C 代码版本。

标签:代码,程序,最小,HelloWorld,编译,gdb,rsp,hello,out
From: https://www.cnblogs.com/7ytr5/p/18281747

相关文章

  • java模块——使用 47M 的java环境运行HelloWorld
    前言我们知道,运行java程序需要jre或jdk环境,但是现在的jdk安装包已经很大了,如果我们的程序很简单,并且需要把程序发送给其他没有jdk环境的人的运行要如何做呢?如何精简我们的程序包呢?从java9开始的模块功能为我们提供了解决方案。Java库设计者现在可以将代码清晰地划分为模块,这......
  • 源代码保密需要关注哪些重点?6种方法教会你
    源代码保密是信息安全管理中的一个重要环节,尤其在研发环境中,源代码的泄露可能导致严重的商业和安全风险。以下是源代码防泄密的重点和方法:1. 物理隔离与网络隔离物理隔离:通过将开发环境与外部网络物理隔离,防止未经授权的访问。例如,使用专用的开发网络,禁止外部设备(如U盘、移......
  • 企业做源代码加密/防泄密,需要如何选择产品?
    一:稳定性是选型最重要的标准    没有稳定不谈应用看过国内品牌繁多的加密软件后,很多人感觉加密软件没有太多技术含量。选型首先就问就问是不是BS架构呀、有没有桌面管控、能不能远程推送、能不能兼容LINUX等功能。我认为这些花哨的功能的确能让应用锦上添花,但忽视加密......
  • 代码随想录算法训练营第四十六天 | 买卖股票的最佳时机
    121.买卖股票的最佳时机题目链接文章讲解视频讲解动规五部曲:dp[j][0]:表示持有股票的最大现金,dp[j][1]表示不持有股票的最大现金递推公式:第j天持有股票的最大现金为:之前就持有这只股票和今天持有这只股票取最大值:dp[j][0]=max(dp[j-1][0],-prices[j]);第j天不持有......
  • stm32学习笔记---USART串口外设(代码部分)串口发送/串口发送+接收
    目录第一个代码:串口发送初始化串口的步骤USART的库函数三个初始化函数USART_ClockInit和USART_ClockStructInitUSART_Cmd和USART_ITConfigUSART_DMACmdUSART_SendData和USART_ReceiveData四个标志位相关的函数代码实现Serial.c第一步,开启时钟第二步,GPIO初始化第......
  • 代码1:七段数码管
    Intro:绪论1:操作系统概述。目的:模拟数字电路系统,这是当今的硬件基础。代码Github分为两部分:logisim.c模拟verilog编程,输出A=1;B=0...到管道中。seven_seg.py将输出结果使用ANSI编码进行可视化展示。这两部分的实施都比较巧妙。下面分别看一下这两段代码(略去了一......
  • 基于Java+Vue的智慧园区管理系统:创新园区运营模式,构建全方位企业服务体系(代码分享)
     前言:智慧园区管理系统是一个集成了多种功能的综合性系统,旨在通过信息化、智能化手段提升园区的管理效率和服务质量。以下是针对系统的各个功能模块的简要描述:一、楼栋管理会务管理:管理园区内的会议预约、会议室使用等。园区信息:展示园区的基本信息,如位置、面积、规划等。......
  • 基于Java+Vue的企事业移动培训考试系统:体系化培训管理,保障培训效果(代码分享)
     前言:企事业移动培训考试系统是一个集成多种功能的综合性平台,旨在为企业提供便捷、高效、灵活的在线培训和考试解决方案。以下是针对平台所列出的八个主要功能的详细解释:一、文档管理及在线预览允许企业上传、存储、管理和分享各种培训文档,如PPT、PDF、Word等。提供在线预......
  • 保持校园网自动登录的代码备忘: 基于webdriver和chrome
    在跑一个处理很多数据的代码,需要不间断地运行。而且最近打算回家一周,需要远程控制电脑。但是学校的校园网每到晚上就会自己断开,干脆写份脚本来保持校园网的连接这份简单的代码只包括三个部分,检测网络状态的部分,自动登录校园网的部分,循环执行的部分、importosimporttimeimpo......
  • Vector底层结构和代码解析
    基本介绍定义说明publicclassVector<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{Vector底层是一个对象数组,protectedObject[]elementData;Vector是线程同步的(线程安全),Vector类的操作方法带有synchronized......