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:
parent
e41ed29bce
commit
cb415fd61e
31
dump/dump.c
31
dump/dump.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user