天天看點

【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

野火