1. 程式人生 > >【linux】helloword原理分析及實戰

【linux】helloword原理分析及實戰

[toc] --- ## 前言 * **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 原始碼很簡單 ```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 int main(void) { printf("hello word! This is a first program.\n"); return 0; } ``` * [Makefile 原始碼參考](https://www.cnblogs.com/lizhuming/p/13956017.html) * 效果圖 * ![](https://img2020.cnblogs.com/blog/2085252/202011/2085252-20201115142744281-1859960474.png) * [工程原始碼-gitee](https://gitee.com/lidreaming/demo_code_for_mystudy/tree/master/linux/helloword) ## 學習參考 *