mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-31 03:10:03 +00:00
went over COFF string table and changed the parser code accept to String8
This commit is contained in:
+6
-8
@@ -52,14 +52,13 @@ coff_section_flag_from_align_size(U64 align)
|
||||
}
|
||||
|
||||
internal String8
|
||||
coff_name_from_section_header(String8 raw_coff, COFF_SectionHeader *header, U64 string_table_off)
|
||||
coff_name_from_section_header(String8 string_table, COFF_SectionHeader *header)
|
||||
{
|
||||
String8 name = str8_cstring_capped(header->name, header->name + sizeof(header->name));
|
||||
if (name.str[0] == '/') {
|
||||
String8 ascii_off = str8_skip(name, 1);
|
||||
U64 name_rel_off = u64_from_str8(ascii_off, 10);
|
||||
U64 name_off = name_rel_off + string_table_off;
|
||||
name = str8_cstring_capped(raw_coff.str + name_off, raw_coff.str + raw_coff.size);
|
||||
String8 name_off_str = str8_skip(name, 1);
|
||||
U64 name_off = u64_from_str8(name_off_str, 10);
|
||||
name = str8_cstring_capped(string_table.str + name_off, string_table.str+string_table.size);
|
||||
}
|
||||
return name;
|
||||
}
|
||||
@@ -94,12 +93,11 @@ coff_parse_section_name(String8 full_name, String8 *name_out, String8 *postfix_o
|
||||
}
|
||||
|
||||
internal String8
|
||||
coff_read_symbol_name(String8 raw_coff, U64 string_table_off, COFF_SymbolName *name)
|
||||
coff_read_symbol_name(String8 string_table, COFF_SymbolName *name)
|
||||
{
|
||||
String8 name_str = str8_lit("");
|
||||
if (name->long_name.zeroes == 0) {
|
||||
U64 name_string_off = string_table_off + name->long_name.string_table_offset;
|
||||
str8_deserial_read_cstr(raw_coff, name_string_off, &name_str);
|
||||
str8_deserial_read_cstr(string_table, name->long_name.string_table_offset, &name_str);
|
||||
} else {
|
||||
U32 i;
|
||||
for (i = 0; i < sizeof(name->short_name); ++i) {
|
||||
|
||||
+2
-2
@@ -567,13 +567,13 @@ typedef struct COFF_ImportHeader
|
||||
internal U64 coff_align_size_from_section_flags(COFF_SectionFlags flags);
|
||||
internal COFF_SectionFlags coff_section_flag_from_align_size (U64 align);
|
||||
|
||||
internal String8 coff_name_from_section_header(String8 raw_coff, COFF_SectionHeader *header, U64 string_table_off);
|
||||
internal String8 coff_name_from_section_header(String8 string_table, COFF_SectionHeader *header);
|
||||
internal void coff_parse_section_name (String8 full_name, String8 *name_out, String8 *postfix_out);
|
||||
|
||||
////////////////////////////////
|
||||
// Symbol
|
||||
|
||||
internal String8 coff_read_symbol_name(String8 raw_coff, U64 string_table_off, COFF_SymbolName *name);
|
||||
internal String8 coff_read_symbol_name(String8 string_table, COFF_SymbolName *name);
|
||||
|
||||
////////////////////////////////
|
||||
// Reloc
|
||||
|
||||
+14
-14
@@ -99,33 +99,33 @@ coff_file_header_info_from_data(String8 raw_coff)
|
||||
COFF_BigObjHeader *header32 = (COFF_BigObjHeader*)raw_coff.str;
|
||||
info.is_big_obj = 1;
|
||||
info.machine = header32->machine;
|
||||
info.header_size = sizeof(COFF_BigObjHeader);
|
||||
info.section_array_off = sizeof(COFF_BigObjHeader);
|
||||
info.section_count_no_null = header32->section_count;
|
||||
info.string_table_off = header32->symbol_table_foff + sizeof(COFF_Symbol32) * header32->symbol_count;
|
||||
info.symbol_size = sizeof(COFF_Symbol32);
|
||||
info.symbol_off = header32->symbol_table_foff;
|
||||
info.symbol_count = header32->symbol_count;
|
||||
info.symbol_size = sizeof(COFF_Symbol32);
|
||||
info.header_range = rng_1u64(0, sizeof(COFF_BigObjHeader));
|
||||
info.section_table_range = rng_1u64(info.header_range.max, info.header_range.max + sizeof(COFF_SectionHeader) * header32->section_count);
|
||||
info.symbol_table_range = rng_1u64(header32->symbol_table_foff, header32->symbol_table_foff + sizeof(COFF_Symbol32) * header32->symbol_count);
|
||||
info.string_table_range = rng_1u64(info.symbol_table_range.max, raw_coff.size);
|
||||
} else if (coff_is_obj(raw_coff)) {
|
||||
COFF_FileHeader *header16 = (COFF_FileHeader*)raw_coff.str;
|
||||
info.is_big_obj = 0;
|
||||
info.machine = header16->machine;
|
||||
info.header_size = sizeof(COFF_FileHeader);
|
||||
info.section_array_off = sizeof(COFF_FileHeader);
|
||||
info.section_count_no_null = header16->section_count;
|
||||
info.string_table_off = header16->symbol_table_foff + sizeof(COFF_Symbol16) * header16->symbol_count;
|
||||
info.symbol_size = sizeof(COFF_Symbol16);
|
||||
info.symbol_off = header16->symbol_table_foff;
|
||||
info.symbol_count = header16->symbol_count;
|
||||
info.symbol_size = sizeof(COFF_Symbol16);
|
||||
info.header_range = rng_1u64(0, sizeof(COFF_FileHeader));
|
||||
info.section_table_range = rng_1u64(info.header_range.max, info.header_range.max + sizeof(COFF_SectionHeader) * header16->section_count);
|
||||
info.symbol_table_range = rng_1u64(header16->symbol_table_foff, header16->symbol_table_foff + sizeof(COFF_Symbol16) * header16->symbol_count);
|
||||
info.string_table_range = rng_1u64(info.symbol_table_range.max, raw_coff.size);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
internal COFF_ParsedSymbol
|
||||
coff_parse_symbol32(String8 raw_coff, U64 string_table_off, COFF_Symbol32 *sym32)
|
||||
coff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32)
|
||||
{
|
||||
COFF_ParsedSymbol result = {0};
|
||||
result.name = coff_read_symbol_name(raw_coff, string_table_off, &sym32->name);
|
||||
result.name = coff_read_symbol_name(string_table, &sym32->name);
|
||||
result.value = sym32->value;
|
||||
result.section_number = sym32->section_number;
|
||||
result.type = sym32->type;
|
||||
@@ -135,10 +135,10 @@ coff_parse_symbol32(String8 raw_coff, U64 string_table_off, COFF_Symbol32 *sym32
|
||||
}
|
||||
|
||||
internal COFF_ParsedSymbol
|
||||
coff_parse_symbol16(String8 raw_coff, U64 string_table_off, COFF_Symbol16 *sym16)
|
||||
coff_parse_symbol16(String8 string_table, COFF_Symbol16 *sym16)
|
||||
{
|
||||
COFF_ParsedSymbol result = {0};
|
||||
result.name = coff_read_symbol_name(raw_coff, string_table_off, &sym16->name);
|
||||
result.name = coff_read_symbol_name(string_table, &sym16->name);
|
||||
result.value = sym16->value;
|
||||
if (sym16->section_number == COFF_Symbol_DebugSection16) {
|
||||
result.section_number = COFF_Symbol_DebugSection32;
|
||||
|
||||
@@ -9,12 +9,13 @@ typedef struct COFF_FileHeaderInfo
|
||||
B32 is_big_obj;
|
||||
COFF_MachineType machine;
|
||||
U64 header_size;
|
||||
U64 section_array_off;
|
||||
U64 section_count_no_null;
|
||||
U64 string_table_off;
|
||||
U64 symbol_size;
|
||||
U64 symbol_off;
|
||||
U64 symbol_count;
|
||||
Rng1U64 header_range;
|
||||
Rng1U64 section_table_range;
|
||||
Rng1U64 symbol_table_range;
|
||||
Rng1U64 string_table_range;
|
||||
} COFF_FileHeaderInfo;
|
||||
|
||||
////////////////////////////////
|
||||
@@ -249,8 +250,8 @@ internal COFF_FileHeaderInfo coff_file_header_info_from_data(String8 raw_coff);
|
||||
////////////////////////////////
|
||||
// Symbol
|
||||
|
||||
internal COFF_ParsedSymbol coff_parse_symbol32(String8 raw_coff, U64 string_table_off, COFF_Symbol32 *sym32);
|
||||
internal COFF_ParsedSymbol coff_parse_symbol16(String8 raw_coff, U64 string_table_off, COFF_Symbol16 *sym16);
|
||||
internal COFF_ParsedSymbol coff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32);
|
||||
internal COFF_ParsedSymbol coff_parse_symbol16(String8 string_table, COFF_Symbol16 *sym16);
|
||||
|
||||
internal COFF_Symbol32Array coff_symbol_array_from_data_16(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count);
|
||||
internal COFF_Symbol32Array coff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count);
|
||||
|
||||
Reference in New Issue
Block a user