Files
raddebugger/src/elf/elf.c
T

182 lines
4.5 KiB
C

// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: 32 => 64 bit conversions
internal ELF_Hdr64
elf_hdr64_from_hdr32(ELF_Hdr32 h32)
{
ELF_Hdr64 h64 = {0};
MemoryCopy(h64.e_ident, h32.e_ident, sizeof(h64.e_ident));
h64.e_type = h32.e_type;
h64.e_machine = h32.e_machine;
h64.e_version = h32.e_version;
h64.e_entry = (U64)h32.e_entry;
h64.e_phoff = (U64)h32.e_phoff;
h64.e_shoff = (U64)h32.e_shoff;
h64.e_flags = h32.e_flags;
h64.e_ehsize = h32.e_ehsize;
h64.e_phentsize = h32.e_phentsize;
h64.e_phnum = h32.e_phnum;
h64.e_shentsize = h32.e_shentsize;
h64.e_shnum = h32.e_shnum;
h64.e_shstrndx = h32.e_shstrndx;
return h64;
}
internal ELF_Shdr64
elf_shdr64_from_shdr32(ELF_Shdr32 h32)
{
ELF_Shdr64 h64 = {0};
h64.sh_name = h32.sh_name;
h64.sh_type = h32.sh_type;
h64.sh_flags = (U64)h32.sh_flags;
h64.sh_addr = (U64)h32.sh_addr;
h64.sh_offset = (U64)h32.sh_offset;
h64.sh_size = (U64)h32.sh_size;
h64.sh_link = h32.sh_link;
h64.sh_info = h32.sh_info;
h64.sh_addralign = (U64)h32.sh_addralign;
h64.sh_entsize = (U64)h32.sh_entsize;
return h64;
}
internal ELF_Phdr64
elf_phdr64_from_phdr32(ELF_Phdr32 h32)
{
ELF_Phdr64 h64 = {0};
h64.p_type = h32.p_type;
h64.p_flags = h32.p_flags;
h64.p_offset = (U64)h32.p_offset;
h64.p_vaddr = (U64)h32.p_vaddr;
h64.p_paddr = (U64)h32.p_paddr;
h64.p_filesz = (U64)h32.p_filesz;
h64.p_memsz = (U64)h32.p_memsz;
h64.p_align = (U64)h32.p_align;
return h64;
}
internal ELF_Dyn64
elf_dyn64_from_dyn32(ELF_Dyn32 h32)
{
ELF_Dyn64 h64 = {0};
h64.tag = (U64)h32.tag;
h64.val = (U64)h32.val;
return h64;
}
internal ELF_Sym64
elf_sym64_from_sym32(ELF_Sym32 sym32)
{
ELF_Sym64 sym64 = {0};
sym64.st_name = sym32.st_name;
sym64.st_value = sym32.st_value;
sym64.st_size = sym32.st_size;
sym64.st_info = sym32.st_info;
sym64.st_other = sym32.st_other;
sym64.st_shndx = sym32.st_shndx;
return sym64;
}
internal ELF_Rel64
elf_rel64_from_rel32(ELF_Rel32 rel32)
{
U32 sym = ELF32_R_SYM(rel32.r_info);
U32 type = ELF32_R_TYPE(rel32.r_info);
ELF_Rel64 rel64 = {0};
rel64.r_info = ELF64_R_INFO(sym, type);
rel64.r_offset = rel32.r_offset;
return rel64;
}
internal ELF_Rela64
elf_rela64_from_rela32(ELF_Rela32 rela32)
{
U32 sym = ELF32_R_SYM(rela32.r_info);
U32 type = ELF32_R_TYPE(rela32.r_info);
ELF_Rela64 rela64 = {0};
rela64.r_offset = rela32.r_info;
rela64.r_info = ELF64_R_INFO(sym, type);
rela64.r_addend = rela32.r_addend;
return rela64;
}
internal ELF_Chdr64
elf_chdr64_from_chdr32(ELF_Chdr32 chdr32)
{
ELF_Chdr64 chdr64 = {0};
chdr64.ch_type = chdr32.ch_type;
chdr64.ch_size = chdr32.ch_size;
chdr64.ch_addr_align = chdr32.ch_addr_align;
return chdr64;
}
internal ELF_Auxv64
elf_auxv64_from_auxv32(ELF_Auxv32 auxv32)
{
ELF_Auxv64 auxv64 = {0};
auxv64.a_type = auxv32.a_type;
auxv64.a_val = auxv32.a_val;
return auxv64;
}
////////////////////////////////
internal String8
elf_string_from_class(Arena *arena, ELF_Class v)
{
switch (v) {
case ELF_Class_None: return str8_lit("None");
case ELF_Class_32: return str8_lit("32Bit");
case ELF_Class_64: return str8_lit("64Bit");
}
return push_str8f(arena, "%#x", v);
}
////////////////////////////////
internal Arch
arch_from_elf_machine(ELF_MachineKind e_machine)
{
Arch arch = Arch_Null;
switch (e_machine) {
case ELF_MachineKind_None: arch = Arch_Null; break;
case ELF_MachineKind_AARCH64: arch = Arch_arm32; break;
case ELF_MachineKind_ARM: arch = Arch_arm32; break;
case ELF_MachineKind_386: arch = Arch_x86; break;
case ELF_MachineKind_X86_64: arch = Arch_x64; break;
default: NotImplemented; break;
}
return arch;
}
////////////////////////////////
internal U64
elf_phdr_size_from_class(ELF_Class elf_class)
{
U64 result = 0;
switch (elf_class) {
case ELF_Class_None: break;
case ELF_Class_32: { result = sizeof(ELF_Phdr32); } break;
case ELF_Class_64: { result = sizeof(ELF_Phdr64); } break;
default: { NotImplemented; } break;
}
return result;
}
internal U64
elf_dyn_size_from_class(ELF_Class elf_class)
{
U64 result = 0;
switch (elf_class) {
case ELF_Class_None: break;
case ELF_Class_32: { result = sizeof(ELF_Dyn32); } break;
case ELF_Class_64: { result = sizeof(ELF_Dyn64); } break;
default: { NotImplemented; } break;
}
return result;
}