dump: Write ELF section headers right after ELF header

Let's start bundling the writes of the headers and of the data so we
have a clear ordering between them. Since the ELF header uses offsets
to the headers we can freely order them.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20221017083822.43118-3-frankja@linux.ibm.com>
This commit is contained in:
Janosch Frank 2022-10-17 08:38:14 +00:00 committed by Marc-André Lureau
parent e41ed29bce
commit cb415fd61e
1 changed files with 14 additions and 17 deletions

View File

@ -583,6 +583,8 @@ static void dump_begin(DumpState *s, Error **errp)
* --------------
* | elf header |
* --------------
* | sctn_hdr |
* --------------
* | PT_NOTE |
* --------------
* | PT_LOAD |
@ -591,8 +593,6 @@ static void dump_begin(DumpState *s, Error **errp)
* --------------
* | PT_LOAD |
* --------------
* | sec_hdr |
* --------------
* | elf note |
* --------------
* | memory |
@ -608,6 +608,12 @@ static void dump_begin(DumpState *s, Error **errp)
return;
}
/* write section headers to vmcore */
write_elf_section_headers(s, errp);
if (*errp) {
return;
}
/* write PT_NOTE to vmcore */
write_elf_phdr_note(s, errp);
if (*errp) {
@ -620,12 +626,6 @@ static void dump_begin(DumpState *s, Error **errp)
return;
}
/* write section headers to vmcore */
write_elf_section_headers(s, errp);
if (*errp) {
return;
}
/* write notes to vmcore */
write_elf_notes(s, errp);
}
@ -1868,16 +1868,13 @@ static void dump_init(DumpState *s, int fd, bool has_format,
}
if (dump_is_64bit(s)) {
s->phdr_offset = sizeof(Elf64_Ehdr);
s->shdr_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
s->note_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
s->memory_offset = s->note_offset + s->note_size;
s->shdr_offset = sizeof(Elf64_Ehdr);
s->phdr_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
s->note_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num;
} else {
s->phdr_offset = sizeof(Elf32_Ehdr);
s->shdr_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
s->note_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
s->memory_offset = s->note_offset + s->note_size;
s->shdr_offset = sizeof(Elf32_Ehdr);
s->phdr_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num;
s->note_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num;
}
return;