Gcc

“LSB 執行檔”(ET_EXEC)和“LSB 共享對象”(ET_DYN)有什麼區別?

  • April 16, 2019

有兩個文件,一個編譯並連結,gcc另一個手動使用nasmld我得到

  • ELF 32 位 LSB 共享對象…
  • ELF 32 位 LSB 執行檔…

這兩件事有什麼區別?我可以看到readelf -h那個是

  • 類型:DYN (Shared object file)
  • 類型:EXEC (Executable file)

我可以在WikipediaET_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,因為它們可以隨機化,就像共享庫一樣。

我對此進行了更詳細的探索,並且:

引用自:https://unix.stackexchange.com/questions/472449