【linux】helloword原理分析及实战


前言

  • hello word
    • 著名演示程序,哈哈
  • 下面在 arm linux 下展示一下hello world,便开始入门 arm linux 程序篇。
  • 以下学习基于 NXP 的 IMX6 平台。

linux中hello word原理

  • 简要步骤
    1. gcc 编译,编译成功后得出可执行文件 armHelloWord该名字根据用户定义而不同
      1. 预处理
      2. 编译
      3. 汇编
      4. 链接
        • 链接分为两种
          • 动态链接
          • 静态链接
    2. 控制台运行可执行文件 ./armHelloWord
      • linux kernel
        1. Shell 会创建一个新的进程来执行该程序。
          • 使用 fork() 函数创建一个新的进程。
        2. 往新的进程中添加需要执行的程序 armHelloWord
          • 使用 exeve() 函数往新的进程里添加运行程序
        3. sys_execve() 函数为 linux 系统调用,被 exeve() 函数调用
          • 这里的系统调用可以理解为是操作系统系统开放给用户的最底层接口
        4. do_exeve() 函数是 sys_execve() 函数的核心。
        5. load_elf_binary() 函数会去文件系统中读取 armHelloWord 程序到内存,然后判断它是否是动态链接的可执行程序,如果不是,则进一步判断是否是静态链接的文件。
      • glibc 库相关
        1. ld-linux-xx.so 是 glibc 库中的动态连接器。(动态库
          • 如果 armHelloWord 程序是 动态链接 程序,该动态链接器会去加载共享库,并完成共享库和程序的链接工作, 然后准备真正开始执行hell程序。
          • 如果 armHelloWord 程序是 静态链接 程序,则无需再加载链接共享库,直接开始准备执行 armHelloWord 程序。
        2. 程序的真正入口 _start
          • 该符号在glibc中
        3. 执行用户程序前进行一些初始化 __libc_start_main()
          • 该符号也是glibc中的函数
        4. 调用用户程序中的 mian() 函数,开始执行 printf 打印函数。
        5. 程序执行完了之后,调用glibc库中的 _exit() 函数,来结束当前进程。

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.
");
    return 0;
}

学习参考

  • 野火
原文地址:https://www.cnblogs.com/lizhuming/p/13976680.html