ELF 可执行文件被识别为共享目标文件
本文最后更新于:13 天前
ELF 可执行文件被识别为共享目标文件
问题描述
个人项目中有一个解析 ELF 文件类型的功能,在测试过程中,错误地将可执行文件 (ET_EXEC) 识别为共享目标文件 (ET_DYN)。
如下图所示,exec_test 必然是一个可执行文件:
但是当我无论使用 readelf -h
查看 exec_test 的头部信息,还是使用 file
命令查看文件类型,都显示这是一个共享目标文件:
通过上面第一张图片中的编译指令,可以看到仅仅使用了最常规的 -g -O0 -o
选项,并没有使用额外的编译或者链接选项。
系统环境
- OS: Ubuntu 20.04.6 LTS x86_64
- Compiler: g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
ELF 文件简单介绍
一般来说,ELF 文件有 4 种:
- 可重定位文件 (ET_REL)
- 可执行文件 (ET_EXEC)
- 共享目标文件 (ET_DYN)
- 核心转储文件 (ET_CORE)
文件类型 | 描述 |
---|---|
可重定位文件 (ET_REL) | |
可执行文件 (ET_EXEC) | |
共享目标文件 (ET_DYN) | |
核心转储文件 (ET_CORE) |
也可见下图:
问题原因
在查找了资料后,得知是由于高版本 gcc/g++ 默认使用 -pie
选项,导致生成的可执行文件被识别为共享目标文件。
-pie
选项是 Position Independent Executable 的缩写,即生成位置无关可执行文件。这种可执行文件可以被加载到任意地址运行,而不需要进行地址重定位。这样可以提高程序的安全性,防止恶意程序利用地址重定位漏洞进行攻击。
解决方案
解决方法有两种:
- 使用
-no-pie
选项,禁用生成位置无关可执行文件:
1 |
|
- 使用
-fno-pie
选项,禁用生成位置无关可执行文件:
1 |
|
可以看到,在添加了 -no-pie
选项后,exec_test 被正确识别为可执行文件。
ELF 可执行文件被识别为共享目标文件
https://ccccx159.github.io/2024/04/25/ELF可执行文件被识别为共享目标文件/