【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 ...
随机推荐
- Windows 10 系统 - business editions 和 consumer editions 的区别
我们在使用微软操作系统(Windows 10)的时候,因为系统版本太多导致我们不知道如何选择.对于 Windows 10 系统,应该下载安装 business 还是 consumer 版本这个问题,这 ...
- shell-的特殊变量-位置变量$0 $n $* $# $@详解
一:shell特殊变量 1. 位置变量 $0 获取当前执行的shell脚本的文件名,包括路径 $n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9 ...
- devops构建IT服务供应链
1. devops构建IT服务供应链 1) 什么是devops devops是 "开发" 和"运维"的缩写 devops是一组最佳实践强调(IT研发.运维. ...
- arcgis-java-100.8.0.jar下载
链接: https://pan.baidu.com/s/1HoW2IhPvHRw9LBZphxC5Rw 提取码: pexn
- day20 Pyhton学习 面向对象-成员
一.类的成员 class 类名: # 方法 def __init__(self, 参数1, 参数2....): # 属性变量 self.属性1 = 参数1 self.属性2 = 参数2 .... # ...
- mysql 操作数据库
创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name(数据库名字) #添加 IF NOT EXISTS,如果已有数据库,将会提醒,不会出现错 ...
- C# Hash算法
#region Hash算法 /// <summary> /// Hash算法 /// </summary> /// <param name="myStr&qu ...
- 【Python 1-0】10个学习Python的理由以及Python的优势有哪些?
Python的由来 首发地址 Python的创始人是吉多·范罗苏姆,1989年他在阿姆斯特丹的CWI工作,圣诞节期间,吉多·范罗苏姆为了打发圣诞节的无聊,决定开发一个新的脚本解释程序,作为ABC 语言 ...
- pyqt设置窗口图标
import sys from PyQt5.QtWidgets import QMainWindow,QApplication from PyQt5.QtGui import QIcon ''' 窗口 ...
- pc和移动与ipad自适应布局的相关问题和解决
一.通过CSS检测本机设备屏幕大小分配样式 1.最小尺寸分辨率1024*768(传统17寸显示器),则可以采用940px.960px.或者常用的980px作为最小宽度. ---- 在可视区域的宽度小于 ...
