标签: elf

如何知道 ELF 需要哪些动态库?

是否有任何工具可以读取头文件来打印 Linux 可执行文件运行所需的动态库的名称?

我需要它知道我刚刚从源代码(它是 GDB 的 Python 分支)构建的二进制文件中是否有一些奇怪的依赖项(即不是很标准),或者它主要是静态链接的。我认为这比阅读 makefile 更容易......

dll header elf

3
推荐指数
2
解决办法
2610
查看次数

ELF文件格式

我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:

  • 写一个c ++程序
  • 使用mipseb-linux-g ++(交叉编译器)编译它
  • hex将所有部分转储到自己的文件中
  • 读取文件并将内容加载到处理器"内存"中
  • 运行程序

我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?

c++ compiler-construction simulation elf spim

3
推荐指数
1
解决办法
5184
查看次数

共享库如何获取自己的基地址

我有所有符号的偏移地址(通过 libelf 在其自己的二进制文件 .so 上执行获得)。现在,在运行时,我需要计算所有这些符号的绝对地址,为此我需要获取基地址(加载共享库的位置)并进行计算:

symbol_address = base_address + symbol_offset

共享库如何获得自己的基地址?在 Windows 上,我会使用传递给 DllMain 的参数,在 linux 中是否有一些等价物?

gcc symbols shared-libraries elf dynamic-linking

3
推荐指数
1
解决办法
3646
查看次数

可用的 ELF 可执行文件需要哪些部分?

我正在创建一个 ELF 可执行文件,我需要知道操作系统需要哪些部分才能加载和执行它。

细节:

操作系统:Ubuntu 10.04(64 位)
内核版本:2.6.32-24
架构:i386

我意识到以下可能是必要的:

  • 。文本
  • .symtab
  • .rel.text

还有其他人吗?

elf executable-format sections

3
推荐指数
1
解决办法
1151
查看次数

FreeBSD和Linux中的ELF文件结构

在PE(对于Windows)中,可以通过读取该结构的标题/部分,#include<windows.h>并且可以使用该结构PIMAGE_DOS_HEADER来读取任何PE文件中的dos标头.

我如何在FreeBSD/Linux中为ELF头做到这一点?需要在C/C++代码的头部添加什么样的预处理器?根据ELF的结构,FreeBSD和Linux有什么区别吗?

c++ linux freebsd elf

3
推荐指数
1
解决办法
1223
查看次数

将整个 ELF 二进制文件转储到可读的标题和部分中

是否可以将 ELF-ARM 文件的整个二进制结构转储为可读格式。想法是分析每个部分并将其保存回二进制文件。

binary analysis dump elf

3
推荐指数
1
解决办法
8500
查看次数

使用ELF文件

我需要在我的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?我的意思是,不是纯字节,而是我可以使用的东西.

c linux elf

3
推荐指数
1
解决办法
801
查看次数

没有使用二进制文件的 elf RUNPATH 中存在的库?

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 …

linux gcc rpath elf

3
推荐指数
1
解决办法
3023
查看次数

Linux - 无法执行二进制文件

我知道这个问题已经被问了很多,但问题仍然是我:

我有一个 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 …

linux elf

3
推荐指数
1
解决办法
1万
查看次数

VMA和ELF细分之间的关​​系

我需要为可加载的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,而不将其加载到内存中.所以这方面的任何指针/帮助都是这篇文章的主要目标.

c unix memory elf execution

3
推荐指数
1
解决办法
1037
查看次数