区分共享对象和位置无关的可执行文件

时间:2013-04-30 14:37:56

标签: elf

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

2 个答案:

答案 0 :(得分:6)

  

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

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

  

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

符号可以被删除,一旦符号,你就不能告诉。

  

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

区分

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

如果您真正想要的是区分共享库和您自己构建的PIE可执行文件(而不是解决任何共享库的一般情况和< em>任何 PIE),然后检查是否存在PT_INTERPreadelf -l a.out | grep INTERP)可能是最简单的方法:PIE可执行文件保证有PT_INTERP,并且共享库通常没有它(libc.so.6是一个值得注意的例外)。

答案 1 :(得分:0)

尝试elfutils和附带的程序 eh-readelf

eh-readelf --file-header $ELFFILE

显示文件标题以及它是什么类型的文件:

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

Typ:                               DYN (Shared object file)

结合一点sed行,你应该得到你想要的结果。