前言
-
musl 是一個輕量級的標準C庫,建立在系統調用之上,可以認為是【用戶態】的C 庫,與 glibc 或者 uClibc 屬于同一類。
-
基于 musl 的 gcc 工具鏈包括交叉編譯工具鏈,可以用于編譯 Linux 或者其他的操作系統,如當前 Lite-OS、RT-Smart 上都采用 musl gcc 作為編譯工具鏈,使用 musl libc作為用戶態應用的C 庫。
-
musl 基于 MIT 授權,開源、輕量、免費,估計越來越多的操作系統開始采用 musl 作為標準C庫
-
最近也一直在研究 musl libc 的 ldso,也就是動態加載功能,musl 的 動態加載功能集成在 musl libc.so 中。
elf 格式文件
-
musl 本身集成了 動態加載 功能 ldso,初步看了代碼,發現支持 elf 格式的動態編譯的應用程序加載。
-
使用 musl gcc 工具鏈(交叉編譯工具鏈)編譯的應用程序,可以通過
readelf -l xxx.elf
,查看 elf 文件的是否存在動態鏈接信息,如果包含則需要使用 musl ldso 對依賴的共享庫進行加載 -
示例: 查看一個動態鏈接的應用程序是否存在 【解釋器段】信息:
INTERP
類型的
命令:aarch64-linux-musleabi-readelf.exe -l glib_gio_test_s.elf
或者 readelf.exe -l glib_gio_test_s.elf
發現 存在 INTERP
段信息, [Requesting program interpreter: /lib/ld-musl-aarch64.so.1]
查看 elf 文件依賴的共享庫
- 靜態編譯的 elf,沒有 動態鏈接信息,也不依賴 共享庫,而動態編譯鏈接的 elf 文件,存在動態鏈接信息,通過
aarch64-linux-musleabi-readelf.exe -d glib_gio_test_s.elf
或者readelf.exe -d glib_gio_test_s.elf
,可以查看依賴的共享庫
查看 elf 的頭部信息
- 使用
aarch64-linux-musleabi-readelf.exe -h glib_gio_test_s.elf
或者readelf.exe -h glib_gio_test_s.elf
可以查看應用程序 elf 的頭部信息,如獲取 入口函數地址等
查看 elf 符號信息
- 所謂 elf 符號,就是一些變量名、函數名、數組等,依舊可以通過
readelf
來查看
aarch64-linux-musleabi-readelf.exe -s glib_gio_test_s.elf
或者 readelf.exe -s glib_gio_test_s.elf
,注意由于有些 應用程序 elf 文件的符號特別多,所以可以輸出到一個文本文件,然后使用文件查看工具進行查看
aarch64-linux-musleabi-readelf.exe -s glib_gio_test_s.elf > sym_01.s
,這里 把符號導出到 sym_01.s
文件,然后用文本查看工具打開查看
elf 查看工具
-
以上是 elf 文件 通過
readelf
進行查看,那么還有其他的工具可以查看 elf 文件嗎? -
推薦使用 :
EmEditor
二進制查看工具,可以查看、搜索、編輯二進制文件, elf 文件其實也是二進制文件。
-
推薦使用 Die,大名鼎鼎的 Detect It Easy 工具進行 elf 文件的解析查看,可以二進制查看、反匯編、查看 各個段、節等信息
-
使用 die 打開一個 elf 文件
- 使用 die 查看 elf 文件信息: elf 頭部
小結
-
本篇主要記錄 elf 文件的查看,初步了解一下 要動態加載的 文件,也就是 研究動態加載之前,一定要熟悉 elf 格式的文件,文件組成、文件頭部、文件 Program Header,文件的各個段,文件的 節,動態加載需要加載 elf 文件的哪些內容
-
當前了解到, 一個 elf 文件 只有一個 頭部、有一個或者多個 Program Header,一個 Program Header 的大小是固定的,也就是一個結構體,里面的內容描述一個 段Segment 信息, 一個 elf 文件有多少個 Program Header? 這個需要通過解析 elf 文件的 頭部: elf Header 獲取到
-
建議查看 elf 的標準規范,熟悉 elf ,熟悉 elf 組成、加載機制,這樣對后面研究動態加載非常重要。