使用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
段.你要怎么做?