mirror of
https://github.com/limine-bootloader/limine
synced 2024-12-03 21:52:39 +03:00
elf: Bug fixes
This commit is contained in:
parent
e96b55a477
commit
5fa8ef5d37
@ -293,7 +293,7 @@ int elf32_load_section(uint8_t *elf, void *buffer, const char *name, size_t limi
|
|||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t elf64_min_align(uint8_t *elf, bool use_paddr) {
|
static uint64_t elf64_min_align(uint8_t *elf, bool use_paddr) {
|
||||||
uint64_t ret = 0;
|
uint64_t ret = 0xffffffffffffffff;
|
||||||
|
|
||||||
struct elf64_hdr hdr;
|
struct elf64_hdr hdr;
|
||||||
memcpy(&hdr, elf + (0), sizeof(struct elf64_hdr));
|
memcpy(&hdr, elf + (0), sizeof(struct elf64_hdr));
|
||||||
@ -315,20 +315,24 @@ static uint64_t elf64_min_align(uint8_t *elf, bool use_paddr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (load_addr % 0x200000 == 0) {
|
if (load_addr % 0x200000 == 0) {
|
||||||
ret = 0x200000;
|
if (ret > 0x200000) {
|
||||||
|
ret = 0x200000;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (load_addr % 0x1000 == 0) {
|
if (load_addr % 0x1000 == 0) {
|
||||||
ret = 0x1000;
|
if (ret > 0x1000) {
|
||||||
|
ret = 0x1000;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't do kernels that don't align their load addresses to 4K at least.
|
// We don't do kernels that don't align their load addresses to 4K at least.
|
||||||
panic("elf: The executable contains non-4KiB aligned load addresses");
|
panic("elf: The executable contains non-4KiB aligned segments");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0xffffffffffffffff) {
|
||||||
panic("elf: Executable has no loadable segments");
|
panic("elf: Executable has no loadable segments");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +415,10 @@ int elf64_load(uint8_t *elf, uint64_t *entry_point, uint64_t *top, uint64_t *_sl
|
|||||||
uint64_t entry = hdr.entry;
|
uint64_t entry = hdr.entry;
|
||||||
bool entry_adjusted = false;
|
bool entry_adjusted = false;
|
||||||
|
|
||||||
uint64_t min_align = elf64_min_align(elf, use_paddr);
|
uint64_t min_align = 1;
|
||||||
|
if (ranges != NULL) {
|
||||||
|
min_align = elf64_min_align(elf, use_paddr);
|
||||||
|
}
|
||||||
|
|
||||||
if (!elf64_is_relocatable(elf, &hdr)) {
|
if (!elf64_is_relocatable(elf, &hdr)) {
|
||||||
simulation = false;
|
simulation = false;
|
||||||
@ -420,7 +427,7 @@ int elf64_load(uint8_t *elf, uint64_t *entry_point, uint64_t *top, uint64_t *_sl
|
|||||||
|
|
||||||
again:
|
again:
|
||||||
if (kaslr)
|
if (kaslr)
|
||||||
slide = (rand64() & KASLR_SLIDE_BITMASK) & (min_align - 1);
|
slide = (rand64() & KASLR_SLIDE_BITMASK) & ~(min_align - 1);
|
||||||
|
|
||||||
final:
|
final:
|
||||||
if (top)
|
if (top)
|
||||||
|
Loading…
Reference in New Issue
Block a user