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

學習參考

  • 野火