fix program header rebase issue in non-PIE exes, and export program header

info through DEMON event
This commit is contained in:
Nikita Smith
2025-11-07 14:39:45 -08:00
committed by Ryan Fleury
parent 7f705923e6
commit 78f2e641bc
4 changed files with 57 additions and 11 deletions
+26
View File
@@ -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;
}
+4
View File
@@ -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)
+19 -11
View File
@@ -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;
}
}
+8
View File
@@ -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);