mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-05 15:35:42 +00:00
182 lines
4.5 KiB
C
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;
|
|
}
|
|
|