【linux】helloword原理分析及实战
前言
- hello word
- 著名演示程序,哈哈
- 下面在 arm linux 下展示一下hello world,便开始入门 arm linux 程序篇。
- 以下学习基于 NXP 的 IMX6 平台。
linux中hello word原理
- 简要步骤
- gcc 编译,编译成功后得出可执行文件 armHelloWord(该名字根据用户定义而不同)
- 预处理
- 编译
- 汇编
- 链接
- 链接分为两种
- 动态链接
- 静态链接
- 链接分为两种
- 控制台运行可执行文件
./armHelloWord
- linux kernel
- Shell 会创建一个新的进程来执行该程序。
- 使用 fork() 函数创建一个新的进程。
- 往新的进程中添加需要执行的程序 armHelloWord
- 使用 exeve() 函数往新的进程里添加运行程序
- sys_execve() 函数为 linux 系统调用,被 exeve() 函数调用
- 这里的系统调用可以理解为是操作系统系统开放给用户的最底层接口
- do_exeve() 函数是 sys_execve() 函数的核心。
- load_elf_binary() 函数会去文件系统中读取 armHelloWord 程序到内存,然后判断它是否是动态链接的可执行程序,如果不是,则进一步判断是否是静态链接的文件。
- Shell 会创建一个新的进程来执行该程序。
- glibc 库相关
- ld-linux-xx.so 是 glibc 库中的动态连接器。(动态库)
- 如果 armHelloWord 程序是 动态链接 程序,该动态链接器会去加载共享库,并完成共享库和程序的链接工作, 然后准备真正开始执行hell程序。
- 如果 armHelloWord 程序是 静态链接 程序,则无需再加载链接共享库,直接开始准备执行 armHelloWord 程序。
- 程序的真正入口 _start
- 该符号在glibc中
- 执行用户程序前进行一些初始化 __libc_start_main()
- 该符号也是glibc中的函数
- 调用用户程序中的 mian() 函数,开始执行 printf 打印函数。
- 程序执行完了之后,调用glibc库中的 _exit() 函数,来结束当前进程。
- ld-linux-xx.so 是 glibc 库中的动态连接器。(动态库)
- linux kernel
- gcc 编译,编译成功后得出可执行文件 armHelloWord(该名字根据用户定义而不同)
hello word 实战
- helloword.c 源码很简单
/** @file helloword.c
* @brief 简要说明
* @details 详细说明
* @author lzm
* @date 2020-11-07 11:50:53
* @version v1.0
* @copyright Copyright By lizhuming, All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/
#include <stdio.h>
int main(void)
{
printf("hello word! This is a first program.\n");
return 0;
}
学习参考
- 野火
【linux】helloword原理分析及实战的更多相关文章
- 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业
2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...
- linux中断处理原理分析
Tasklet作为一种新机制,显然可以承担更多的优点.正好这时候SMP越来越火了,因此又在tasklet中加入了SMP机制,保证同种中断只能在一个cpu上执行.在软中断时代,显然没有这种考虑.因此同一 ...
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业
2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...
随机推荐
- Java死锁编码及定位分析的demo
死锁 死锁是什么 大学课程中的四个要素: (1)互斥(2)不可抢占(3)循环等待(4)请求保持 也就是下图所描述 产生死锁的主要原因 (1)系统资源不足(2)进程运行推进的顺序不合适(3)资源分配不当 ...
- 原生JS实现下拉列表
1 <div class="list"> 2 <ul> 3 <li> 4 <a href="#">Web部< ...
- 扫描仪扫描文件处理-ABBYY生成小体积黑白二值化PDF
禁止所有预处理选项: PDF保存选项: 保存提示(选择"保存为仅图像PDF"):
- spring boot:用cookie保存i18n信息避免每次请求时传递参数(spring boot 2.3.3)
一,用cookie保存i18n信息的优点? 当开发一个web项目(非api站)时,如果把i18n的选择信息保存到cookie, 则不需要在每次发送请求时都传递所选择语言的参数, 也不需要增加heade ...
- vscode配置python调试仍然直接输出
工作目录不能放在python的安装目录下
- 笔记之Utility.DataAccess
挤出时间看了一些代码,做一些笔记,备忘!!! 现在ORM随处可见,为什么不要已有的ORM而要手动写SQL呢?这肯定是有因为滴,存在必合理嘛! 自认为关于性能.维护.Maybe还有其他的,欢迎大家拍砖! ...
- ThreeJS学习6_几何体相关(BufferGeometry)
ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...
- Spring笔记(4) - Spring的编程式事务和声明式事务详解
一.背景 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作 ...
- JS错误写法[清除DOM]
前言 我现在总结一下我之前敲代码犯的错误,清除DOM元素,我们开始写代码吧! HTML <h1 style="font-size: 18px;font-weight: bold;col ...
- 对于72种常用css3的使用经验
对于72种常用css3的使用经验 保存网站源码 目的 保证有足够的css和js文件源码 拿到当前网页的整体布局 本地化 创建web项目 将web项目创建出来 在项目中创建一个文件夹 将所有的js和cs ...