为什么我的简单的 "main "程序的ELF头说是 "DYN(共享对象文件)"而不是可执行文件?[重复]

问题描述 投票:0回答:1

这里有一个 简单的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头部:

❯ 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)

来自维基百科 此处貌似有不同类型的文件,如 EXEC. 为什么说我的简单主程序是一个共享对象,而不是ELF头的可执行文件?

根据我有限的知识范围,我对 .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
c++ g++ elf readelf
1个回答
5
投票

可执行文件,这些可执行文件被编译成 "位置独立的可执行文件"(用 -pie-fPIE)应该在运行时被重新定位到一个随机地址。为了达到这个目的,他们使用了DYN类型。

您的g++版本被配置为 --enable-default-pie因此,它设置 -pie-fPIE 默认情况下。您可以禁用这个功能,并生成一个正常的可执行文件,通过链接到 -no-pie.

© www.soinside.com 2019 - 2024. All rights reserved.