为什么我的简单“主”程序的 ELF header 说它是一个“DYN(共享 object 文件)”而不是可执行文件?
Why is my simple `main` program's ELF header say it's a `DYN (Shared object file)` instead of an executable?
这是一个非常简单的C++程序:
// main.cpp
int main() {}
我的Makefile
生成以下命令来编译程序。
❯ make
g++ -O0 -fverbose-asm -o main main.cpp
我用命令 file
检查它是一个 ELF 可执行文件:
❯ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=921d352e49a0e4262aece7e72418290189520782, for GNU/Linux 3.2.0, not stripped
一切似乎都很好直到我尝试检查 ELF header:
❯ readelf -e main
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
...
Type: DYN (Shared object file)
来自维基百科 here,似乎有不同类型的文件,例如 EXEC
。为什么它说我的简单主程序是共享的 object 而不是 ELF header 上的可执行文件?
根据我对 .so
的有限了解,我认为它们是链接的库,但直到运行时才加载。在这种情况下,这有什么意义?
额外信息:
❯ g++ --version
g++ (Arch Linux 9.3.0-1) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
❯ readelf --version
GNU readelf (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
❯ lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
编译为 "position independent executables"(-pie
/-fPIE
)的可执行文件应在运行时重定位到随机地址。为此,他们使用 DYN 类型。
您的 g++ 版本配置为 --enable-default-pie
,因此它默认设置 -pie
和 -fPIE
。您可以通过 -no-pie
.
链接来禁用它,并生成一个正常的可执行文件
这是一个非常简单的C++程序:
// main.cpp
int main() {}
我的Makefile
生成以下命令来编译程序。
❯ make
g++ -O0 -fverbose-asm -o main main.cpp
我用命令 file
检查它是一个 ELF 可执行文件:
❯ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=921d352e49a0e4262aece7e72418290189520782, for GNU/Linux 3.2.0, not stripped
一切似乎都很好直到我尝试检查 ELF header:
❯ readelf -e main
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
...
Type: DYN (Shared object file)
来自维基百科 here,似乎有不同类型的文件,例如 EXEC
。为什么它说我的简单主程序是共享的 object 而不是 ELF header 上的可执行文件?
根据我对 .so
的有限了解,我认为它们是链接的库,但直到运行时才加载。在这种情况下,这有什么意义?
额外信息:
❯ g++ --version
g++ (Arch Linux 9.3.0-1) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
❯ readelf --version
GNU readelf (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
❯ lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
编译为 "position independent executables"(-pie
/-fPIE
)的可执行文件应在运行时重定位到随机地址。为此,他们使用 DYN 类型。
您的 g++ 版本配置为 --enable-default-pie
,因此它默认设置 -pie
和 -fPIE
。您可以通过 -no-pie
.