首页 > 解决方案 > 确定elf文件是可执行文件还是库

问题描述

我有以下问题:我有一个 elf 文件,我想知道该 elf 文件是否可以作为独立的可执行文件运行。因此,对于共享库(例如.so文件),我希望将其False作为结果,而对于准备运行的二进制文件,我希望True将其作为输出。我试图利用file 来实现这一点,但显然给出的信息是不够的。考虑

file /usr/bin/sudo /usr/bin/sudo: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3e4fbfd5a73126630bcc22d5dee68c32e2813566, stripped

我实际上期望输出为ELF 64-bit LSB executable,例如gcc编译器:

file /usr/bin/gcc-5 /usr/bin/gcc-5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b3417f0bc306e9b0afe35e778b5e4702f2d22b26, stripped

我在这里缺少什么,还有其他方法可以实现我的目标吗?

标签: linuxelf

解决方案


我想要 False 作为结果,对于准备运行的二进制文件,我想要 True 作为输出。

一般来说,您的目标是无法实现的:可以构建一个可以运行的库(例如/lib64/libc.so.6在 Linux 上),也可以构建一个在启动时会崩溃的可执行文件,尽管报告ELF 64-bit LSB executable.

尝试运行任何二进制文件也是不明智的,除非您知道该二进制文件来自何处以及它的预期执行结果是什么。

我在这里想念什么

正如这个答案所解释的,许多最近的 Linux 发行版默认构建 PIE 可执行文件。

还有其他方法可以实现我的目标吗?

看到这个答案


推荐阅读