WIP process attaching

This commit is contained in:
Nikita Smith committed 2025-12-08 13:29:24 -08:00
1 parent 9659ab4ad2
commit c221286ab8
5 files changed
+246 -44

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal GNU_RDebugInfoList
gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud)
{
GNU_RDebugInfoList result = {0};
for (U64 rdebug_vaddr = first_rdebug_vaddr, rdebug_next = 0; rdebug_vaddr != 0; rdebug_vaddr = rdebug_next) {
GNU_RDebugInfo64 rdebug;
if (is_64bit) {
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug), &rdebug, mem_read_ud);
if (rdebug_read_size != sizeof(rdebug)) { goto exit; }
} else {
GNU_RDebugInfo32 rdebug32;
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug32), &rdebug32, mem_read_ud);
if (rdebug_read_size != sizeof(rdebug32)) { goto exit; }
}
if (rdebug.r_version < 1) { goto exit; }
if (rdebug.r_version > 1) {
U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), sizeof(rdebug_next), &rdebug_next, mem_read_ud);
if (r_next_size != sizeof(rdebug_next)) { goto exit; }
}
GNU_RDebugInfoNode *rdebug_n = push_array(arena, GNU_RDebugInfoNode, 1);
rdebug_n->v = rdebug;
SLLQueuePush(result.first, result.last, rdebug_n);
result.count += 1;
}
exit:;
return result;
}
internal GNU_LinkMapList
gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud)
{
GNU_LinkMapList result = {0};
GNU_LinkMap64 link_map = {0};
for (U64 link_map_vaddr = first_link_map_vaddr; link_map_vaddr != 0; link_map_vaddr = link_map.next_vaddr) {
if (is_64bit) {
U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map), &link_map, mem_read_ud);
if (link_map_size != sizeof(link_map)) { goto exit; }
} else {
GNU_LinkMap32 link_map32 = {0};
U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map32), &link_map32, mem_read_ud);
if (link_map_size != sizeof(link_map32)) { goto exit; }
gnu_linkmap64_from_linkmap32(link_map32);
}
GNU_LinkMapNode *n = push_array(arena, GNU_LinkMapNode, 1);
n->v = link_map;
SLLQueuePush(result.first, result.last, n);
result.count += 1;
}
exit:;
return result;
}
+41
View File
@@ -0,0 +1,41 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef GNU_PARSE_H
#define GNU_PARSE_H
typedef struct GNU_LinkMapNode
{
GNU_LinkMap64 v;
struct GNU_LinkMapNode *next;
} GNU_LinkMapNode;
typedef struct GNU_LinkMapList
{
U64 count;
GNU_LinkMapNode *first;
GNU_LinkMapNode *last;
} GNU_LinkMapList;
typedef struct GNU_RDebugInfoNode
{
GNU_RDebugInfo64 v;
struct GNU_RDebugInfoNode *next;
} GNU_RDebugInfoNode;
typedef struct GNU_RDebugInfoList
{
U64 count;
GNU_RDebugInfoNode *first;
GNU_RDebugInfoNode *last;
} GNU_RDebugInfoList;
#define GNU_MEM_READ(name) U64 name(U64 addr, U64 size, void *buffer, void *ud)
typedef GNU_MEM_READ(GNU_MemRead);
////////////////////////////////
internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud);
internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud);
#endif