縱剖執行檔結構 Towards an Anatomy of Executables - Frank Lin

本講題簡介 executable 是怎麼經過 toolchain 生成,簡介 ELF 格式,static linking 以及 dynamic linking。如果你平常都是透過 gcc a.c來編譯檔案,卻不太了解 a.c 是怎麼變成 a.out 的話,這是一個你可以來了解的過程。

目標聽眾

Linux 程式開發入門者

先備知識

Basic linux and c programming

歡迎大家來到SITCON 2021 ヽ(✿゚▽゚)ノ
共筆入口:https://hackmd.io/@SITCON/2021
手機版請點選上方 按鈕展開議程列表。

請從這裡開始

LABS

git clone https://github.com/NTHU-SC/linking-labs git checkout sitcon2021

今天會講 Hello World 資料夾的東西

readelf

  • -S : Section 資訊
    • 類似寫小說的章節概念 (一個Linking段落)
    • 可以用 dd 切出
  • -s : Symbol 資訊
  • -sW

產生過程

  • PREPROCESSING -> COMPILE -> ASSEMBLE -> LINKING
  • gcc --verbose 可觀察

PREPROCESSING

  • -D : define symbol
  • -I : header 資料夾指定

COMPILER

  • -Wall
  • -O : 最佳化
    • -O1
    • -O2
    • -O3
    • -Ofast(可能會出錯)
  • for linking:
    • -fPIC
    • -shared
    • -static

LINKING

  • Static Linking
    • 打包object file到library
    • .a
  • Dynamic Linking
    • 用到程式才去解析 symbol 在哪裡
    • useful tools
      • ldd
      • ldconfig -v

LAB - Super Calculator

不同語言只要能變成 object file 就能產生 symbol。

  • C 接到 C++
    • extern "C" 比較好
    • 暴力處理 C++ mangling
      • _Z prefix for C++ 等
    • 可以直接在寫程式時直接引用
  • Fortran
    • _gfortran

提問

  • 如何在這個議題上自我精進 / 更加深入
    • 可以看《程式設計師的自我修養 - 連結、載入、程式庫》
  • Debug symbol 是什麼?
    • 保留原始程式碼在一般編譯過程中損失的訊息
    • gcc 加上 -g 參數來保留 / 加入 debug symbol
    • 沒有的話,gdb 等除錯器難以輸出可以辨識/偵錯的訊息
      • 給你 offset 之類的訊息
      • 看不懂
    • 有的話,可以在除錯器中輸出錯誤位置 (第幾行,哪個檔案)
      • 還可以印出變數
  • 如何實現用相對路徑載入共享程式庫
    • LD_LIBRARY_PATH
      • 指定 library 尋找路徑 (path)
    • LD_PRELOAD
      • 覆蓋 dynamic library 載入順序
      • 強迫優先載入某個 library
Select a repo