Linux內核如何裝載和啓動一個可執行程序

摘要: mqy + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000shell

可執行文件的格式
  在 Linux 平臺下主要有如下三種可執行文件格式:
  一、a.out(assembler and link editor output 彙編器和連接編輯器的輸出)
  二、COFF(Common Object File Format 通用對象文件格式)
  三、ELF(Executable and Linking Format 可執行和連接格式)。
  在本課程中,主要介紹的是ELF文件。ELF 文件又分爲三種類型:共享目標文件(庫文件,後綴爲.so)、可執行文件、可重定位文件(目標文件,後綴爲.o)。
可執行文件的建立過程
  從 C/C++ 源文件生成一個可被系統加載和啓動的可執行文件,須要通過預處理、編譯和連接這幾個過程。
  預處理:把include 的文件包含進來,進行宏替換等。
  編譯:編譯器將預處理文件編譯成彙編代碼;彙編器將彙編代碼編譯成目標代碼
  連接:將目標代碼連接爲可執行文件。根據連接方式的不一樣,可分爲靜態連接與動態連接。動態連接又可分爲可執行程序裝載時動態連接與運行時動態連接。

  預處理:加入頭文件執行宏替換等操做 gcc -E hello.c -o hello.i編輯器

  編譯:檢查無誤後轉爲彙編語言 gcc –S hello.i –o hello.s函數

  彙編:轉爲二進制 gcc –c hello.s –o hello.opost

  連接:生成可執行文件 gcc hello.o –o hellospa

  一步完成的命令爲:gcc hello.c -o hello 命令行

  elf文件分爲可重定位文件、可執行文件、共享文件等調試

    查看elf文件的文件頭能夠用readelform

    程序的入口地址是0x8048000對象

可執行文件(ELF文件)的裝載與啓動過程
  一個可執行文件是由 shell 程序啓動的。在 shell 環境下,用戶輸入可執行程序名及其參數後,shell 程序會調用 execve 將命令行參數和環境參數傳遞給可執行程序的main函數。經過如下層層調用,最終完成可執行程序的啓動過程:
do_execve-->do_execve_common-->exec_binprm-->search_binary_handler-->load_elf_binary-->start_thread

實驗:blog

gdb跟蹤內核函數sys_execve處理過程

內核準備

執行exec

gdb調試

 

執行結果

單步運行,能夠看到do_execv函數

執行到start_thread查看入口地址

與readelf的結果一致

相關文章
相關標籤/搜索