Gcc
“LSB 執行檔”(ET_EXEC)和“LSB 共享對象”(ET_DYN)有什麼區別?
有兩個文件,一個編譯並連結,
gcc
另一個手動使用nasm
,ld
我得到
- ELF 32 位 LSB 共享對象…
- ELF 32 位 LSB 執行檔…
這兩件事有什麼區別?我可以看到
readelf -h
那個是
- 類型:
DYN (Shared object file)
- 類型:
EXEC (Executable file)
我可以在Wikipedia
ET_DYN``ET_EXEC
上看到這些記錄為和. 這兩者之間有什麼實際區別?
這似乎與位置無關執行檔(PIE)有關。當 GCC 預設編譯執行檔時,它會使它們成為 PIE,從而將 ELF Header 上的輸出標誌更改為
ET_DYN
.您可以使用禁用 PIE 執行檔的生成
gcc -no-pie
如果您看到此檢查 gcc 配置的預設選項
gcc -v
,您應該會看到類似--enable-default-pie
.*受StackOverflow 上的此送出啟發的答案。*我打算更多地使用它並在這裡解釋更多。
似乎 ET_EXEC 與 ET_DYN 在 Linux 核心/動態載入程序中的主要作用是通知執行檔是否可以使用 ASLR 放置在隨機記憶體位置。
正如您當時得出的結論,PIE 執行檔是 DYN,因為它們可以隨機化,就像共享庫一樣。
我對此進行了更詳細的探索,並且: