Skip to content

Commit

Permalink
ar: Init --exports work
Browse files Browse the repository at this point in the history
  • Loading branch information
dd86k committed Jan 9, 2025
1 parent 51b44ab commit 4de2ac9
Show file tree
Hide file tree
Showing 3 changed files with 222 additions and 168 deletions.
69 changes: 50 additions & 19 deletions dumper/format/ar.d
Original file line number Diff line number Diff line change
Expand Up @@ -21,53 +21,52 @@ extern (C):
int dump_archive(adbg_object_t *o) {
if (SELECTED(Select.headers))
dump_archive_firstheader(o);
if (SELECTED(Select.exports))
if (SELECTED(Select.debug_))
dump_archive_allheaders(o);
if (SELECTED(Select.exports))
dump_archive_symbols(o);
return 0;
}

private:

void dump_archive_header(ar_member_header *member) {
void dump_archive_header(ar_member_header_t *member) {
with (member) {
print_stringl("Name", Name.ptr, Name.sizeof);
print_stringl("Date", Date.ptr, Date.sizeof);
print_stringl("UserID", UserID.ptr, UserID.sizeof);
print_stringl("GroupID", GroupID.ptr, GroupID.sizeof);
print_stringl("Mode", Mode.ptr, Mode.sizeof);
print_stringl("Size", Size.ptr, Size.sizeof);

char[10] b = void;
int l = realstring(b.ptr, 10, End.ptr, 2);
print_x16l("End", EndMarker, b.ptr, l);
// NOTE: Printing the end marker is pretty pointless
}
}

// First header only
void dump_archive_firstheader(adbg_object_t *o) {
print_header("Header");

ar_member_header *member = adbg_object_ar_first_header(o);
ar_member_header_t *member = adbg_object_ar_first_member(o);
if (member == null)
panic_adbg();
dump_archive_header(member);
}

void dump_archive_memberdata(adbg_object_t *o, ar_member_header *member) {
void dump_archive_memberdata(adbg_object_t *o, ar_member_header_t *member) {
if (SETTING(Setting.extractAny) == false)
return;

ar_member_data *m = adbg_object_ar_member_data(o, member);
ar_member_data_t *m = adbg_object_ar_member_data(o, member);
if (m == null)
panic_adbg();
print_data("data", m.data, m.size);
print_data("data", m.pointer, m.size);
adbg_object_ar_member_data_close(m);
}

void dump_archive_allheaders(adbg_object_t *o) {
print_header("Debug data");

ar_member_header *member = adbg_object_ar_first_header(o);
ar_member_header_t *member = adbg_object_ar_first_member(o);
if (member == null)
panic_adbg();

Expand All @@ -76,20 +75,52 @@ void dump_archive_allheaders(adbg_object_t *o) {
print_section(i++);
dump_archive_header(member);
dump_archive_memberdata(o, member);
} while ((member = adbg_object_ar_next_header(o)) != null);
} while ((member = adbg_object_ar_next_member(o)) != null);
}

/*
void dump_archive_symbols(adbg_object_t *o) {
print_header("Symbols");

size_t i;
const(char)* symbol = adbg_object_ar_symbol(o, i);
if (symbol == null)
ar_member_header_t *member = adbg_object_ar_first_member(o);
if (member == null)
panic_adbg();

uint i;
do {
print_string("symbol", symbol);
} while ((symbol = adbg_object_ar_symbol(o, ++i)) != null);
// HACK: Ignore special members, doing it here saves some filtering headaches
// This should include "/", "//", "/EXAMPLE/", "__.SYMDEF" stuff
// And exclude "/70" (long name member entry)
// TODO: Check by Archive kind instead, or member kind
if (member.Name[0] == '/' && isdigit( member.Name[1] ) == 0) {
i++;
continue;
}

// Resolve long-name
char[120] namebuf = void;
if (adbg_object_ar_member_name(namebuf.ptr, namebuf.sizeof, o, member) < 0) {
print_warningf("Member index #%d name issue: %s", i++, adbg_error_message());
continue;
}

/*
// Get member object data buffer
ar_member_data_t *memdat = adbg_object_ar_member_data(o, member);
if (memdat == null) {
print_warningf("Member index #%d data issue: %s", i++, adbg_error_message());
continue;
}
scope(exit) adbg_object_ar_member_data_close(memdat); // closed later
// Open it, it could be COFF, ELF, anything as a relocatable object
adbg_object_t *obj = adbg_object_open_buffer(memdat.pointer, memdat.size, 0);
if (memdat == null) {
print_warningf("Member index #%d object issue: %s", i++, adbg_error_message());
continue;
}
scope(exit) adbg_object_close(obj); // closed first
*/

print_section(i++, namebuf.ptr);
} while ((member = adbg_object_ar_next_member(o)) != null);
}
*/
Loading

0 comments on commit 4de2ac9

Please sign in to comment.