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);
|
||||
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`
|
||||
S32 signo;
|
||||
S32 sigcode;
|
||||
Rng1U64 elf_phdr_vrange;
|
||||
U64 elf_phdr_entsize;
|
||||
U64 instruction_pointer;
|
||||
U64 stack_pointer;
|
||||
U64 user_data;
|
||||
@@ -195,6 +197,8 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread);
|
||||
//~ 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_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)
|
||||
|
||||
@@ -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);
|
||||
SLLQueuePush(list.first, list.last, n);
|
||||
list.count += 1;
|
||||
n->v.vaddr_range = shift_1u64(phdr_info.range, base_vaddr);
|
||||
n->v.name = aux.execfn;
|
||||
n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range));
|
||||
n->v.name = aux.execfn;
|
||||
n->v.phvaddr = aux.phdr;
|
||||
n->v.phentsize = aux.phent;
|
||||
n->v.phcount = aux.phnum;
|
||||
}
|
||||
|
||||
//- rjf: iterate link maps
|
||||
@@ -426,7 +429,10 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process)
|
||||
SLLQueuePush(list.first, list.last, n);
|
||||
list.count += 1;
|
||||
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
|
||||
@@ -1108,14 +1114,16 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)
|
||||
module->id = n->v.name;
|
||||
{
|
||||
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
|
||||
e->kind = DMN_EventKind_LoadModule;
|
||||
e->process = dmn_lnx_handle_from_entity(process);
|
||||
e->thread = dmn_lnx_handle_from_entity(main_thread);
|
||||
e->module = dmn_lnx_handle_from_entity(module);
|
||||
e->arch = process->arch;
|
||||
e->address = n->v.vaddr_range.min;
|
||||
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->kind = DMN_EventKind_LoadModule;
|
||||
e->process = dmn_lnx_handle_from_entity(process);
|
||||
e->thread = dmn_lnx_handle_from_entity(main_thread);
|
||||
e->module = dmn_lnx_handle_from_entity(module);
|
||||
e->arch = process->arch;
|
||||
e->address = n->v.vaddr_range.min;
|
||||
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->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;
|
||||
U64 name;
|
||||
U64 phvaddr;
|
||||
U64 phentsize;
|
||||
U64 phcount;
|
||||
};
|
||||
|
||||
typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode;
|
||||
@@ -261,6 +264,9 @@ struct DMN_LNX_Entity
|
||||
U64 id;
|
||||
int fd;
|
||||
B32 expecting_dummy_sigstop;
|
||||
U64 phvaddr;
|
||||
U64 phentsize;
|
||||
U64 phcount;
|
||||
};
|
||||
|
||||
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_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 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
|
||||
internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);
|
||||
|
||||
Reference in New Issue
Block a user