嵌入式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…

​亚商投资顾问 早餐FM/0815生成式人工智能服务管理

01/亚商投资顾问 早间导读 商务部等9部门:促进农村大宗商品消费更新换代中央财办等九部门印发指导意见推动农村流通高质量发展《生成式人工智能服务管理暂行办法》今起施行 02/亚商投资顾问 新闻早餐 // 热点聚焦 // 商务部等9部门印发《县域商业三年行动计划&…

基于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全链路技术的升级,推进深度产业应用。在智能家居领域,目前思必驰已与海信、长虹美菱、老…

Vue3封装一个左侧可拖拽折叠的侧边栏布局

功能 1、点击左侧侧边栏可折叠或打开 2、左侧侧边栏可拖拽 代码 <template><div class"fold-left-box"><div class"fold-left-box-left" :style"{ width: asideWidth px }" v-show"asideWidth > 0">left<…

PAT 1097 Deduplication on a Linked List

个人学习记录&#xff0c;代码难免不尽人意 Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated absolute values of the keys. That is, for each value K, only the first node of which the value or absolute value o…

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

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

angular 子组件ngOnChanges监听@input传入的输入属性

在进入主题之前&#xff0c;先了解一下angular的生命周期。 生命周期 钩子分类 指令与组件共有的钩子 ngOnChangesngOnInitngDoCheckngOnDestroy 组件特有的钩子 ngAfterContentInitngAfterContentCheckedngAfterViewInitngAfterViewChecked 生命周期钩子的作用及调用顺序 …

Makefile多个子文件夹

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

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

来源&#xff1a;头条留白sy&#xff0c;星球研究所等&#xff0c;转自&#xff1a;地理科学研究苑

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

目录 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 &#xff08;二&#xff09;部署docker环境 &#xff08;三&#xff09;部署kubernetes集群 &#xff08;四&#xff09;部署Calico网络插件 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 IP地…

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

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

【Qt】多线程

线程创建 自定义线程类 #ifndef CUSTOMETHREAD_H #define CUSTOMETHREAD_H#include <QObject> #include <QThread> #include "add.h"class CustomeThread : public QThread {Q_OBJECT public:// Bind the thread kernel function.explicit CustomeThre…

分布式监控平台—zabbix

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

“华为杯”研究生数学建模竞赛2018年-【华为杯】C题:对恐怖主义袭击事件数据的量化分析(续篇)

目录 5.3.3 逻辑回归预测模型确立 5.3.4 利用逻辑回归预测模型进行求解 5.4 模型评价

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

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