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

三个问题

了解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.mzph.cn/news/37533.shtml

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

相关文章

从一到无穷大 #10 讨论 Apache IoTDB 大综述中看到的优劣势

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言问题定义新技术数据模型schemalessTsfile设计双MemTable高级可扩展查询其他 IotD…

两天入门Linux、搭建Spring环境 第一天

一、Linux简介 1.什么是Linux 一个操作系统,未来公司里面会用到、接触的新操作系统。 2.为什么学Linux (1)个人职务需要,肯定会接触到Linux (2)职业发展,以后的发展肯定需要掌握Linux的许多使用方法 3.学哪些内容 (1)Linux基本介绍 (2)…

EnableAutoConfiguration Attributes should be specified via @SpringBootApplic

在排除数据源加载时,发现这个注解EnableAutoConfiguration(exclude{DataSourceAutoConfiguration.class})会飘红 这是因为在SpringBootApplication中已经有EnableAutoConfiguration注解了; 所以把它改写成以下的格式即可

图像变形之移动最小二乘算法(MLS)

基本原理 基于移动最小二乘的图像变形是通过一组源控制点和目标控制点来控制变形,对于每一个待求变形后位置的点而言,根据预设的形变类型(如仿射变换、相似变换、刚性变换)求解一个最小二乘优化目标函数估计一个局部的坐标变换矩阵…

metaRTC7 demo mac/ios编译指南

概要 metaRTC7.0开始全面支持mac/ios操作系统,新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库,arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…

基于Java+SpringBoot+Vue的网吧管理系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

智头条|DFM-2大模型吹热智能家居,360安全云正式发布

行业动态 DFM-2大模型吹热智能家居 近期,思必驰行业语言计算大模型DFM-2正式发布,也带来了人机交互能力的提升和优秀的技术落地能力。DFM-2大模型与DUI平台结合推出DUI2.0,完成了对话式AI全链路技术的升级,推进深度产业应用。在智能家居领域,目前思必驰已与海信、长虹美菱、老…

实例038 设置窗体在屏幕中的位置

实例说明 在窗体中可以设置窗体居中显示,本例通过设置窗体的Left属性和Top属性可以准确设置窗体的位置。运行本例,效果如图1.38所示。 技术要点 设置窗体在屏幕中的位置,可以通过设置窗体的属性来实现。窗体的Left属性表示窗体距屏幕左侧的…

Makefile多个子文件夹

首先,目录结构: 其中根目录Makefile主要作用是调用其他子文件夹Makefile,每个子模块执行各自编译后在build文件夹下生成obj文件,最后再执行build文件夹下Makefile进行链接。 根目录Makefile: TARGET ACT_Drv ##SRC_D…

秦岭地形图、水系图、全景图

来源:头条留白sy,星球研究所等,转自:地理科学研究苑

kubernetes集群(k8s)之安装部署Calico 网络

目录 安装部署Calico 网络 (一)环境准备 (二)部署docker环境 (三)部署kubernetes集群 (四)部署Calico网络插件 安装部署Calico 网络 (一)环境准备 IP地…

【历史上的今天】8 月 15 日:苹果推出初代 iMac;谷歌收购摩托罗拉移动;Fuchsia 首次发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 8 月 15 日,在 1878 年的今天,我国第一套邮票发行。中国是一个文明古国,在邮政通信方面,有着悠久的历史。早在三…

分布式监控平台—zabbix

前言一、zabbix概述1.1 什么是zabbix1.2 zabbix的监控原理1.3 zabbix常见五个应用程序1.4 zabbix的监控模式1.5 监控架构1.5.1 C/S(server—client)1.5.2 server—proxy—client1.5.3 master—node—client 二、部署zabbix2.1 部署 zabbix server 端2.2 …

日常BUG——SpringBoot关于父子工程依赖问题

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 在父子工程A和B中。A依赖于B,但是A中却无法引入B中的依赖,具体出现的…

Kubernetes 部署DolphinScheduler 创建租户失败

创建租户 报错创建租户失败。后台日志如下 源代码跟踪 org.apache.dolphinscheduler.api.service.impl.TenantServiceImpl / if hdfs startup if (PropertyUtils.getResUploadStartupState()) {createTenantDirIfNotExists(tenantCode); }需要将 resource.storage.type 置为…

【数据结构】队列及其实现

目录 1.队列的概念及结构 2.队列的实现 2.1队列结构定义 2.2队列的初始化及销毁 2.3数据入队 2.4数据出队 2.5访问队头数据 2.6访问队尾数据 2.6判断队列是否为空 2.7求队列的大小 2.7打印队列 1.队列的概念及结构 队列:只允许在一端进行插入数据操作&…

与微服务平台厂家联手,一起实现高效率发展!

在如今的快节奏发展社会中,只有利用科技的力量,才能与市场接轨,了解市场和客户需求,最终实现更快速的发展。如果还停留在闭门造车的环境中,不“引进来,走出去”,那势必会与成功擦肩而过。微服务…

clickHouse部署

docker仓库地址 https://hub.docker.com/ 1、docker环境搭建 # 1.先安装yml yum install -y yum-utils device-mapper-persistent-data lvm2 # 2.设置阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查…

【芯片前端】auto_testbench的大版本升级——加入简单预期与自动比对

前言 前文提要: 【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification_rtl脚本_尼德兰的喵的博客-CSDN博客 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_autotestbench_尼德兰的喵的博客-CSDN博客 工具路径: auto…

广告聚合平台能为APP开发者提供哪些帮助

应用变现平台是帮助开发者优化广告策略并最终获得更多收入的综合途径。在广告变现过程中,接入单一的广告联盟,变现效率不高,并且开发者需要花费许多精力进行筛选和管理,难免会应接不暇,而聚合广告平台的出现则一定程度…