multiboot1: also fix elf32 section loading
As with the prior mb2 fix, use the correct size elf section header for 32 bit elf
This commit is contained in:
parent
fdcb9a9243
commit
e0c3e6bdce
|
@ -212,7 +212,10 @@ noreturn void multiboot1_load(char *config, char *cmdline) {
|
|||
|
||||
memcpy(sections, kernel + section_hdr_info.section_offset, section_hdr_info.section_entry_size * section_hdr_info.num);
|
||||
|
||||
int bits = elf_bits(kernel);
|
||||
|
||||
for (size_t i = 0; i < section_hdr_info.num; i++) {
|
||||
if (bits == 64) {
|
||||
struct elf64_shdr *shdr = (void *)sections + i * section_hdr_info.section_entry_size;
|
||||
|
||||
if (shdr->sh_addr != 0 || shdr->sh_size == 0) {
|
||||
|
@ -228,6 +231,23 @@ noreturn void multiboot1_load(char *config, char *cmdline) {
|
|||
}
|
||||
|
||||
shdr->sh_addr = section;
|
||||
} else {
|
||||
struct elf32_shdr *shdr = (void *)sections + i * section_hdr_info.section_entry_size;
|
||||
|
||||
if (shdr->sh_addr != 0 || shdr->sh_size == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uint64_t section = (uint64_t)-1; /* no target preference, use top */
|
||||
|
||||
if (!elsewhere_append(true /* flexible target */,
|
||||
ranges, &ranges_count,
|
||||
kernel + shdr->sh_offset, §ion, shdr->sh_size)) {
|
||||
panic(true, "multiboot1: Cannot allocate elf sections");
|
||||
}
|
||||
|
||||
shdr->sh_addr = section;
|
||||
}
|
||||
}
|
||||
|
||||
multiboot1_info->flags |= (1 << 5);
|
||||
|
|
Loading…
Reference in New Issue