mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-04 04:28:20 +00:00
Implement rabin -Vj for ELF files (#9345)
This commit is contained in:
parent
b04fddc260
commit
66569c5c7e
112
libr/core/cbin.c
112
libr/core/cbin.c
@ -2984,7 +2984,7 @@ static void bin_pe_versioninfo(RCore *r) {
|
||||
} while (sdb);
|
||||
}
|
||||
|
||||
static void bin_elf_versioninfo(RCore *r) {
|
||||
static void bin_elf_versioninfo(RCore *r, int mode) {
|
||||
const char *format = "bin/cur/info/versioninfo/%s%d";
|
||||
char path[256] = {0};
|
||||
int num_versym = 0;
|
||||
@ -2992,6 +2992,8 @@ static void bin_elf_versioninfo(RCore *r) {
|
||||
int num_version = 0;
|
||||
Sdb *sdb = NULL;
|
||||
const char *oValue = NULL;
|
||||
bool firstit_for_versym = true;
|
||||
if (IS_MODE_JSON (mode)) { r_cons_printf ("{\"versym\":["); }
|
||||
for (;; num_versym++) {
|
||||
snprintf (path, sizeof (path), format, "versym", num_versym);
|
||||
if (!(sdb = sdb_ns_path (r->sdb, path, 0))) {
|
||||
@ -3004,9 +3006,17 @@ static void bin_elf_versioninfo(RCore *r) {
|
||||
const char *section_name = sdb_const_get (sdb, "section_name", 0);
|
||||
const char *link_section_name = sdb_const_get (sdb, "link_section_name", 0);
|
||||
|
||||
r_cons_printf ("Version symbols section '%s' contains %"PFMT64u" entries:\n", section_name, num_entries);
|
||||
r_cons_printf (" Addr: 0x%08"PFMT64x" Offset: 0x%08"PFMT64x" Link: %x (%s)\n",
|
||||
(ut64)addr, (ut64)offset, (ut32)link, link_section_name);
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
if (!firstit_for_versym) { r_cons_printf (","); }
|
||||
r_cons_printf ("{\"section_name\":\"%s\",\"address\":%"PFMT64u",\"offset\":%"PFMT64u",",
|
||||
section_name, (ut64)addr, (ut64)offset);
|
||||
r_cons_printf ("\"link\":%"PFMT64u",\"link_section_name\":\"%s\",\"entries\":[",
|
||||
(ut32)link, link_section_name);
|
||||
} else {
|
||||
r_cons_printf ("Version symbols section '%s' contains %"PFMT64u" entries:\n", section_name, num_entries);
|
||||
r_cons_printf (" Addr: 0x%08"PFMT64x" Offset: 0x%08"PFMT64x" Link: %x (%s)\n",
|
||||
(ut64)addr, (ut64)offset, (ut32)link, link_section_name);
|
||||
}
|
||||
int i;
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
char key[32] = R_EMPTY;
|
||||
@ -3016,14 +3026,29 @@ static void bin_elf_versioninfo(RCore *r) {
|
||||
if (oValue && !strcmp (value, oValue)) {
|
||||
continue;
|
||||
}
|
||||
r_cons_printf (" 0x%08"PFMT64x": ", (ut64) i);
|
||||
r_cons_printf ("%s\n", value);
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
if (i > 0) { r_cons_printf (","); }
|
||||
char *escaped_value = r_str_escape (value);
|
||||
r_cons_printf ("{\"idx\":%"PFMT64u",\"value\":\"%s\"}",
|
||||
(ut64) i, escaped_value);
|
||||
free (escaped_value);
|
||||
} else {
|
||||
r_cons_printf (" 0x%08"PFMT64x": ", (ut64) i);
|
||||
r_cons_printf ("%s\n", value);
|
||||
}
|
||||
oValue = value;
|
||||
}
|
||||
}
|
||||
r_cons_println ("\n");
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
r_cons_printf ("]}");
|
||||
} else {
|
||||
r_cons_printf ("\n\n");
|
||||
}
|
||||
firstit_for_versym = false;
|
||||
}
|
||||
if (IS_MODE_JSON (mode)) { r_cons_printf ("],\"verneed\":["); }
|
||||
|
||||
bool firstit_dowhile_verneed = true;
|
||||
do {
|
||||
char path_version[256] = R_EMPTY;
|
||||
snprintf (path, sizeof (path), format, "verneed", num_verneed++);
|
||||
@ -3031,14 +3056,23 @@ static void bin_elf_versioninfo(RCore *r) {
|
||||
break;
|
||||
}
|
||||
|
||||
r_cons_printf ("Version need section '%s' contains %d entries:\n",
|
||||
sdb_const_get (sdb, "section_name", 0), (int)sdb_num_get (sdb, "num_entries", 0));
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
if (!firstit_dowhile_verneed) { r_cons_printf (","); }
|
||||
r_cons_printf ("{\"section_name\":\"%s\",\"address\":%"PFMT64u",\"offset\":%"PFMT64u",",
|
||||
sdb_const_get (sdb, "section_name", 0), sdb_num_get (sdb, "addr", 0), sdb_num_get (sdb, "offset", 0));
|
||||
r_cons_printf ("\"link\":%"PFMT64u",\"link_section_name\":\"%s\",\"entries\":[",
|
||||
sdb_num_get (sdb, "link", 0), sdb_const_get (sdb, "link_section_name", 0));
|
||||
} else {
|
||||
r_cons_printf ("Version need section '%s' contains %d entries:\n",
|
||||
sdb_const_get (sdb, "section_name", 0), (int)sdb_num_get (sdb, "num_entries", 0));
|
||||
|
||||
r_cons_printf (" Addr: 0x%08"PFMT64x, sdb_num_get (sdb, "addr", 0));
|
||||
r_cons_printf (" Addr: 0x%08"PFMT64x, sdb_num_get (sdb, "addr", 0));
|
||||
|
||||
r_cons_printf (" Offset: 0x%08"PFMT64x" Link to section: %"PFMT64d" (%s)\n",
|
||||
sdb_num_get (sdb, "offset", 0), sdb_num_get (sdb, "link", 0),
|
||||
sdb_const_get (sdb, "link_section_name", 0));
|
||||
r_cons_printf (" Offset: 0x%08"PFMT64x" Link to section: %"PFMT64d" (%s)\n",
|
||||
sdb_num_get (sdb, "offset", 0), sdb_num_get (sdb, "link", 0),
|
||||
sdb_const_get (sdb, "link_section_name", 0));
|
||||
}
|
||||
bool firstit_for_verneed = true;
|
||||
for (num_version = 0;; num_version++) {
|
||||
snprintf (path_version, sizeof (path_version), "%s/version%d", path, num_version);
|
||||
const char *filename = NULL;
|
||||
@ -3047,26 +3081,60 @@ static void bin_elf_versioninfo(RCore *r) {
|
||||
if (!(sdb = sdb_ns_path (r->sdb, path_version, 0))) {
|
||||
break;
|
||||
}
|
||||
r_cons_printf (" 0x%08"PFMT64x": Version: %d",
|
||||
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
if (!firstit_for_verneed) { r_cons_printf (","); }
|
||||
r_cons_printf ("{\"idx\":%"PFMT64u",\"vn_version\":%d,",
|
||||
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
|
||||
} else {
|
||||
r_cons_printf (" 0x%08"PFMT64x": Version: %d",
|
||||
sdb_num_get (sdb, "idx", 0), (int)sdb_num_get (sdb, "vn_version", 0));
|
||||
}
|
||||
|
||||
if ((filename = sdb_const_get (sdb, "file_name", 0))) {
|
||||
r_cons_printf (" File: %s", filename);
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
char *escaped_filename = r_str_escape (filename);
|
||||
r_cons_printf ("\"file_name\":\"%s\",", escaped_filename);
|
||||
free (escaped_filename);
|
||||
} else {
|
||||
r_cons_printf (" File: %s", filename);
|
||||
}
|
||||
}
|
||||
r_cons_printf (" Cnt: %d\n", (int)sdb_num_get (sdb, "cnt", 0));
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
r_cons_printf ("\"cnt\":%d,", (int)sdb_num_get (sdb, "cnt", 0));
|
||||
} else {
|
||||
r_cons_printf (" Cnt: %d\n", (int)sdb_num_get (sdb, "cnt", 0));
|
||||
}
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
r_cons_printf ("\"vernaux\":[");
|
||||
}
|
||||
bool firstit_dowhile_vernaux = true;
|
||||
do {
|
||||
snprintf (path_vernaux, sizeof (path_vernaux), "%s/vernaux%d",
|
||||
path_version, num_vernaux++);
|
||||
if (!(sdb = sdb_ns_path (r->sdb, path_vernaux, 0))) {
|
||||
break;
|
||||
}
|
||||
r_cons_printf (" 0x%08"PFMT64x": Name: %s",
|
||||
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
|
||||
r_cons_printf (" Flags: %s Version: %d\n",
|
||||
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
|
||||
if (IS_MODE_JSON (mode)) {
|
||||
if (!firstit_dowhile_vernaux) { r_cons_printf (","); }
|
||||
r_cons_printf ("{\"idx\":%"PFMT64x",\"name\":\"%s\",",
|
||||
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
|
||||
r_cons_printf ("\"flags\":\"%s\",\"version\":%d}",
|
||||
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
|
||||
} else {
|
||||
r_cons_printf (" 0x%08"PFMT64x": Name: %s",
|
||||
sdb_num_get (sdb, "idx", 0), sdb_const_get (sdb, "name", 0));
|
||||
r_cons_printf (" Flags: %s Version: %d\n",
|
||||
sdb_const_get (sdb, "flags", 0), (int)sdb_num_get (sdb, "version", 0));
|
||||
}
|
||||
firstit_dowhile_vernaux = false;
|
||||
} while (sdb);
|
||||
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); };
|
||||
firstit_for_verneed = false;
|
||||
}
|
||||
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); };
|
||||
firstit_dowhile_verneed = false;
|
||||
} while (sdb);
|
||||
if (IS_MODE_JSON (mode)) { r_cons_printf ("]}"); }
|
||||
}
|
||||
|
||||
static void bin_mach0_versioninfo(RCore *r) {
|
||||
@ -3166,7 +3234,7 @@ static int bin_versioninfo(RCore *r, int mode) {
|
||||
if (!strncmp ("pe", info->rclass, 2)) {
|
||||
bin_pe_versioninfo (r);
|
||||
} else if (!strncmp ("elf", info->rclass, 3)) {
|
||||
bin_elf_versioninfo (r);
|
||||
bin_elf_versioninfo (r, mode);
|
||||
} else if (!strncmp ("mach0", info->rclass, 5)) {
|
||||
bin_mach0_versioninfo (r);
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user