繁体   English   中英

cryoPID如何创建ELF标头,或者有简单的方法生成ELF?

[英]How does cryoPID create ELF headers or is there an easy way for ELF generation?

我正在尝试在C语言中执行检查点/重新启动程序,并且正在研究cryoPID的代码,以了解如何重新启动进程。 在代码中,cryoPID创建了要在使用某些全局变量的函数中重新启动的进程的ELF标头,这确实令人困惑。

我一直在寻找一种简单的方法来创建ELF可执行文件,甚至尝试使用libelf,但我发现大多数时候这些程序的文档中有些必要的信息是含糊的,我无法理解该怎么做。 因此,在这方面的任何帮助都将是巨大的。

看到cryoPID的代码,我看到它以一种简单的方式完成了整个创建过程,而不必设置所有标头字段,等等。但是我似乎无法理解它使用的代码。 首先,在创建ELF的函数中,以下代码是相关的(在arch-x86_64 / elfwriter.c中):

Elf64_Ehdr *e;
Elf64_Shdr *s;
Elf64_Phdr *p;
char* strtab;
int i, j;
int got_it;
unsigned long cur_brk = 0;
e = (Elf64_Ehdr*)stub_start;

assert(e->e_shoff != 0);
assert(e->e_shentsize == sizeof(Elf64_Shdr));
assert(e->e_shstrndx != SHN_UNDEF);

s = (Elf64_Shdr*)(stub_start+(e->e_shoff+(e->e_shstrndx*e->e_shentsize)));
strtab = stub_start+s->sh_offset;

stub_start是在cryopid.h中由宏clarify_writer定义的全局变量:

#define declare_writer(s, x, desc) \
    extern char *_binary_stub_##s##_start; \
    extern int _binary_stub_##s##_size; \
    struct stream_ops *stream_ops = &x; \
    char *stub_start = (char*)&_binary_stub_##s##_start; \
    long stub_size = (long)&_binary_stub_##s##_size

在writer _ *。c中使用此宏,这些文件是实现文件编写器的文件。 例如,在writer_buffered.c中,使用以下代码调用宏:

struct stream_ops buf_ops = {
    .init = buf_init,
    .read = buf_read,
    .write = buf_write,
    .finish = buf_finish,
    .ftell = buf_ftell,
    .dup2 = buf_dup2,
};
declare_writer(buffered, buf_ops, "Writes an output file with buffering");

因此,将stub_start声明为未初始化的全局变量(上面的代码不在任何函数中),并且看到在clarify_writer中的所有变量均未在代码的任何其他部分设置,因此我假设stub_start只是指向的一部分。 bss部分,但似乎cryoPID就像指向自己的ELF标头一样使用它。

任何人都可以帮助我解决此问题,或以任何方式帮助我轻松创建ELF标头吗?

如评论中所述,它使用类似于objcopy的方式来设置这些变量(它不使用objcopy命令,但我认为可能是“设置”变量的自定义链接器)。 不能完全找到什么,但是我可以通过mmap'先前编译的可执行文件并使用该映射设置变量stub_start和stub_size来重现此行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM