mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-13 18:32:56 +00:00
Get rid of the ELF-specific C++ detection ##bin (#14285)
This commit is contained in:
parent
68d7b25b31
commit
d06a77d731
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user