天天看点

【linux】helloword原理分析及实战

目录

前言

linux中hello word原理

hello word 实战

学习参考

hello word

著名演示程序,哈哈

下面在 arm linux 下展示一下hello world,便开始入门 arm linux 程序篇。

以下学习基于 NXP 的 IMX6 平台。

李柱明博客:https://www.cnblogs.com/lizhuming/

本文链接:https://www.cnblogs.com/lizhuming/p/13976680.html

简要步骤

gcc 编译,编译成功后得出可执行文件 armHelloWord(该名字根据用户定义而不同)

预处理

编译

汇编

链接

链接分为两种

动态链接

静态链接

控制台运行可执行文件 <code>./armHelloWord</code>

linux kernel

Shell 会创建一个新的进程来执行该程序。

使用 fork() 函数创建一个新的进程。

往新的进程中添加需要执行的程序 armHelloWord

使用 exeve() 函数往新的进程里添加运行程序

sys_execve() 函数为 linux 系统调用,被 exeve() 函数调用

这里的系统调用可以理解为是操作系统系统开放给用户的最底层接口

do_exeve() 函数是 sys_execve() 函数的核心。

load_elf_binary() 函数会去文件系统中读取 armHelloWord 程序到内存,然后判断它是否是动态链接的可执行程序,如果不是,则进一步判断是否是静态链接的文件。

glibc 库相关

ld-linux-xx.so 是 glibc 库中的动态连接器。(动态库)

如果 armHelloWord 程序是 动态链接 程序,该动态链接器会去加载共享库,并完成共享库和程序的链接工作, 然后准备真正开始执行hell程序。

如果 armHelloWord 程序是 静态链接 程序,则无需再加载链接共享库,直接开始准备执行 armHelloWord 程序。

程序的真正入口 _start

该符号在glibc中

执行用户程序前进行一些初始化 __libc_start_main()

该符号也是glibc中的函数

调用用户程序中的 mian() 函数,开始执行 printf 打印函数。

程序执行完了之后,调用glibc库中的 _exit() 函数,来结束当前进程。

helloword.c 源码很简单

Makefile 源码参考

效果图

【linux】helloword原理分析及实战

工程源码-gitee

野火