【linux】helloword原理分析及實戰

李柱明發表於2020-11-15


前言

  • 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;
}

學習參考

  • 野火

相關文章