mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
fix program header rebase issue in non-PIE exes, and export program header
info through DEMON event
This commit is contained in:
committed by
Ryan Fleury
parent
7f705923e6
commit
78f2e641bc
@@ -180,3 +180,29 @@ dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr)
|
|||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal String8
|
||||||
|
dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange)
|
||||||
|
{
|
||||||
|
String8 block = {0};
|
||||||
|
void *raw = dmn_process_read_raw(arena, process, vrange);
|
||||||
|
if(raw)
|
||||||
|
{
|
||||||
|
block = str8(raw, dim_1u64(vrange));
|
||||||
|
}
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void *
|
||||||
|
dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange)
|
||||||
|
{
|
||||||
|
Temp temp = temp_begin(arena);
|
||||||
|
void *buffer = push_array(arena, U8, dim_1u64(vrange));
|
||||||
|
U64 read_size = dmn_process_read(process, vrange, buffer);
|
||||||
|
if(read_size != dim_1u64(vrange))
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
temp_end(temp);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ struct DMN_Event
|
|||||||
U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint`
|
U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint`
|
||||||
S32 signo;
|
S32 signo;
|
||||||
S32 sigcode;
|
S32 sigcode;
|
||||||
|
Rng1U64 elf_phdr_vrange;
|
||||||
|
U64 elf_phdr_entsize;
|
||||||
U64 instruction_pointer;
|
U64 instruction_pointer;
|
||||||
U64 stack_pointer;
|
U64 stack_pointer;
|
||||||
U64 user_data;
|
U64 user_data;
|
||||||
@@ -195,6 +197,8 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread);
|
|||||||
//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once)
|
//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once)
|
||||||
|
|
||||||
internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr);
|
internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr);
|
||||||
|
internal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange);
|
||||||
|
internal void * dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)
|
//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)
|
||||||
|
|||||||
@@ -367,8 +367,11 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process)
|
|||||||
DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1);
|
DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1);
|
||||||
SLLQueuePush(list.first, list.last, n);
|
SLLQueuePush(list.first, list.last, n);
|
||||||
list.count += 1;
|
list.count += 1;
|
||||||
n->v.vaddr_range = shift_1u64(phdr_info.range, base_vaddr);
|
n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range));
|
||||||
n->v.name = aux.execfn;
|
n->v.name = aux.execfn;
|
||||||
|
n->v.phvaddr = aux.phdr;
|
||||||
|
n->v.phentsize = aux.phent;
|
||||||
|
n->v.phcount = aux.phnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: iterate link maps
|
//- rjf: iterate link maps
|
||||||
@@ -427,6 +430,9 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process)
|
|||||||
list.count += 1;
|
list.count += 1;
|
||||||
n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range));
|
n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range));
|
||||||
n->v.name = linkmap.name;
|
n->v.name = linkmap.name;
|
||||||
|
n->v.phvaddr = phvaddr;
|
||||||
|
n->v.phentsize = phentsize;
|
||||||
|
n->v.phcount = phcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: iterate
|
// rjf: iterate
|
||||||
@@ -1116,6 +1122,8 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)
|
|||||||
e->address = n->v.vaddr_range.min;
|
e->address = n->v.vaddr_range.min;
|
||||||
e->size = dim_1u64(n->v.vaddr_range);
|
e->size = dim_1u64(n->v.vaddr_range);
|
||||||
e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name);
|
e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name);
|
||||||
|
e->elf_phdr_vrange = r1u64(n->v.phvaddr, n->v.phvaddr + n->v.phentsize * n->v.phcount);
|
||||||
|
e->elf_phdr_entsize = n->v.phentsize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -216,6 +216,9 @@ struct DMN_LNX_ModuleInfo
|
|||||||
{
|
{
|
||||||
Rng1U64 vaddr_range;
|
Rng1U64 vaddr_range;
|
||||||
U64 name;
|
U64 name;
|
||||||
|
U64 phvaddr;
|
||||||
|
U64 phentsize;
|
||||||
|
U64 phcount;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode;
|
typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode;
|
||||||
@@ -261,6 +264,9 @@ struct DMN_LNX_Entity
|
|||||||
U64 id;
|
U64 id;
|
||||||
int fd;
|
int fd;
|
||||||
B32 expecting_dummy_sigstop;
|
B32 expecting_dummy_sigstop;
|
||||||
|
U64 phvaddr;
|
||||||
|
U64 phentsize;
|
||||||
|
U64 phcount;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode;
|
typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode;
|
||||||
@@ -311,6 +317,8 @@ internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src);
|
|||||||
#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||||
#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||||
internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr);
|
internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr);
|
||||||
|
internal void * dmn_lnx_read_raw(Arena *arena, int memory_fd, Rng1U64 vrange);
|
||||||
|
internal String8 dmn_lnx_read_block(Arena *arena, int memory_fd, Rng1U64 vrange);
|
||||||
|
|
||||||
//- rjf: pid => info extraction
|
//- rjf: pid => info extraction
|
||||||
internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);
|
internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);
|
||||||
|
|||||||
Reference in New Issue
Block a user