Я пытаюсь создать контрольную точку / перезапустить программу на 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 - это глобальная переменная, определенная с помощью макроса Declare_writer в cryopid.h:
#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 объявляется как неинициализированная глобальная переменная (приведенный выше код отсутствует в любой функции) и видит, что все переменные вDelere_writer не задан ни в какой другой части кода, я предполагаю, что stub_start просто указывает на некоторую часть раздела .bss, но кажется, что cryoPID использует его так, как будто он указывает на собственный заголовок ELF.
МожетКто-нибудь поможет мне с этой проблемой или поможет мне в любом случае легко создавать заголовки ELF?