Get rid of the ELF-specific C++ detection ##bin (#14285)

This commit is contained in:
radare 2019-06-16 18:36:33 +02:00 committed by GitHub
parent 68d7b25b31
commit d06a77d731
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 81 additions and 140 deletions

View File

@ -588,11 +588,16 @@ R_IPI bool r_bin_file_set_cur_binfile_obj(RBin *bin, RBinFile *bf, RBinObject *o
bin->narch = bf->narch;
if (obj) {
bf->o = obj;
} else {
obj = bf->o;
}
RBinPlugin *plugin = r_bin_file_cur_plugin (bf);
if (bin->minstrlen < 1) {
bin->minstrlen = plugin? plugin->minstrlen: bin->minstrlen;
}
if (obj && !obj->info->lang) {
obj->info->lang = r_bin_lang_tostring (obj->lang);
}
return true;
}

View File

@ -1,4 +1,4 @@
/* radare2 - LGPL - Copyright 2018 - pancake */
/* radare2 - LGPL - Copyright 2018-2019 - pancake */
#include <r_bin.h>
@ -40,16 +40,21 @@ static bool check_swift(RBinSymbol *sym) {
return false;
}
static bool check_cxx(RBinSymbol *sym) {
if (!strncmp (sym->name, "_Z", 2)) {
static inline bool is_cxx_symbol (const char *name) {
r_return_val_if_fail (name, false);
if (!strncmp (name, "_Z", 2)) {
return true;
}
if (!strncmp (sym->name, "__Z", 3)) {
if (!strncmp (name, "__Z", 3)) {
return true;
}
return false;
}
static bool check_cxx(RBinSymbol *sym) {
return is_cxx_symbol (sym->name);
}
static bool check_msvc(RBinSymbol *sym) {
return *sym->name == '?';
}
@ -75,11 +80,19 @@ R_API int r_bin_load_languages(RBinFile *binfile) {
bool isMacho = strstr (ft, "mach");
bool isElf = strstr (ft, "elf");
bool isPe = strstr (ft, "pe");
bool isBlocks = false;
if (unknownType || !(isMacho || isElf || isPe)) {
return R_BIN_NM_NONE;
}
// check in imports . can be slow
r_list_foreach (o->imports, iter, sym) {
if (!strcmp (sym->name, "_NSConcreteGlobalBlock")) {
isBlocks = true;
}
}
r_list_foreach (o->symbols, iter, sym) {
char *lib;
if (!cantbe.rust) {
@ -154,13 +167,12 @@ R_API int r_bin_load_languages(RBinFile *binfile) {
}
}
if (canBeCxx) {
info->lang = "c++";
return R_BIN_NM_CXX;
return R_BIN_NM_CXX | (isBlocks?R_BIN_NM_BLOCKS:0);
}
if (isMsvc) {
return R_BIN_NM_MSVC;
}
return R_BIN_NM_NONE;
return R_BIN_NM_C | (isBlocks?R_BIN_NM_BLOCKS:0);
}
R_IPI int r_bin_lang_type(RBinFile *binfile, const char *def, const char *sym) {
@ -188,3 +200,26 @@ R_IPI int r_bin_lang_type(RBinFile *binfile, const char *def, const char *sym) {
}
return type;
}
R_API const char *r_bin_lang_tostring(int lang) {
switch (lang & 0xffff) {
case R_BIN_NM_SWIFT:
return "swift";
case R_BIN_NM_JAVA:
return "java";
case R_BIN_NM_C:
return (lang&R_BIN_NM_BLOCKS)? "c with blocks": "c";
case R_BIN_NM_CXX:
return (lang&R_BIN_NM_BLOCKS)? "c++ with blocks": "c++";
case R_BIN_NM_DLANG:
return "d";
case R_BIN_NM_OBJC:
return "objc";
case R_BIN_NM_MSVC:
return "msvc";
case R_BIN_NM_RUST:
return "rust";
}
return NULL;
}

View File

@ -4,10 +4,10 @@
#include <r_util.h>
#include "i/private.h"
static void mem_free(void *data) {
R_API void r_bin_mem_free(void *data) {
RBinMem *mem = (RBinMem *)data;
if (mem && mem->mirrors) {
mem->mirrors->free = mem_free;
mem->mirrors->free = r_bin_mem_free;
r_list_free (mem->mirrors);
mem->mirrors = NULL;
}
@ -48,9 +48,6 @@ static void object_delete_items(RBinObject *o) {
ht_pp_free (o->methods_ht);
r_list_free (o->lines);
sdb_free (o->kv);
if (o->mem) {
o->mem->free = mem_free;
}
r_list_free (o->mem);
for (i = 0; i < R_BIN_SYM_LAST; i++) {
free (o->binsym[i]);
@ -59,13 +56,12 @@ static void object_delete_items(RBinObject *o) {
R_IPI void r_bin_object_free(void /*RBinObject*/ *o_) {
RBinObject *o = o_;
if (!o) {
return;
if (o) {
free (o->regstate);
r_bin_info_free (o->info);
object_delete_items (o);
free (o);
}
free (o->regstate);
r_bin_info_free (o->info);
object_delete_items (o);
free (o);
}
static char *swiftField(const char *dn, const char *cn) {
@ -144,7 +140,7 @@ R_IPI RBinObject *r_bin_object_new(RBinFile *bf, RBinPlugin *plugin, ut64 basead
o->boffset = offset;
o->strings_db = ht_up_new0 ();
o->regstate = NULL;
o->kv = sdb_new0 ();
o->kv = sdb_new0 (); // XXX bf->sdb bf->o->sdb wtf
o->baddr = baseaddr;
o->classes = r_list_newf ((RListFree)r_bin_class_free);
o->classes_ht = ht_pp_new0 ();
@ -251,13 +247,11 @@ static RBNode *list2rbtree(RList *relocs) {
}
R_API int r_bin_object_set_items(RBinFile *bf, RBinObject *o) {
int i;
bool isSwift = false;
r_return_val_if_fail (bf && o && o->plugin, false);
int i;
bool isSwift = false;
RBin *bin = bf->rbin;
RBinObject *old_o = bf->o;
RBinPlugin *p = o->plugin;
int minlen = (bf->rbin->minstrlen > 0) ? bf->rbin->minstrlen : p->minstrlen;
bf->o = o;
@ -274,24 +268,6 @@ R_API int r_bin_object_set_items(RBinFile *bf, RBinObject *o) {
}
}
// TODO: kill the baddr_shift and split into {user/file}-baddr
// compute baddr_shift
#if 0
if (o->baddr != UT64_MAX) {
ut64 file_baddr = p->baddr (bf);
if (file_baddr != UT64_MAX && o->baddr != UT64_MAX) {
o->baddr_shift = o->baddr - file_baddr;
}
if (o->baddr != UT64_MAX) {
o->baddr_shift = 0; // o->baddr - file_baddr;
} else {
if (o->baddr != UT64_MAX && file_baddr != UT64_MAX) {
o->baddr = file_baddr;
o->baddr_shift = 0; // o->baddr - file_baddr;
}
}
}
#endif
if (p->boffset) {
o->boffset = p->boffset (bf);
}
@ -364,11 +340,9 @@ if (o->baddr != UT64_MAX && file_baddr != UT64_MAX) {
}
}
if (bin->filter_rules & R_BIN_REQ_STRINGS) {
if (p->strings) {
o->strings = p->strings (bf);
} else {
o->strings = r_bin_file_get_strings (bf, minlen, 0, bf->rawstr);
}
o->strings = p->strings
? p->strings (bf)
: r_bin_file_get_strings (bf, minlen, 0, bf->rawstr);
if (bin->debase64) {
r_bin_object_filter_strings (o);
}
@ -427,14 +401,9 @@ if (o->baddr != UT64_MAX && file_baddr != UT64_MAX) {
if (p->mem) {
o->mem = p->mem (bf);
}
if (bin->filter_rules & (R_BIN_REQ_SYMBOLS | R_BIN_REQ_IMPORTS)) {
if (isSwift) {
o->lang = R_BIN_NM_SWIFT;
} else {
o->lang = r_bin_load_languages (bf);
}
if (bin->filter_rules & (R_BIN_REQ_INFO | R_BIN_REQ_SYMBOLS | R_BIN_REQ_IMPORTS)) {
o->lang = isSwift? R_BIN_NM_SWIFT: r_bin_load_languages (bf);
}
bf->o = old_o;
return true;
}
@ -469,13 +438,12 @@ R_IPI RBinObject *r_bin_object_find_by_arch_bits(RBinFile *bf, const char *arch,
if (!bf->o) {
return NULL;
}
RBinObject *obj = bf->o;
RBinInfo *info = obj->info;
RBinInfo *info = bf->o->info;
if (info && info->arch && info->file &&
(bits == info->bits) &&
!strcmp (info->arch, arch) &&
!strcmp (info->file, name)) {
return obj;
return bf->o;
}
return NULL;
}
@ -486,10 +454,9 @@ R_IPI ut64 r_bin_object_get_baddr(RBinObject *o) {
}
R_API bool r_bin_object_delete(RBin *bin, ut32 bf_id) {
bool res = false;
r_return_val_if_fail (bin, false);
bool res = false;
RBinFile *bf = r_bin_file_find_by_id (bin, bf_id);
if (bf) {
if (bin->cur == bf) {
@ -535,4 +502,3 @@ R_IPI void r_bin_object_filter_strings(RBinObject *bo) {
}
}
}

View File

@ -35,26 +35,6 @@ R_API char *r_bin_demangle_plugin(RBin *bin, const char *name, const char *str)
return NULL;
}
R_IPI const char *r_bin_lang_tostring(int lang) {
switch (lang) {
case R_BIN_NM_SWIFT:
return "swift";
case R_BIN_NM_JAVA:
return "java";
case R_BIN_NM_CXX:
return "c++";
case R_BIN_NM_DLANG:
return "d";
case R_BIN_NM_OBJC:
return "objc";
case R_BIN_NM_MSVC:
return "msvc";
case R_BIN_NM_RUST:
return "rust";
}
return NULL;
}
R_API int r_bin_demangle_type(const char *str) {
if (!str || !*str) {
return R_BIN_NM_NONE;

View File

@ -4,31 +4,6 @@
#include "../i/private.h"
#include "./cxx/demangle.h"
static inline bool is_cxx_symbol (const char *name) {
r_return_val_if_fail (name, false);
if (!strncmp (name, "_Z", 2)) {
return true;
}
if (!strncmp (name, "__Z", 3)) {
return true;
}
return false;
}
// TODO: deprecate
R_API bool r_bin_is_cxx (RBinFile *bf) {
RListIter *iter;
RBinImport *import;
RBinObject *o = bf->o;
// XXX this is too slow
r_list_foreach (o->imports, iter, import) {
if (is_cxx_symbol (import->name)) {
return true;
}
}
return false;
}
R_API char *r_bin_demangle_cxx(RBinFile *bf, const char *str, ut64 vaddr) {
// DMGL_TYPES | DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE
// | DMGL_RET_POSTFIX | DMGL_TYPES;

View File

@ -501,20 +501,17 @@ static RList* symbols(RBinFile *bf) {
}
static RList* imports(RBinFile *bf) {
struct Elf_(r_bin_elf_obj_t) *bin = NULL;
RBinElfSymbol *import = NULL;
RBinImport *ptr = NULL;
RList *ret = NULL;
int i;
if (!bf || !bf->o || !bf->o->bin_obj) {
return NULL;
}
bin = bf->o->bin_obj;
r_return_val_if_fail (bf && bf->o, NULL);
struct Elf_(r_bin_elf_obj_t) *elf = bf->o->bin_obj;
if (!(ret = r_list_newf (r_bin_import_free))) {
return NULL;
}
if (!(import = Elf_(r_bin_elf_get_imports) (bin))) {
if (!(import = Elf_(r_bin_elf_get_imports) (elf))) {
r_list_free (ret);
return NULL;
}
@ -526,7 +523,7 @@ static RList* imports(RBinFile *bf) {
ptr->bind = r_str_const (import[i].bind);
ptr->type = r_str_const (import[i].type);
ptr->ordinal = import[i].ordinal;
setimpord (bin, ptr->ordinal, ptr);
setimpord (elf, ptr->ordinal, ptr);
r_list_append (ret, ptr);
}
return ret;
@ -1013,8 +1010,6 @@ static RBinInfo* info(RBinFile *bf) {
if (!(ret = R_NEW0 (RBinInfo))) {
return NULL;
}
// XXX this is very slow. we shouldnt walk the imports all the time, just set the bit when loading them
ret->lang = r_bin_is_cxx (bf) ? "c++" : "c";
ret->file = bf->file
? strdup (bf->file)
: NULL;

View File

@ -8,25 +8,8 @@
#include "mdmp/mdmp.h"
/* FIXME: This is already in r_bin.c but its static, why?! */
static void r_bbin_mem_free(void *data) {
RBinMem *mem = (RBinMem *)data;
if (mem && mem->mirrors) {
mem->mirrors->free = r_bbin_mem_free;
r_list_free (mem->mirrors);
mem->mirrors = NULL;
}
free (mem);
}
static ut64 baddr(RBinFile *bf) {
return 0LL;
}
static Sdb *get_sdb(RBinFile *bf) {
if (!bf || !bf->o) {
return NULL;
}
r_return_val_if_fail (bf && bf->o, NULL);
struct r_bin_mdmp_obj *obj = (struct r_bin_mdmp_obj *)bf->o->bin_obj;
return (obj && obj->kv) ? obj->kv: NULL;
}
@ -331,7 +314,7 @@ static RList *mem(RBinFile *bf) {
ut64 index;
ut64 state, type, a_protect;
if (!(ret = r_list_newf (r_bbin_mem_free))) {
if (!(ret = r_list_newf (r_bin_mem_free))) {
return NULL;
}
@ -481,7 +464,6 @@ RBinPlugin r_bin_plugin_mdmp = {
.name = "mdmp",
.desc = "Minidump format r_bin plugin",
.license = "LGPL3",
.baddr = &baddr,
.destroy = &destroy,
.entries = entries,
.get_sdb = &get_sdb,

View File

@ -129,12 +129,15 @@ enum {
enum {
R_BIN_NM_NONE = 0,
R_BIN_NM_JAVA = 1,
R_BIN_NM_CXX = 1<<1,
R_BIN_NM_OBJC = 1<<2,
R_BIN_NM_SWIFT = 1<<3,
R_BIN_NM_DLANG = 1<<4,
R_BIN_NM_MSVC = 1<<5,
R_BIN_NM_RUST = 1<<6,
R_BIN_NM_C = 1<<1,
R_BIN_NM_GO = 1<<2,
R_BIN_NM_CXX = 1<<3,
R_BIN_NM_OBJC = 1<<4,
R_BIN_NM_SWIFT = 1<<5,
R_BIN_NM_DLANG = 1<<6,
R_BIN_NM_MSVC = 1<<7,
R_BIN_NM_RUST = 1<<8,
R_BIN_NM_BLOCKS = 1<<31,
R_BIN_NM_ANY = -1,
};
@ -731,6 +734,7 @@ R_API void r_bin_file_hash_free(RBinFileHash *fhash);
// binobject functions
R_API int r_bin_object_set_items(RBinFile *binfile, RBinObject *o);
R_API bool r_bin_object_delete(RBin *bin, ut32 binfile_id);
R_API void r_bin_mem_free(void *data);
// demangle functions
R_API char *r_bin_demangle(RBinFile *binfile, const char *lang, const char *str, ut64 vaddr);
@ -773,7 +777,6 @@ R_API char *r_bin_filter_name(RBinFile *bf, Sdb *db, ut64 addr, char *name);
R_API void r_bin_filter_sym(RBinFile *bf, HtPP *ht, ut64 vaddr, RBinSymbol *sym);
R_API bool r_bin_strpurge(RBin *bin, const char *str, ut64 addr);
R_API bool r_bin_string_filter(RBin *bin, const char *str, ut64 addr);
R_API bool r_bin_is_cxx(RBinFile *binfile);
/* plugin pointers */
extern RBinPlugin r_bin_plugin_any;