嵌入式Linux驱动开发系列五:Linux系统和HelloWorld

news2024/10/6 21:53:30

三个问题

了解Hello World程序的执行过程有什么用?

编译和执行:Hello World程序的执行分为两个主要步骤:编译和执行。编译器将源代码转换为可执行文件,然后计算机执行该文件并输出相应的结果。了解这个过程可以帮助我们理解如何将代码转化为可运行的程序。

语法和语义:Hello World程序是一个简单的示例,它包含一些基本的语法和语义规则。通过学习Hello World程序的执行过程,我们可以了解如何正确使用编程语言的关键字、标识符、语句和表达式,以及它们在程序中的作用。

调试和错误处理:当我们编写代码时,经常会出现错误。了解Hello World程序的执行过程可以帮助我们更好地理解和调试代码中的错误。我们可以学习如何查找和修复常见的语法错误和逻辑错误,并提高代码的质量和可靠性。

程序输出和交互:Hello World程序的执行结果通常是在终端或命令行中输出一段文本。这可以帮助我们理解程序如何与用户进行交互,并将结果展示给用户。了解这个过程对于开发复杂的应用程序和用户界面是很重要的。

裸机开发中的HelloWorld程序是怎么执行的?

第一步;进行源代码的编写,其中关键的点在于printf函数的实现,它需要依赖单片机的串口驱动程序。

第二步: 借助一些集成开发环境进行程序的编译。一键编译,无需学习编译链接相关知识。

第三步: 借助烧录工具烧录到具体芯片上。一键烧录,无需学习芯片的flash和各种各样启动方式。

第四步: 上电启动开发板,串口输出“Hello World”字符串。

Linux系统下的Hello World程序是怎么执行的?

四个案例

gcc预处理c文件

COLLECT_GCC_OPTIONS='-E' '-o' 'hello.i' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/5/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu hello.c -o hello.i -mtune=generic -march=x86-64 -fstack-protector-strong -Wformat -Wformat-security

这是一个gcc编译器的命令行选项示例。它的作用是将C源文件hello.c预处理为hello.i文件。下面是每个选项的解释:

  1. -E: 表示只进行预处理,不进行编译和链接操作。
  2. -o hello.i: 指定预处理输出的文件名为hello.i。
  3. -v: 详细输出编译器执行的信息。
  4. -mtune=generic: 指定编译时针对通用处理器进行优化。
  5. -march=x86-64: 指定生成适用于x86-64架构的代码。
  6. -fstack-protector-strong: 生成强制堆栈保护的代码,以防止缓冲区溢出漏洞。
  7. -Wformat -Wformat-security: 开启有关格式化字符串的警告。

gcc编译c文件

gec@ubuntu:~/hello$ sudo gcc -S hello.i -o hello.s -v

COLLECT_GCC_OPTIONS='-s' '-o' 'hello.s' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/cc1 -fpreprocessed hello.i -quiet -dumpbase hello.i -mtune=generic -march=x86-64 -auxbase hello -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc88JZ4W.s

这是gcc编译器的另一个命令行选项示例。它的作用是将预处理过的文件hello.i进行进一步编译,生成汇编语言文件hello.s。下面是每个选项的解释:

  1. -s: 生成汇编语言文件。
  2. -o hello.s: 指定汇编语言输出文件名为hello.s。
  3. -v: 详细输出编译器执行的信息。
  4. -mtune=generic: 指定编译时针对通用处理器进行优化。
  5. -march=x86-64: 指定生成适用于x86-64架构的代码。
  6. -fpreprocessed hello.i: 指定预处理过的文件hello.i作为输入文件。
  7. -dumpbase hello.i: 指定基础输入文件为hello.i。
  8. -auxbase hello: 指定辅助的基本文件名为hello。
  9. -version: 打印版本信息。
  10. -fstack-protector-strong: 生成强制堆栈保护的代码,以防止缓冲区溢出漏洞。
  11. -Wformat -Wformat-security: 开启有关格式化字符串的警告。
  12. -o /tmp/cc88JZ4W.s: 指定汇编语言输出文件的路径为/tmp/cc88JZ4W.s。

gcc编译汇编

sudo gcc -c hello.s -o hello.o -v

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 
COLLECT_GCC_OPTIONS='-c' '-o' 'hello.o' '-v' '-mtune=generic' '-march=x86-64'
 as -v --64 -o hello.o hello.s

as -v --64 -o hello.o hello.s

gcc在把汇编文件编译为重定位文件时,使用的是as这个应用程序
 

gcc链接可重定位文件

ld连接器

collect2封装了ld连接器

COLLECT_GCC_OPTIONS='-o' 'hello' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cc9OI5DQ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o hello /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

(封装了ld程序)

静态链接

COLLECT_GCC_OPTIONS='-o' 'hello_static' '-v' '-static' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccqTGMxr.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lc --sysroot=/ --build-id -m elf_x86_64 --hash-style=gnu --as-needed -static -z relro -o hello_static /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginT.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

输入ls -lh 可以看到动态编译和静态编译的两个文件大小区别

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 CubeMX USB_(HID 鼠标和键盘)

STM32 CubeMX STM32 CubeMX USB_HID(HID 鼠标和键盘) STM32 CubeMX前言 《鼠标》一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码鼠标发送给PC的数据解析实验效果 《键盘》STM32 CubeMX 设置(同上)代码…

检测文本是否由AI生成,GPT、文心一言等均能被检测

背景 目前很多机构推出了ChatGPT等AI文本检测工具,但是准确率主打一个模棱两可,基本和抛硬币没啥区别。 先说结论,我们对比了常见的几款AI检测工具,copyleaks检测相比较而言最准确。 检测文本 AI文本片段1 来源:G…

人工智能的缺陷

首先从应用层面理解什么是人工智能,目前人工智能主流应用面包括:自然语言处理领域,代表为chatgpt,我们能用其进行日常交流,问题答疑,论文书写等。计算机视觉领域,代表为人脸识别,现在…

Metashape和PhotoScan中文版软件下载安装地址

Metashape的点云生成功能 Metashape具有强大的点云生成功能,可以将图像转换为精确的三维点云数据。点云数据是进行三维建模和地形分析的重要基础。 在使用Metashape时,用户可以通过使用图像对齐功能生成点云数据。软件根据对齐后的图像生成稠密的点云&a…

c语言-qsort函数

目录 一、函数介绍 二、qsort函数的使用 1、对int类型数组排序 2、对char类型排序 3、对浮点型排序 4.比较字符串 4.1按首字母排序 4.2按长度排序 4.3按字典顺序 5.结构体排序 5.1 多级排序 三、模拟实现qsort函数 【冒泡排序的实现】 【主函数部分】 【代码详解…

二叉树的构建(java基于数组)

前言 二叉树在算法中是经常考察的点,但是要在本地测试的话,就必须自己构建二叉树。在算法题中,一般给我们的都是一个数组,或者是二叉树的形状。因此,需要将数组转换为二叉树,这样才能测试出自己的代码是否符…

Linux文本处理工具和正则表达式

Linux文本处理工具和正则表达式 一.查看、截取和修改文本的工具 1.查看文本的工具 cat 最常用的文件查看命令;当不指明文件或者文件名为一杠’-时,读取标准输入。 cat [OPTION]... [FILE]... -A:显示所有控制符(tab键:^I;行结束符:$) -…

安科瑞故障电弧在体育场馆的应用-安科瑞黄安南

应用场景 一般应用于末端照明回路 功能 1.支持1路剩余电流,外接漏电互感器 2.支持4路温度,外接温度传感器 3.支持32路故障电弧,外接故障电弧传感器 4.支持2DI,2DO 5.声光报警,LCD点阵液晶显示 6.导轨式安装&…

基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练 广告生成 任务

一、ChatYuan-large-v2 ChatYuan-large-v2是一个开源的支持中英双语的功能型对话语言大模型,与其他 LLM 不同的是模型十分轻量化,并且在轻量化的同时效果相对还不错,仅仅通过0.7B参数量就可以实现10B模型的基础效果,正是其如此的…

基于YOLOv7开发构建MSTAR雷达影像目标检测系统

MSTAR(Moving and Stationary Target Acquisition and Recognition)数据集是一个基于合成孔径雷达(Synthetic Aperture Radar,SAR)图像的目标检测和识别数据集。它是针对目标检测、机器学习和模式识别算法的研究和评估…

Visual Studio 2019 详细安装教程(图文版)

前言 Visual Studio 2019 安装包的下载教程、安装教程 教程 博主博客链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 ********文章附有百度网盘安装包链接********* 系列文章 第一篇:Visual Studio 2019 详细安装教…

MobiSys 2023 | 多用户心跳监测的双重成形声学感知

注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:<<MobiSys’23,Multi-User A…

特殊符号的制作 台风 示例 使用第三方工具 Photoshop 地理信息系统空间分析实验教程 第三版

特殊符号的制作 首先这是一个含有字符的&#xff0c;使用arcgis自带的符号编辑器制作比较困难。所以我们准备采用Adobe Photoshop 来进行制作符号&#xff0c;然后直接导入符号的图片文件作为符号 我们打开ps&#xff0c;根据上面的图片的像素长宽比&#xff0c;设定合适的高度…

高中生python零基础怎么学,python高中生自学行吗

这篇文章主要介绍了高中学历学python好找工作吗&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 学习python的第九天 根据我们前面这几天的学习&#xff0c;我们掌握了Python的…

nginx环境部署

目录 一、yum安装 二、源码安装 三、测试结果 一、yum安装 1、先查找本地yum源上有没有nginx包 yum list | grep nginx 2、rpm安装 rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.2-1.el7_4.ngx.x86_64.rpm 3、查看安装是否成功 rpm -pa | grep…

Pytorch迁移学习使用MobileNet v3网络模型进行猫狗预测二分类

目录 1. MobileNet 1.1 MobileNet v1 1.1.1 深度可分离卷积 1.1.2 宽度和分辨率调整 1.2 MobileNet v2 1.2.1 倒残差模块 1.3 MobileNet v3 1.3.1 MobieNet V3 Block 1.3.2 MobileNet V3-Large网络结构 1.3.3 MobileNet V3预测猫狗二分类问题 送书活动 1. MobileNet …

【力扣每日一题】2023.8.6 两两交换链表中的节点

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个链表&#xff0c;让我们两两交换相邻节点的值&#xff0c;并且不能通过修改节点内部的值来达到这一目的&#xff0c;如果可…

NERFS 与现实捕捉 - 弥合现实世界与数字世界之间的差距

NERF介绍 近年来&#xff0c;计算机视觉和图形领域取得了显着的进步&#xff0c;催生了革命性的技术&#xff0c;改变了各个行业。 NERFS&#xff08;神经辐射场&#xff09;和现实捕捉是两项备受关注的重要技术。 NERFS 和现实捕捉都是以数字形式捕捉和重建现实世界的强大工具…

无涯教程-Perl - dbmclose函数

描述 此函数关闭哈希和DBM文件之间的绑定。将领带功能与合适的模块配合使用。 语法 以下是此函数的简单语法- dbmclose HASH返回值 如果失败,此函数返回0,如果成功,则返回1。 请注意,在大型DBM文件上使用键和值之类的功能时,它们可能会返回巨大的列表。您可能更喜欢使用e…

HBase-写流程

写流程顺序正如API编写顺序&#xff0c;首先创建HBase的重量级连接 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;…