Linux下helloworld的简单编译过程

Linux设备驱动 ----helloworld.ko 毕业已经好多年了,从单片机到毕业后的安卓开发,虽然在上面工作了很多时间,但是总感觉自己缺点什么。总的来说对知识的储备其实不是那么充足,对一些深层次的东西理解也不是很透彻,当然自己也缺少一股冲劲与恒心。所以现在想在优快云 上中记录对基础知识的一些巩固,对程序员而言真的是需要多看多写,才能对自己有所提高,不然到最后可能还是那个水平,废话可能有点多了........下面进入正题 最简单的驱动编译,注... 阅读详情

我们在使用gcc生成可执行程序的时候,一般是命令: gcc *.c, 生成可执行文件a.out
其实过程可以分为4个步骤,分别是预处理,编译,汇编和链接。下面以最基本的helloworld来简单了解一下编译的过程。

1.预编译

预编译又称为预处理,是做些代码文本的替换工作。
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令。
gcc -E hello.c -o hello.i
生成的hello.i仍然是个文本文件

cat@lenovo:~/blog/0718$ ls
hello.c
cat@lenovo:~/blog/0718$ gcc -E hello.c -o hello.i
cat@lenovo:~/blog/0718$ file hello.i
hello.i: UTF-8 Unicode C program text

2.编译

把用高级程序设计语言书写的源程序,翻译成汇编语言

cat@lenovo:~/blog/0718$ ls
hello.c  hello.i
cat@lenovo:~/blog/0718$ gcc -S hello.i
cat@lenovo:~/blog/0718$ ls
hello.c  hello.i  hello.s
cat@lenovo:~/blog/0718$ cat hello.s
    .file   "hello.c"
    .section    .rodata
.LC0:
    .string "hello world"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

3.汇编

这个过程把汇编语言翻译成机器语言

cat@lenovo:~/blog/0718$ ls
hello.c  hello.i  hello.s
cat@lenovo:~/blog/0718$ gcc -c hello.s
cat@lenovo:~/blog/0718$ ls
hello.c  hello.i  hello.o  hello.s
cat@lenovo:~/blog/0718$ file hello.o
hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

4.链接

将生成的目标文件和其所依赖的库文件进行连接,生成一个可执行文件

cat@lenovo:~/blog/0718$ gcc hello.o
cat@lenovo:~/blog/0718$ ls
a.out  hello.c  hello.i  hello.o  hello.s
cat@lenovo:~/blog/0718$ ./a.out 
hello world
使用moveit!控制真实机械臂(5)——编写真实机械臂节点中的action服务程序 上一篇文章中,我们简要介绍了ROS中action的基本知识,为了控制真实机械臂,我们已经修改了moveit配置文件,使得moveti启动后具备一个control_msgs::FollowJointTrajectoryAction类型的action客户端,接下来,我们完成该类型action的另一半,编写C++程序来实现action的服务端。由于底层机器人控制程序一般差别都很大,这里展示的只是编程要点... 阅读详情

相关推荐

2017全国大学生电子设计大赛B题 | 板球控制系统(四)机械设计相关

转载请注明出处。   转眼2019了诶,可能有些同学又该问了,哇向阳哥,你这个鸽子放的好,转眼大半年了一年都没更新,我也知道啊,说好的源码呢,挖的机械的坑呢?咕咕咕咕我也不想啊,我这不是懒吗!过年有空了,又到了收红包泡妹子玩游戏.......呸,学习准备比赛码代码的时候了,终于有点空闲,于是乎今晚先把机械的大坑填了。     咱话先说在最前面。机械这玩意,靠经验,也考想象力,更要命的还是出了...

王向阳的博客 3万+

Linux环境下编译 Hello world

Hello world程序是学习一门语言的第一个程序已成为一种有趣的惯例。下面是使用Linux系统中默认的编译器编辑该程序的源代码,并使用GCC编译器将该程序编译成一个可执行文件。        首先使用crtl + alt + T打开终端。使用mkdir命令新建一个目录,命令如下:        ~$ mkdir C Program        进入C Program目录,命令如下:

Keep Fighting All The Time 3871

Qt C++:跨平台开发利器

摘要: Qt C++是基于C++的跨平台开发框架,通过元对象系统、信号槽机制及模块化架构实现"一次编写,多端部署"。核心特性包括: 跨平台能力:覆盖桌面(Windows/macOS/Linux)、移动端(iOS/Android)、嵌入式及WebAssembly; 信号与槽:替代传统回调,实现对象间高效通信; UI组件库:200+预制组件支持QSS样式定制; 工具链:Qt Creator集成开发环境提供可视化设计、调试及多平台编译。 广泛应用于工业控制、车载系统、医疗设备及跨平台应用开发,

2202_75382767的博客 1683

Linux--如何在Linux上运行一个helloworld

Linux上运行helloworld

学无止境 988

aruco_ros实战:从USB摄像头到Marker位姿检测全流程解析

本文详细解析了使用aruco_ros从USB摄像头实现ArUco Marker检测与位姿估计的全流程。内容涵盖环境搭建、核心launch文件配置、可视化调试、位姿数据解析以及深度优化技巧,帮助开发者快速掌握ROS下的视觉定位关键技术,并集成到机器人项目中。

weixin_29230805的博客 265

wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

本文主要介绍如何在stm32mp157中移植并测试芯片RTL8723DS的wifi功能。

汉尼拔勇闯天涯 8744

Linux 使用gcc编译一个helloworld程序

linux学习

srh20的博客 4959

Global Mapper与ArcGIS双剑合璧:自动化与半自动矢量化提取地物轮廓实战

本文详细介绍了如何结合Global Mapper的自动化批量提取与ArcGIS的半自动精细修整功能,高效完成地物轮廓矢量化工作。通过实战案例,阐述了利用Global Mapper快速抓取初步轮廓,再借助ArcGIS的ArcScan等工具进行精细化编辑和优化的完整工作流,有效提升地理信息数据处理效率。

weixin_29284657的博客 119

【C语言】在 Linux 终端编写、编译并运行 Hello world 程序

用于在屏幕上打印“Hello, world!是一个预处理命令,用于包含标准输入输出库文件。是主函数,程序从这里开始执行。选项用于指定输出文件的名称。

HEX9CF的技术博客 1244

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

LLC谐振变换器软启动,不只是“慢启动”,还是“智能启动”

LLC谐振变换器的软启动,不只是“慢慢来”,而是要在控制时序、限流、响应速度之间精妙权衡。而数字控制,特别是用查表法或混合信号法,为实现真正的“最佳轨迹”提供了可能。✨小Tips:如果你的系统成本敏感,选择查表法准没错;如果你的设计目标是超高速响应,那就上混合信号的高配方案!

weixin_43199439的博客 691

linux c编程之“hello world”一

注]:环境说明:GCC: 4.8.5其他环境下的结果可能不尽相同。声明:本文是我的一点点经验总结,文中可能有理解不到位甚至是错误的,肯请大家多多批评,多提意见。注:这篇总结写于两三年前,虽删改数次,但考虑到自己才疏学浅,实不敢“毁”人不倦,贻笑大方,故当时并未发布。今日闲来无事,忽然想起还有这么一篇总结尚未发布。今日虽又查看了一遍,但难免挂一漏万,怀揣忐忑之情,姑且发布,算是抛砖引玉吧。若本文对阅读者有所帮助,实乃荣幸之至,若有错误或纰漏,万望不吝赐教。本文的资料参考自。

wuj的专栏 2925

被Cloudflare 5秒盾虐了半个月,终用Python破局:UA+TLS指纹伪装实战,拦截率从42%干到3%

其实5秒盾不难破,难的是摸透它的检测逻辑——它不是“一刀切”地拦截爬虫,而是通过“多维度指纹校验”,判断你是不是“真实用户”。表层:UA和HTTP头要完整、匹配;中层:TLS指纹要和真实浏览器一致(核心);深层:行为要符合人类习惯(请求间隔、JS执行)。这套方案不仅适用于Cloudflare 5秒盾,很多基于指纹检测的反爬系统(如Akamai、Imperva)也适用。2025年的爬虫,早已不是“能爬就行”,而是“爬得稳、不被封”——指纹伪装就是实现这一点的关键。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1851

c在linux的编译过程,在 Linux 上编译 C/C++ 程序

&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp本文介绍如何使用 Linux 控制行用 g++ 编译器编译一个 C++ 的 hello world 程序.阅读本文不需要任何基础(包括 C++ 和 Linux).如何安装 Linux 控制行?你可以直接在电脑上安装一个 Linux 系统,也可以在 Win10 下使用 WSL...

weixin_39874589的博客 116

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux下gcc和g++编译helloworld

linux C(hello world) 1.使用vi/vim进行编写代码并保存为hello_world.c.如下: ...

180

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ubuntu下helloworld内核模块编译、加载/卸载

1、编写helloworld内核模块的源码 如下是helloworld.c源码 #include //所有模块都需要的头文件 #include // init&exit相关宏 MODULE_LICENSE("GPL"); MODULE_AUTHOR("feifei"); MODULE_DESCRIPTION("hello world module"); static i

时刻保持踏实努力的常态,机会总会自动找上门 3149

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Tiny6410内核模块编译之helloworld

由于项目,需要自己编译内核驱动,但是考虑到编译内核比较麻烦,而且需要重新烧写系统,不是很方便,所以研究了一下通过模块的方式加载驱动。用一个 helloworld的程序说明一下整个流程,记下来,以便以后查阅。 编译环境说明: 主机操作系统:ubuntu12.04编译的linux内核:linux-2.6.38嵌入式系统:tiny6410 一、编译zImage         在编译

JPing的专栏 1991

Linux下的HelloWorld

Linux C编程,非原创,一个笔记。 [b]首先需要一个C的开发环境。[/b]在Linux下,一个完整的C开发环境包括以下三个组成:    1、函数库: glibc    要构架一个完整的C开发环境,Glibc是必不可少的,它是Linux下C的主要函数库。Glibc有两种安装方式:    A.安装成测试用的函数库     在编译程序时用不同的选项来试用新的函数库 ...

origin 专栏 245

linux内核的配置编译

内核代码:helloworld.c静态编译:将helloworld.c和zImage编译在一起动态编译,模块化编译:将helloworld.c和zImage分开编译,将helloworld.c编译成对应的二进制文件,默认以ko结尾,例如helloworld.ko内核编译借助Kconfig和Makefile,Kconfig和Makefile的选择关键看helloworld.c放置在哪个目录下,例如将...

WangHuiShou的博客 441

linux删除驱动命令,Linux 最简单的驱动程序hello world

最近开始学Linux驱动,就从最简单的开始练起,就从LDD-3里的第一个驱动程序hello world练起。The following code is a complete "hello world"module:#include#include MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_ALERT...

weixin_33634886的博客 518

C语言编译过程详解

上述gcc命令其实依次执行了四步操作:1.预处理(Preprocessing), 2.编译(Compilation), 3.汇编(Assemble), 4.链接(Linking)。

Never say never 552

Tiny6410 交叉编译helloworld程序

在工作目录下建立helloworld.c文件 [cpp]view plaincopyprint? #include<stdio.h> main() { printf("helloworld!\n"); } 保存关闭后。 编译helloworld文件: [csharp]vi...

a804666的博客 217

2021-2022学年——嵌入式系统实践实验2_HelloWorld程序实验

HelloWorld程序实验 实验目的 熟悉 Linux 应用程序编程; 掌握 Makefile 文件编写 实验设备 实 验 设 备 数 量 备 注 感知 RF2-210 实验箱 1 运行 linux 程序 串口线 1 连接网关板 COM3 与 PC 串口 PC 机 1 编译和下载程序 实验内容 (1)编写一个简单的 HelloWorld 程序; (2)编写修改相应的 Makefile 文件; (3)使用超级终端调试 HelloWorld 程序。 实验步骤 1.进入虚拟机ub

L_F_D的博客 2045

将hello程序作为驱动程序编译进系统内核

0x00开始 恩,可能是我比较愚钝,一个内核编译搞了一天,各种问题,各种bug,几度无奈,也是因为我突发奇想,并没有按照原来的那种操作,我直接把helloworld程序放到内核模块中编译成了一个驱动程序,虽然其中遇到了不知道多少的问题,不过最终是个完美的结局,给自己点个赞! 好了,废话不多说,直接开始还原我的helloworld驱动内核程序编译流程。 0x01下载内核并解压 编译内核,...

最高权限比特流 1121

Linux内核开发之Helloworld

学了那么多程序语言,总是有一个Hello world开头,不禁感叹Hello world的强大。呵呵,废话少说,咋们的故事当然要从这个Hello world开始。 (1)linux开源当然少不了源代码的贡献,请看下边(至于什么是开源,悲剧的我现在也没整明白): #include #include MODULE_LICENSE("Dual BSD/GPL"); static int

数据挖掘及搜索专栏 327

Linux内核模块初探——HelloWorld

本文通过学习宋宝华老师的《Linux设备驱动开发详解》第四章而写的学习笔记,感谢这本好书 一、为什么要有内核模块 因为Linux内核架构庞大,组件很多,如果我们把所有需要功能都编译到Linux内核中,就会导致内核很大,并且当我们要在现有内核中添加或删除功能时都要重新编译内核。 Linux使用了模块(Module)这一种机制,模块不用编译进内核映像,模块可以被加载和卸载,如果被加载就和内核中其...

Zach_z的博客 1118
下一篇: open/close函数的使用
Linux_forker
博客等级 码龄11年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值