标签: elf

如何动态加载可重定位的ELF可执行文件?

我试图为ARM平台编写elf可执行加载程序.我在这里有一些查询

1)如何生成可重定位或位置无关的ELF可执行文件(编译器和链接器选项是什么)2)如何加载上面生成的ELF可执行文件.

作为astart,我做了一些工作,它工作正常.我正在使用RO_Base的固定地址,而不是在构建时拆分段(不使用任何--split选项),这样我就可以获得连续的代码,数据和bss部分.在此之后,我将elf加载到与RO_Base相同的地址并将代码作为新线程执行.这工作正常.我没有做任何重新安置等......

现在我想通过生成可重定位的ELF并将Loader修改为适当的更改来使其动态化并能够加载到任何地址.请帮助我使它工作.

谢谢,

elf

5
推荐指数
1
解决办法
3007
查看次数

访问附加到ELF二进制文件的数据

我有一个静态ELF二进制文件,它从zip文件中读取数据.为了简化分发,我想将zipfile附加到二进制文件,如下所示:

$ cat mydata.zip >> mybinary
Run Code Online (Sandbox Code Playgroud)

我知道这样做不会损害mybinary,但我不知道如何访问mydata.zip的内容.可能吗?如果是这样,怎么样?

在过去,我使用了附加数据然后附加数据长度的技巧,因此我所要做的就是打开二进制文件,读取流的最后一个int,回退那个长度然后开始解压缩,但是由于各种原因在这里不起作用(例如,我不能保证当需要zipfile时文件仍然在光盘上).

如果解决方案适用于OS X和MinGW,那么全面超级双倍加分.

linux gcc build elf

5
推荐指数
1
解决办法
1066
查看次数

.so文件的前832个字节中有哪些信息?

我看到很多类似的东西:

open("/lib64/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260W \0242\0\0\0"..., 832) = 832
Run Code Online (Sandbox Code Playgroud)

开头832字节有什么?

elf strace

5
推荐指数
1
解决办法
289
查看次数

导入ELF二进制文件中的名称

ELF格式在哪里存储导入函数的名称?是否始终可以枚举所有导入名称,例如PE可执行文件?

例如,如果二进制正在使用printf它是否可以告诉它,只是通过静态分析二进制本身?

linux import file-format dllimport elf

5
推荐指数
1
解决办法
2382
查看次数

如何覆盖 Linux 下 elf 可执行文件的 .interp 标头中指定的链接器?

我有一个交叉编译器,它在其 .interp 标头中指定了一个自定义加载器:

objdump -s beaglebone/x86_64-angstromsdk-linux/usr/bin/armv7a-angstrom-linux-gnueabi/arm-angstrom-linux-gnueabi-g++ | head

beaglebone/x86_64-angstromsdk-linux/usr/bin/armv7a-angstrom-linux-gnueabi/arm-angstrom-linux-gnueabi-g++:     file format elf64-x86-64

Contents of section .interp:
 400200 2f757372 2f6c6f63 616c2f6f 65636f72  /usr/local/oecor
 400210 652d7838 365f3634 2f737973 726f6f74  e-x86_64/sysroot
 400220 732f7838 365f3634 2d616e67 7374726f  s/x86_64-angstro
 400230 6d73646b 2d6c696e 75782f6c 69622f6c  msdk-linux/lib/l
 400240 642d6c69 6e75782d 7838362d 36342e73  d-linux-x86-64.s
 400250 6f2e3200                             o.2.            
Run Code Online (Sandbox Code Playgroud)

我希望能够在不将其安装到系统位置的情况下使用该二进制文件。是否可以覆盖 .interp 标头中指定的加载程序并指示 Linux 使用系统加载程序 ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2)?运行arm-angstrom-linux-gnueabi-g++/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2手动工作在一定程度上,虽然它没有高管的支持计划。

linux elf cross-compiling dynamic-linking

5
推荐指数
1
解决办法
1934
查看次数

精灵进出口

我知道我们有.dynsym.symtab,我如何区分导入和导出,就像在 Windows 中的 pe 中一样,导入和导出在数据目录中,它和 elf 中的等效吗?

shared-libraries elf

5
推荐指数
1
解决办法
2147
查看次数

从elf文件的DYNAMIC部分删除条目

我有第三方库一个,那需要一些库. A链接到binrary,它与静态版本B链接.因此,不再需要B的动态版本.

A不在我的控制之下,我无法重新编译它.因此,我想删除A的DYNAMIC部分的NEEDED libA条目.

有没有办法用objcopy或其他工具做到这一点?

linux linker gcc elf static-linking

5
推荐指数
1
解决办法
1467
查看次数

标准方式签署(并验证)ELF文件?

我想签署ELF文件,最好使用PGP密钥,然后才能验证签名.如果失败了我还会使用Authenticode或SSL证书进行签名,如果这更有意义的话.现有的选项,例如signelf,似乎只能在copyleft许可下使用(即使它是LGPL,但它施加了限制,阻止我使用它)或旧/未维护.

我可以在专有程序中使用哪些选项?

注意:我们可以将问题的范围限制为Linux,即使ELF不是特定于Linux.

即使在自由(非copyleft)FLOSS许可下没有准备好使用程序和/或库,我也会感谢指向标准化文档,以防出现某种事实上的标准.我不知道一个,但那就是我问的原因.


从我看到的所有发行版似乎依赖签署并验证这些.总的来说这很好,但我想更进一步.

linux code-signing elf digital-signature

5
推荐指数
0
解决办法
2056
查看次数

怎么把ELF文件转换成二进制文件?

我的理解是,二进制文件是处理器指令的十六进制代码(可以加载到内存中并从入口点开始执行),而ELF文件与为数据等分配的未固定内存地址相同。 。

现在,如何将ELF转换为二进制文件?

转换如何进行?我的意思是内存地址是如何分配的?

elf

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

gcc/clang如何假设字符串常量的地址是32位?

如果我编译这个程序:

#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于x86-64,asm输出使用movl $.LC0, %edi/ call puts.(请参阅godbolt上的完整asm输出/编译选项.)

我的问题是:GCC如何知道字符串的地址可以适合32位立即数操作数?为什么不需要使用movabs $.LC0, %rdi(即a mov r64, imm64,不是零或符号扩展imm32).

AFAIK,没有任何迹象表明加载器必须决定在任何特定地址加载数据部分.如果字符串存储在上面的某个地址,1ULL << 32那么movl将忽略更高的位.我对clang有类似的行为,所以我不认为这是GCC独有的.


我关心的原因是我想创建自己的数据段,它存在于我选择的任意地址(可能超过2 ^ 32)的内存中.

c linux linker x86-64 elf

5
推荐指数
1
解决办法
303
查看次数