Changeset View
Changeset View
Standalone View
Standalone View
stand/common/load_elf.c
Show First 20 Lines • Show All 201 Lines • ▼ Show 20 Lines | |||||
#undef SECTION_HEADER_FIELDS | #undef SECTION_HEADER_FIELDS | ||||
return (0); | return (0); | ||||
} | } | ||||
#undef CONVERT_SWITCH | #undef CONVERT_SWITCH | ||||
#undef CONVERT_FIELD | #undef CONVERT_FIELD | ||||
#ifdef __amd64__ | |||||
static bool | |||||
is_kernphys_relocatable(elf_file_t ef) | |||||
{ | |||||
Elf_Sym sym; | |||||
return (__elfN(lookup_symbol)(ef, "kernphys", &sym, STT_OBJECT) == 0 && | |||||
sym.st_size == 8); | |||||
} | |||||
#endif | |||||
static int | static int | ||||
__elfN(load_elf_header)(char *filename, elf_file_t ef) | __elfN(load_elf_header)(char *filename, elf_file_t ef) | ||||
{ | { | ||||
ssize_t bytes_read; | ssize_t bytes_read; | ||||
Elf_Ehdr *ehdr; | Elf_Ehdr *ehdr; | ||||
int err; | int err; | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 211 Lines • ▼ Show 20 Lines | if (fp->f_size == 0 || fp->f_addr == 0) | ||||
goto ioerr; | goto ioerr; | ||||
/* save exec header as metadata */ | /* save exec header as metadata */ | ||||
file_addmetadata(fp, MODINFOMD_ELFHDR, sizeof(*ehdr), ehdr); | file_addmetadata(fp, MODINFOMD_ELFHDR, sizeof(*ehdr), ehdr); | ||||
/* Load OK, return module pointer */ | /* Load OK, return module pointer */ | ||||
*result = (struct preloaded_file *)fp; | *result = (struct preloaded_file *)fp; | ||||
err = 0; | err = 0; | ||||
#ifdef __amd64__ | |||||
fp->f_kernphys_relocatable = is_kernphys_relocatable(&ef); | |||||
#endif | |||||
goto out; | goto out; | ||||
ioerr: | ioerr: | ||||
err = EIO; | err = EIO; | ||||
oerr: | oerr: | ||||
file_discard(fp); | file_discard(fp); | ||||
out: | out: | ||||
if (ef.firstpage) | if (ef.firstpage) | ||||
▲ Show 20 Lines • Show All 878 Lines • Show Last 20 Lines |