7

我正在寻找一种快速的方法来检查 ELF 二进制文件是共享对象还是位置无关的可执行文件。我认为可以通过检查包含的符号/函数来做到这一点。我正在寻找一种无需阅读完整文件的更有效方法。我必须在不同的平台上执行检查,至少是 Android、Linux(32 位和 64 位)。

4

2 回答 2

6

我正在寻找一种快速的方法来检查 ELF 二进制文件是共享对象还是位置无关的可执行文件。

无法检查:PIE 可执行文件共享对象。

我认为可以通过检查包含的符号/函数来做到这一点。

符号可以被剥离,一旦被剥离,你就无法分辨。

共享对象和可执行文件它们通常因链接的启动代码而异

没错:PIE 通常与 链接Scrt1.o,但共享库通常不是。但是也没有什么可以阻止共享库与之链接Scrt1.o,并且在剥离的二进制文件中甚至发现启动代码可能有些问题。

如果您真正想要的是区分共享库和您自己构建的 PIE 可执行文件(而不是解决任何共享库和任何PIE 的一般情况),那么检查PT_INTERP( readelf -l a.out | grep INTERP) 的存在可能是最简单的方法:保证 PIE 可执行文件具有PT_INTERP,而共享库通常没有它(libc.so.6是一个明显的例外)。

于 2013-05-03T04:19:57.773 回答
0

试试elfutils和包含的程序eh-readelf

eh-readelf --file-header $ELFFILE

向您展示文件头和它是什么类型的文件:

...
Typ:                               EXEC (Executable file)
...

或者

Typ:                               DYN (Shared object file)

结合一条小sed线,你应该得到你想要的结果。

于 2013-04-30T14:44:42.803 回答