如何读取嵌入到程序自身ELF中的数据?

问题描述 投票:0回答:1

objcopy
工具可以轻松地将任意文件嵌入到 ELF 可执行文件中:

objcopy --add-section program.file1=file1.dat \
        --add-section program.file2=file2.dat \
        program program+files

在我看来,

program+files
应该可以以编程方式访问
file1
file2
,而无需打开和读取任何外部文件。然而,似乎没有简单的方法可以从正在运行的程序中获取此信息。

这些文件被添加为 ELF 可执行文件的命名部分。然而,Linux只加载ELF程序头表描述的段。这些部分永远不会出现在该集中,因为它们对于执行来说不是必需的。

因此,虽然可以获得指向当前正在运行的程序的 ELF 标头的指针,但这是毫无意义的,因为这些部分根本没有加载。

uintptr_t address = getauxval(AT_PHDR) & -4096;
Elf64_Ehdr *elf = (Elf64_Ehdr *) address;

// dangling pointer, sections aren't loaded by the OS
Elf64_Shdr *sections = ((unsigned char *) elf) + elf->e_shoff;

我的目的是在运行时按名称搜索这些部分,找到以

program.
为前缀的部分并计算指向它们的指针,以便我的代码可以像普通内存块一样使用它们。

我无法为此使用预定义符号,因为我想支持任意数量的嵌入文件,包括根本没有嵌入文件。我需要在运行时查找这些部分。

Linux 将仅加载标有

PT_LOAD
的段。这些部分可以以某种方式放置在
PT_LOAD
段中吗?
objcopy
似乎没有能力编辑程序头表和添加新的
PT_LOAD
段。一个人会怎样做呢?

c linux linker elf embedded-resource
1个回答
0
投票

我的目的是在运行时按名称搜索部分,找到以程序为前缀的部分。并计算指向它们的指针,以便我的代码可以像普通内存块一样使用它们。

您可以在磁盘上找到

program
(使用
/proc/self/exe
),
mmap
1,解码节标题(参见这个答案),然后计算指向感兴趣节的指针并根据需要使用它们。

这些部分可以以某种方式放置在 PT_LOAD 段中吗?

否:这将需要重建可执行文件的部分内容,而如果不重新链接整个程序,则无法重建这些部分。


1 您不必

mmap
整个
program
,只需其中包含所需部分的部分即可。

© www.soinside.com 2019 - 2024. All rights reserved.