是否有任何工具可以读取头文件来打印 Linux 可执行文件运行所需的动态库的名称?
我需要它知道我刚刚从源代码(它是 GDB 的 Python 分支)构建的二进制文件中是否有一些奇怪的依赖项(即不是很标准),或者它主要是静态链接的。我认为这比阅读 makefile 更容易......
我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text和.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:
我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?
我有所有符号的偏移地址(通过 libelf 在其自己的二进制文件 .so 上执行获得)。现在,在运行时,我需要计算所有这些符号的绝对地址,为此我需要获取基地址(加载共享库的位置)并进行计算:
symbol_address = base_address + symbol_offset
共享库如何获得自己的基地址?在 Windows 上,我会使用传递给 DllMain 的参数,在 linux 中是否有一些等价物?
我正在创建一个 ELF 可执行文件,我需要知道操作系统需要哪些部分才能加载和执行它。
细节:
操作系统:Ubuntu 10.04(64 位) 内核版本:2.6.32-24 架构:i386
我意识到以下可能是必要的:
还有其他人吗?
在PE(对于Windows)中,可以通过读取该结构的标题/部分,#include<windows.h>并且可以使用该结构PIMAGE_DOS_HEADER来读取任何PE文件中的dos标头.
我如何在FreeBSD/Linux中为ELF头做到这一点?需要在C/C++代码的头部添加什么样的预处理器?根据ELF的结构,FreeBSD和Linux有什么区别吗?
是否可以将 ELF-ARM 文件的整个二进制结构转储为可读格式。想法是分析每个部分并将其保存回二进制文件。
我需要在我的C程序中使用简单的ELF文件.我不能使用任何外部库,但我可以使用elf.h.
让我们把hello.o文件作为源代码:
int Hello() { return 3; }
Run Code Online (Sandbox Code Playgroud)
我怎样才能访问Hello只有hello.o文件的ohter C程序?
我应该把它加载到内存中使用mmap或者像这样.最后我需要使用更复杂的ELF文件,但我现在不知道,如何开始.
更新:我需要按照我描述的方式执行此操作,因为它是出于学习目的.整个问题比我描述的更复杂.
对于这个问题假设我需要编写方法:
int HelloFromElfO(const char* helloFile);
Run Code Online (Sandbox Code Playgroud)
这将执行Hello在中实现的功能helloFile.
我不想要完整的答案.我不需要任何代码.我需要一些东西开始.
我有关于ELF文件结构的基本知识,但我不知道如何在没有任何解析器的情况下使用二进制文件在C中工作或者像这样.
UPDATE2:好的,像readelf这样的应用程序非常复杂.所以也许我尝试这种方式:再说一遍,我已经hello.o映射到内存了ptr.如何获得指向Hello函数的指针?
如何从中获取任何结构化数据hello.o?我的意思是,不是纯字节,而是我可以使用的东西.
我gcc-4.7.2在我的环境中定制了。系统 gcc 是gcc-4.3.4.
我已经为所有自定义 gcc 的二进制文件和共享库修补了RUNPATH使用patchelf --set-rpath
但是,当我ldd在 4.7.2 上运行时,cc1它会选择系统libstdc++而不是RUNPATH指向的系统:
$ ldd /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1
libcloog-isl.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib/libcloog-isl.so.1 (0x00007f072dce8000)
...
libc.so.6 => /lib64/libc.so.6 (0x00007f072bfe0000)
--> libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f072bcd5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f072babe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f072df0d000)
Run Code Online (Sandbox Code Playgroud)
可以看出RUNPATH指定了gcc-4.7.2库位置:
$ readelf -a /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1 | grep PATH
0x000000000000001d (RUNPATH) Library runpath: \
[/sdk/x86_64/2.11.1/gcc-4.7.2/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib: \
/sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib/gcc/x86_64-suse-linux/4.7.2: \
/hostname/sig/lib64: \
/hostname/sig/lib]
Run Code Online (Sandbox Code Playgroud)
我知道libstdc++.so.6存在于RUNPATH …
我知道这个问题已经被问了很多,但问题仍然是我:
我有一个 64 位 ELF 可执行文件,我试图在我的 Kali VM 上运行它,但它一直告诉我该文件不存在。
这个问题大部分时候的解决办法是架构不同,但是我的kali是x86-64:
$ uname -m
x86_64
Run Code Online (Sandbox Code Playgroud)
就像我试图执行的文件(名为“8”)一样:
file 8
8: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, BuildID[sha1]=0xf3b096c69086131b091d1805894fde4fae0537a0, stripped
Run Code Online (Sandbox Code Playgroud)
编辑:错误:
$ chmod +x 8
$ ./8
bash: ./8: No such file or directory
Run Code Online (Sandbox Code Playgroud)
编辑2:lld:
linux-vdso.so.1 => (0x00007fffe37fe000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f680fac8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f680f73c000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f680f343000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f680f13f000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f680ef28000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f680fd49000)
Run Code Online (Sandbox Code Playgroud)
我尝试安装 32 …
我需要为可加载的ELF可执行文件段确定VMA.VMA可以打印出来/proc/pid/maps.maps使用可加载段显示的VMA之间的关系对我来说也很清楚.每个部分由一个或多个VMA组成.内核用于从ELF段形成VMA的方法是什么:它还需要考虑权限/标志或其他什么?根据我的理解,带有标志Read, Execute(代码)的段将进入具有相同权限的单独VMA.而具有权限读取,写入(数据)的下一个段应该在另一个VMA中.但这不是第二个可加载段的情况,它通常分为两个或多个VMA:一些与read and write其他VMA分开read only.所以我认为旗帜是VMA生成的唯一罪魁祸首似乎是错误的.我需要帮助来理解段和VMA之间的这种关系.
我想要做的是以编程方式确定ELF的可加载段的VMA,而不将其加载到内存中.所以这方面的任何指针/帮助都是这篇文章的主要目标.