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
段。一个人会怎样做呢?
我的目的是在运行时按名称搜索部分,找到以程序为前缀的部分。并计算指向它们的指针,以便我的代码可以像普通内存块一样使用它们。
您可以在磁盘上找到
program
(使用/proc/self/exe
),mmap
它1,解码节标题(参见这个答案),然后计算指向感兴趣节的指针并根据需要使用它们。
这些部分可以以某种方式放置在 PT_LOAD 段中吗?
否:这将需要重建可执行文件的部分内容,而如果不重新链接整个程序,则无法重建这些部分。
1 您不必
mmap
整个program
,只需其中包含所需部分的部分即可。