Used words
invalid arch-dependent ELF magic
reloc offset is out of the segment
relocation out of range
%
relocation 0x%s is not implemented yet
#include
/*
Check
if
EHDR
is
a
valid
ELF
header.
*/
grub_err_t
grub_arch_dl_check_header
(void
*ehdr)
{
Elf64_Ehdr
*e
=
ehdr
the
magic
numbers.
(e->e_identEI_CLASS
!=
ELFCLASS64
||
e->e_identEI_DATA
ELFDATA2LSB
e->e_machine
EM_X86_64)
return
grub_error
(GRUB_ERR_BAD_OS
N_())
GRUB_ERR_NONE
}
Relocate
symbols.
grub_arch_dl_relocate_symbols
(grub_dl_t
mod
void
*ehdr
Elf_Shdr
*s
grub_dl_segment_t
seg)
Elf64_Rela
*rel
*max
for
(rel
(Elf64_Rela
*)
((char
ehdr
+
s->sh_offset)
max
rel
s->sh_size)
<
max
s->sh_entsize))
Elf64_Word
*addr32
Elf64_Xword
*addr64
Elf64_Sym
*sym
(seg->size
rel->r_offset)
return
(GRUB_ERR_BAD_MODULE
)
addr32
(Elf64_Word
seg->addr
rel->r_offset)
addr64
(Elf64_Xword
addr32
sym
(Elf64_Sym
mod->symtab
mod->symsize
*
ELF_R_SYM
(rel->r_info))
switch
(ELF_R_TYPE
(rel->r_info))
{
case
R_X86_64_64:
*addr64
+=
rel->r_addend
sym->st_value
break
R_X86_64_PC32:
R_X86_64_PLT32:
grub_int64_t
value
value
((grub_int32_t)
*addr32)
sym->st_value
-
(Elf64_Xword)
(grub_addr_t)
rel->r_offset
(value
(grub_int32_t)
value)
*addr32
R_X86_64_PC64:
R_X86_64_32:
grub_uint64_t
(grub_uint32_t)
R_X86_64_32S:
default:
char
rel_info17
log16(2^64)
16
plus
NUL.
grub_snprintf
(rel_info
sizeof
(rel_info)
1
PRIxGRUB_UINT64_T
ELF_R_TYPE
(GRUB_ERR_NOT_IMPLEMENTED_YET
N_()
rel_info)
}
Create your own