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); 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;
}
+4
View File
@@ -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)
+9 -1
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); 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;
} }
} }
+8
View File
@@ -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);