Refactor imports-related stuff from RzList to RzPVector (#3781)
+ Switch the member imports in RzBinPlugin from RzList to RzPVector + Also switch the member imports in RzBinObject from RzList to RzPVector to meet the refactor of RzBinPlugin + Modify the traverse and invocation related to the aforementioned changes + Remove the deprecated API rz_bin_get_imports
This commit is contained in:
parent
f0c932f2cf
commit
a5780a3855
36 changed files with 171 additions and 135 deletions
|
|
@ -610,12 +610,6 @@ RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinField *>*/ *rz_bin_get_fields(RZ_NO
|
|||
return o ? (RzList *)rz_bin_object_get_fields(o) : NULL;
|
||||
}
|
||||
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinImport *>*/ *rz_bin_get_imports(RZ_NONNULL RzBin *bin) {
|
||||
rz_return_val_if_fail(bin, NULL);
|
||||
RzBinObject *o = rz_bin_cur_object(bin);
|
||||
return o ? (RzList *)rz_bin_object_get_imports(o) : NULL;
|
||||
}
|
||||
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzBinInfo *rz_bin_get_info(RzBin *bin) {
|
||||
rz_return_val_if_fail(bin, NULL);
|
||||
RzBinObject *o = rz_bin_cur_object(bin);
|
||||
|
|
|
|||
|
|
@ -116,7 +116,9 @@ RZ_API RzBinLanguage rz_bin_language_detect(RzBinFile *binfile) {
|
|||
}
|
||||
|
||||
if (is_macho || is_elf) {
|
||||
rz_list_foreach (o->imports, iter, imp) {
|
||||
void **vec_it;
|
||||
rz_pvector_foreach (o->imports, vec_it) {
|
||||
imp = *vec_it;
|
||||
const char *name = imp->name;
|
||||
if (!strcmp(name, "_NSConcreteGlobalBlock")) {
|
||||
is_blocks = true;
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ RZ_IPI void rz_bin_object_free(RzBinObject *o) {
|
|||
rz_list_free(o->classes);
|
||||
rz_list_free(o->entries);
|
||||
rz_list_free(o->fields);
|
||||
rz_list_free(o->imports);
|
||||
rz_pvector_free(o->imports);
|
||||
rz_list_free(o->libs);
|
||||
rz_list_free(o->maps);
|
||||
rz_list_free(o->mem);
|
||||
|
|
@ -665,7 +665,7 @@ RZ_API const RzList /*<RzBinField *>*/ *rz_bin_object_get_fields(RZ_NONNULL RzBi
|
|||
/**
|
||||
* \brief Get list of \p RzBinImport representing the imports of the binary object.
|
||||
*/
|
||||
RZ_API const RzList /*<RzBinImport *>*/ *rz_bin_object_get_imports(RZ_NONNULL RzBinObject *obj) {
|
||||
RZ_API const RzPVector /*<RzBinImport *>*/ *rz_bin_object_get_imports(RZ_NONNULL RzBinObject *obj) {
|
||||
rz_return_val_if_fail(obj, NULL);
|
||||
return obj->imports;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,23 +32,23 @@ RZ_IPI RzBinProcessLanguage rz_bin_process_language_import(RzBinObject *o) {
|
|||
RZ_IPI void rz_bin_set_imports_from_plugin(RzBinFile *bf, RzBinObject *o) {
|
||||
RzBinPlugin *plugin = o->plugin;
|
||||
|
||||
rz_list_free(o->imports);
|
||||
rz_pvector_free(o->imports);
|
||||
if (!plugin->imports || !(o->imports = plugin->imports(bf))) {
|
||||
o->imports = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
o->imports = rz_pvector_new((RzPVectorFree)rz_bin_import_free);
|
||||
}
|
||||
rz_warn_if_fail(o->imports->free);
|
||||
}
|
||||
|
||||
RZ_IPI void rz_bin_process_imports(RzBinFile *bf, RzBinObject *o, const RzDemanglerPlugin *demangler, RzDemanglerFlag flags) {
|
||||
if (!demangler || rz_list_length(o->imports) < 1) {
|
||||
if (!demangler || rz_pvector_len(o->imports) < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
RzBinProcessLanguage language_cb = rz_bin_process_language_import(o);
|
||||
|
||||
RzListIter *it;
|
||||
void **it;
|
||||
RzBinImport *element;
|
||||
rz_list_foreach (o->imports, it, element) {
|
||||
rz_pvector_foreach (o->imports, it) {
|
||||
element = *it;
|
||||
if (!element->name) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -67,9 +67,10 @@ RZ_IPI void rz_bin_process_imports(RzBinFile *bf, RzBinObject *o, const RzDemang
|
|||
}
|
||||
|
||||
RZ_IPI void rz_bin_demangle_imports_with_flags(RzBinObject *o, const RzDemanglerPlugin *demangler, RzDemanglerFlag flags) {
|
||||
RzListIter *it;
|
||||
void **it;
|
||||
RzBinImport *element;
|
||||
rz_list_foreach (o->imports, it, element) {
|
||||
rz_pvector_foreach (o->imports, it) {
|
||||
element = *it;
|
||||
if (!element->name) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1392,21 +1392,21 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_dex_symbols(RZ_NONNULL RzBinDex
|
|||
}
|
||||
|
||||
/**
|
||||
* \brief Returns a RzList<RzBinImport*> containing the dex imports
|
||||
* \brief Returns a RzPVector<RzBinImport*> containing the dex imports
|
||||
*/
|
||||
RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex *dex) {
|
||||
RZ_API RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex *dex) {
|
||||
rz_return_val_if_fail(dex, NULL);
|
||||
|
||||
DexFieldId *field_id;
|
||||
DexMethodId *method_id;
|
||||
DexClassDef *class_def;
|
||||
RzList *imports = NULL;
|
||||
RzPVector *imports = NULL;
|
||||
ut32 *class_ids = NULL;
|
||||
void **vit;
|
||||
|
||||
ut32 n_classes = rz_pvector_len(dex->class_defs);
|
||||
if (n_classes < 1) {
|
||||
return rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
return rz_pvector_new((RzPVectorFree)rz_bin_import_free);
|
||||
}
|
||||
|
||||
class_ids = RZ_NEWS0(ut32, n_classes);
|
||||
|
|
@ -1421,7 +1421,7 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex
|
|||
j++;
|
||||
}
|
||||
|
||||
imports = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
imports = rz_pvector_new((RzPVectorFree)rz_bin_import_free);
|
||||
if (!imports) {
|
||||
free(class_ids);
|
||||
return NULL;
|
||||
|
|
@ -1453,7 +1453,7 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex
|
|||
import->type = RZ_BIN_TYPE_FIELD_STR;
|
||||
import->ordinal = ordinal;
|
||||
|
||||
if (!rz_list_append(imports, import)) {
|
||||
if (!rz_pvector_push(imports, import)) {
|
||||
rz_bin_import_free(import);
|
||||
break;
|
||||
}
|
||||
|
|
@ -1487,7 +1487,7 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex
|
|||
import->ordinal = ordinal;
|
||||
free(name);
|
||||
|
||||
if (!rz_list_append(imports, import)) {
|
||||
if (!rz_pvector_push(imports, import)) {
|
||||
rz_bin_import_free(import);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_dex_classes(RZ_NONNULL RzBinDex
|
|||
RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_dex_sections(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_dex_symbols(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzList /*<char *>*/ *rz_bin_dex_libraries(RZ_NONNULL RzBinDex *dex);
|
||||
RZ_API RZ_OWN RzBinAddr *rz_bin_dex_resolve_symbol(RZ_NONNULL RzBinDex *dex, RzBinSpecialSymbol resolve);
|
||||
RZ_API RZ_OWN RzList /*<RzBinAddr *>*/ *rz_bin_dex_entrypoints(RZ_NONNULL RzBinDex *dex);
|
||||
|
|
|
|||
|
|
@ -1551,12 +1551,12 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_const_pool_as_symbol
|
|||
}
|
||||
|
||||
/**
|
||||
* \brief Returns a RzList<RzBinImport*> containing the class const pool
|
||||
* \brief Returns a RzPVector<RzBinImport*> containing the class const pool
|
||||
*/
|
||||
RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_imports(RZ_NONNULL RzBinJavaClass *bin) {
|
||||
RZ_API RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_imports(RZ_NONNULL RzBinJavaClass *bin) {
|
||||
rz_return_val_if_fail(bin, NULL);
|
||||
|
||||
RzList *imports = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *imports = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!imports) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1604,7 +1604,7 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_import
|
|||
import->type = is_main ? RZ_BIN_TYPE_FUNC_STR : import_type(cpool);
|
||||
import->descriptor = java_class_constant_pool_stringify_at(bin, descriptor_index);
|
||||
import->ordinal = i;
|
||||
rz_list_append(imports, import);
|
||||
rz_pvector_push(imports, import);
|
||||
free(object);
|
||||
}
|
||||
}
|
||||
|
|
@ -1638,7 +1638,7 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_import
|
|||
import->bind = RZ_BIN_BIND_WEAK_STR;
|
||||
import->type = RZ_BIN_TYPE_IFACE_STR;
|
||||
import->ordinal = i;
|
||||
rz_list_append(imports, import);
|
||||
rz_pvector_push(imports, import);
|
||||
free(object);
|
||||
}
|
||||
}
|
||||
|
|
@ -2033,4 +2033,4 @@ RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_java_class_as_classes(RZ_NONNULL
|
|||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_java_class_fields_as_binfie
|
|||
RZ_API void rz_bin_java_class_fields_as_text(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL RzStrBuf *sb);
|
||||
RZ_API void rz_bin_java_class_fields_as_json(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL PJ *j);
|
||||
RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_const_pool_as_symbols(RZ_NONNULL RzBinJavaClass *bin);
|
||||
RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_imports(RZ_NONNULL RzBinJavaClass *bin);
|
||||
RZ_API RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_imports(RZ_NONNULL RzBinJavaClass *bin);
|
||||
RZ_API void rz_bin_java_class_const_pool_as_text(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL RzStrBuf *sb);
|
||||
RZ_API void rz_bin_java_class_const_pool_as_json(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL PJ *j);
|
||||
RZ_API RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_java_class_as_sections(RZ_NONNULL RzBinJavaClass *bin);
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ static RZ_BORROW RzBinImport *le_add_bin_import(rz_bin_le_obj_t *bin, const LE_i
|
|||
}
|
||||
import->bind = RZ_BIN_BIND_GLOBAL_STR;
|
||||
import->type = RZ_BIN_TYPE_UNKNOWN_STR;
|
||||
CHECK(rz_list_append(bin->imports, import));
|
||||
CHECK(rz_pvector_push(bin->imports, import));
|
||||
import->ordinal = ++bin->reloc_targets_count;
|
||||
return import;
|
||||
}
|
||||
|
|
@ -1508,7 +1508,7 @@ static void rz_bin_le_free(rz_bin_le_obj_t *bin) {
|
|||
rz_pvector_free(bin->imp_mod_names);
|
||||
rz_list_free(bin->symbols);
|
||||
rz_vector_free(bin->le_entries);
|
||||
rz_list_free(bin->imports);
|
||||
rz_pvector_free(bin->imports);
|
||||
ht_pp_free(bin->le_import_ht);
|
||||
rz_list_free(bin->le_relocs);
|
||||
free(bin);
|
||||
|
|
@ -1552,7 +1552,7 @@ bool rz_bin_le_load_buffer(RzBinFile *bf, RzBinObject *obj, RzBuffer *buf, Sdb *
|
|||
err_ctx = ", unable to build maps.";
|
||||
CHECK(bin->le_maps = le_create_maps(bin));
|
||||
err_ctx = ", unable to load imports.";
|
||||
CHECK(bin->imports = rz_list_newf((RzListFree)rz_bin_import_free));
|
||||
CHECK(bin->imports = rz_pvector_new((RzListFree)rz_bin_import_free));
|
||||
CHECK(bin->symbols = rz_list_newf((RzListFree)rz_bin_symbol_free));
|
||||
CHECK(bin->imp_mod_names = le_load_import_mod_names(bin));
|
||||
CHECK(bin->le_entries = le_load_entries(bin));
|
||||
|
|
@ -1570,13 +1570,13 @@ bool rz_bin_le_check_buffer(RzBuffer *b) {
|
|||
|
||||
static void no_free(void *unused) {}
|
||||
|
||||
RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_le_get_imports(RzBinFile *bf) {
|
||||
RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_le_get_imports(RzBinFile *bf) {
|
||||
rz_bin_le_obj_t *bin = bf->o->bin_obj;
|
||||
if (rz_list_empty(bin->imports)) {
|
||||
if (rz_pvector_empty(bin->imports)) {
|
||||
return NULL;
|
||||
}
|
||||
RzList *l = rz_list_clone(bin->imports);
|
||||
l->free = no_free; // silence assertion, there's no need to delete imports
|
||||
RzPVector *l = rz_pvector_clone(bin->imports);
|
||||
l->v.free_user = no_free; // silence assertion, there's no need to delete imports
|
||||
return l;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ typedef struct rz_bin_le_obj_s {
|
|||
RzPVector /*<char *>*/ *imp_mod_names;
|
||||
RzList /*<RzBinSymbol *>*/ *symbols;
|
||||
RzVector /*<LE_entry>*/ *le_entries;
|
||||
RzList /*<RzBinImport *>*/ *imports;
|
||||
RzPVector /*<RzBinImport *>*/ *imports;
|
||||
HtPP /*<LE_import *, NULL>*/ *le_import_ht;
|
||||
RzList /*<LE_reloc *>*/ *le_relocs;
|
||||
ut32 reloc_target_map_base;
|
||||
|
|
@ -107,7 +107,7 @@ RZ_OWN RzList /*<RzBinMap *>*/ *rz_bin_le_get_maps(RzBinFile *bf);
|
|||
RZ_OWN RzList /*<RzBinAddr *>*/ *rz_bin_le_get_entry_points(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_le_get_sections(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_le_get_symbols(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_le_get_imports(RzBinFile *bf);
|
||||
RZ_OWN RzPVector /*<RzBinImport *>*/ *rz_bin_le_get_imports(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<char *>*/ *rz_bin_le_get_libs(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<RzBinReloc *>*/ *rz_bin_le_get_relocs(RzBinFile *bf);
|
||||
RZ_OWN RzList /*<RzBinVirtualFile *>*/ *rz_bin_le_get_virtual_files(RzBinFile *bf);
|
||||
|
|
|
|||
|
|
@ -87,16 +87,17 @@ static void filter_import(ut8 *n) {
|
|||
}
|
||||
}
|
||||
|
||||
RzList /*<RzBinImport *>*/ *PE_(rz_bin_mdmp_pe_get_imports)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin) {
|
||||
RzPVector /*<RzBinImport *>*/ *PE_(rz_bin_mdmp_pe_get_imports)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin) {
|
||||
int i;
|
||||
ut64 offset;
|
||||
struct rz_bin_pe_import_t *imports = NULL;
|
||||
RzBinImport *ptr = NULL;
|
||||
RzBinReloc *rel;
|
||||
RzList *ret, *relocs;
|
||||
RzPVector *ret;
|
||||
RzList *relocs;
|
||||
|
||||
imports = PE_(rz_bin_pe_get_imports)(pe_bin->bin);
|
||||
ret = rz_list_new();
|
||||
ret = rz_pvector_new(NULL);
|
||||
relocs = rz_list_newf(free);
|
||||
|
||||
if (!imports || !ret || !relocs) {
|
||||
|
|
@ -117,7 +118,7 @@ RzList /*<RzBinImport *>*/ *PE_(rz_bin_mdmp_pe_get_imports)(struct PE_(rz_bin_md
|
|||
ptr->bind = "NONE";
|
||||
ptr->type = RZ_BIN_TYPE_FUNC_STR;
|
||||
ptr->ordinal = imports[i].ordinal;
|
||||
rz_list_append(ret, ptr);
|
||||
rz_pvector_push(ret, ptr);
|
||||
|
||||
if (!(rel = RZ_NEW0(RzBinReloc))) {
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ struct PE_(rz_bin_mdmp_pe_bin) {
|
|||
};
|
||||
|
||||
RzList /*<RzBinAddr *>*/ *PE_(rz_bin_mdmp_pe_get_entrypoint)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin);
|
||||
RzList /*<RzBinImport *>*/ *PE_(rz_bin_mdmp_pe_get_imports)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin);
|
||||
RzPVector /*<RzBinImport *>*/ *PE_(rz_bin_mdmp_pe_get_imports)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin);
|
||||
RzList /*<RzBinSection *>*/ *PE_(rz_bin_mdmp_pe_get_sections)(struct PE_(rz_bin_mdmp_pe_bin) * pe_bin);
|
||||
RzList /*<RzBinSymbol *>*/ *PE_(rz_bin_mdmp_pe_get_symbols)(RzBin *rbin, struct PE_(rz_bin_mdmp_pe_bin) * pe_bin);
|
||||
|
||||
|
|
|
|||
|
|
@ -354,8 +354,8 @@ static bool __ne_get_resources(rz_bin_ne_obj_t *bin) {
|
|||
return true;
|
||||
}
|
||||
|
||||
RzList /*<RzBinImport *>*/ *rz_bin_ne_get_imports(rz_bin_ne_obj_t *bin) {
|
||||
RzList *imports = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector /*<RzBinImport *>*/ *rz_bin_ne_get_imports(rz_bin_ne_obj_t *bin) {
|
||||
RzPVector *imports = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!imports) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -383,7 +383,7 @@ RzList /*<RzBinImport *>*/ *rz_bin_ne_get_imports(rz_bin_ne_obj_t *bin) {
|
|||
name[sz] = '\0';
|
||||
imp->name = name;
|
||||
imp->ordinal = i + 1;
|
||||
rz_list_append(imports, imp);
|
||||
rz_pvector_push(imports, imp);
|
||||
off += sz;
|
||||
}
|
||||
bin->imports = imports;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ typedef struct {
|
|||
RzList /*<RzBinSection *>*/ *segments;
|
||||
RzList /*<RzBinAddr *>*/ *entries;
|
||||
RzList /*<rz_ne_resource *>*/ *resources;
|
||||
RzList /*<RzBinImport *>*/ *imports;
|
||||
RzPVector /*<RzBinImport *>*/ *imports;
|
||||
RzList /*<RzBinSymbol *>*/ *symbols;
|
||||
char *os;
|
||||
} rz_bin_ne_obj_t;
|
||||
|
|
@ -39,7 +39,7 @@ typedef struct {
|
|||
void rz_bin_ne_free(rz_bin_ne_obj_t *bin);
|
||||
rz_bin_ne_obj_t *rz_bin_ne_new_buf(RzBuffer *buf, bool verbose);
|
||||
RzList /*<RzBinReloc *>*/ *rz_bin_ne_get_relocs(rz_bin_ne_obj_t *bin);
|
||||
RzList /*<RzBinImport *>*/ *rz_bin_ne_get_imports(rz_bin_ne_obj_t *bin);
|
||||
RzPVector /*<RzBinImport *>*/ *rz_bin_ne_get_imports(rz_bin_ne_obj_t *bin);
|
||||
RzList /*<RzBinSymbol *>*/ *rz_bin_ne_get_symbols(rz_bin_ne_obj_t *bin);
|
||||
RzList /*<RzBinSection *>*/ *rz_bin_ne_get_segments(rz_bin_ne_obj_t *bin);
|
||||
RzList /*<RzBinAddr *>*/ *rz_bin_ne_get_entrypoints(rz_bin_ne_obj_t *bin);
|
||||
|
|
|
|||
|
|
@ -96,8 +96,8 @@ static void walkSymbols(RzBuffer *buf, RzBinNXOObj *bin, ut64 symtab, ut64 strta
|
|||
if (!imp->bind) {
|
||||
goto out_walk_symbol;
|
||||
}
|
||||
imp->ordinal = bin->imports_list->length;
|
||||
rz_list_append(bin->imports_list, imp);
|
||||
imp->ordinal = bin->imports_vec->v.len;
|
||||
rz_pvector_push(bin->imports_vec, imp);
|
||||
sym->is_imported = true;
|
||||
sym->name = strdup(symName);
|
||||
if (!sym->name) {
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ typedef struct {
|
|||
typedef struct {
|
||||
ut32 *strings;
|
||||
RzList /*<RzBinSymbol *>*/ *methods_list;
|
||||
RzList /*<RzBinImport *>*/ *imports_list;
|
||||
RzPVector /*<RzBinImport *>*/ *imports_vec;
|
||||
RZ_NULLABLE RzBuffer *decompressed; /// nso-only
|
||||
void *header;
|
||||
} RzBinNXOObj;
|
||||
|
|
|
|||
|
|
@ -355,10 +355,10 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
int i;
|
||||
struct rz_bin_coff_obj *obj = (struct rz_bin_coff_obj *)bf->o->bin_obj;
|
||||
RzList *ret = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *ret = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -367,7 +367,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
for (i = 0; i < obj->hdr.f_nsyms; i++) {
|
||||
RzBinImport *ptr = ht_up_find(obj->imp_ht, i, NULL);
|
||||
if (ptr) {
|
||||
rz_list_append(ret, ptr);
|
||||
rz_pvector_push(ret, ptr);
|
||||
}
|
||||
i += obj->symbols[i].n_numaux;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ static RzList /*<RzBinClass *>*/ *classes(RzBinFile *bf) {
|
|||
return rz_bin_dex_classes(dex);
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzBinDex *dex = rz_bin_file_get_dex(bf);
|
||||
if (!dex) {
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ typedef struct rz_bin_reloc_formular_symbols_t {
|
|||
|
||||
static RzBinInfo *info(RzBinFile *bf);
|
||||
static void patch_relocs(RzBinFile *bf, struct Elf_(rz_bin_elf_obj_t) * bin);
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf);
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf);
|
||||
|
||||
struct special_symbol_translation {
|
||||
RzBinSpecialSymbol symbol;
|
||||
|
|
@ -1669,7 +1669,7 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
rz_return_val_if_fail(bf && bf->o, NULL);
|
||||
|
||||
ELFOBJ *bin = bf->o->bin_obj;
|
||||
|
|
@ -1678,7 +1678,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
RzList *result = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *result = rz_pvector_new((RzPVectorFree)rz_bin_import_free);
|
||||
if (!result) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1687,11 +1687,11 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
rz_bin_elf_foreach_imports(bin, import) {
|
||||
RzBinImport *tmp = convert_import(import);
|
||||
if (!tmp) {
|
||||
rz_list_free(result);
|
||||
rz_pvector_free(result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rz_list_append(result, tmp);
|
||||
rz_pvector_push(result, tmp);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -1788,17 +1788,21 @@ static void lookup_sections(RzBinFile *bf, RzBinInfo *ret) {
|
|||
|
||||
static bool has_sanitizers(RzBinFile *bf) {
|
||||
bool ret = false;
|
||||
RzList *imports_list = imports(bf);
|
||||
RzListIter *iter;
|
||||
RzPVector *imports_vec = imports(bf);
|
||||
if (!imports_vec) {
|
||||
return ret;
|
||||
}
|
||||
void **iter;
|
||||
RzBinImport *import;
|
||||
rz_list_foreach (imports_list, iter, import) {
|
||||
rz_pvector_foreach (imports_vec, iter) {
|
||||
import = *iter;
|
||||
if (strstr(import->name, "__sanitizer") ||
|
||||
strstr(import->name, "__ubsan")) {
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
rz_list_free(imports_list);
|
||||
rz_pvector_free(imports_vec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ static RzList /*<RzBinClass *>*/ *classes(RzBinFile *bf) {
|
|||
return rz_bin_java_class_as_classes(jclass);
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzBinJavaClass *jclass = rz_bin_file_get_java_class(bf);
|
||||
if (!jclass) {
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -319,7 +319,7 @@ static RzBinImport *import_from_name(RzBin *rbin, const char *orig_name, HtPP *i
|
|||
typedef struct {
|
||||
RzBin *bin;
|
||||
struct MACH0_(obj_t) * obj;
|
||||
RzList /*<RzBinImport *>*/ *imports_dst;
|
||||
RzPVector /*<RzBinImport *>*/ *imports_dst;
|
||||
} ImportsForeachCtx;
|
||||
|
||||
static void imports_foreach_cb(char *name, int ord, void *user) {
|
||||
|
|
@ -343,11 +343,11 @@ static void imports_foreach_cb(char *name, int ord, void *user) {
|
|||
if (!strcmp(name, "_NSConcreteGlobalBlock")) {
|
||||
ctx->obj->has_blocks_ext = true;
|
||||
}
|
||||
rz_list_append(ctx->imports_dst, ptr);
|
||||
rz_pvector_push(ctx->imports_dst, ptr);
|
||||
free(name);
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzBinObject *obj = bf ? bf->o : NULL;
|
||||
struct MACH0_(obj_t) *bin = bf ? bf->o->bin_obj : NULL;
|
||||
if (!obj || !bin || !obj->bin_obj) {
|
||||
|
|
@ -357,7 +357,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
bin->has_retguard = -1;
|
||||
bin->has_sanitizers = false;
|
||||
bin->has_blocks_ext = false;
|
||||
RzList *ret = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *ret = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -400,14 +400,14 @@ static RzList /*<RzBinReloc *>*/ *mdmp_relocs(RzBinFile *bf) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *mdmp_imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *mdmp_imports(RzBinFile *bf) {
|
||||
MiniDmpObj *obj;
|
||||
struct Pe32_rz_bin_mdmp_pe_bin *pe32_bin;
|
||||
struct Pe64_rz_bin_mdmp_pe_bin *pe64_bin;
|
||||
RzList *list;
|
||||
RzPVector *vec;
|
||||
RzListIter *it;
|
||||
|
||||
RzList *ret = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *ret = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -415,17 +415,27 @@ static RzList /*<RzBinImport *>*/ *mdmp_imports(RzBinFile *bf) {
|
|||
obj = (MiniDmpObj *)bf->o->bin_obj;
|
||||
|
||||
rz_list_foreach (obj->pe32_bins, it, pe32_bin) {
|
||||
list = Pe32_rz_bin_mdmp_pe_get_imports(pe32_bin);
|
||||
if (list) {
|
||||
rz_list_join(ret, list);
|
||||
rz_list_free(list);
|
||||
vec = Pe32_rz_bin_mdmp_pe_get_imports(pe32_bin);
|
||||
if (vec) {
|
||||
void **vec_it;
|
||||
rz_pvector_foreach (vec, vec_it) {
|
||||
RzBinImport *import = *vec_it;
|
||||
rz_pvector_push(ret, import);
|
||||
}
|
||||
// this won't free import
|
||||
rz_pvector_free(vec);
|
||||
}
|
||||
}
|
||||
rz_list_foreach (obj->pe64_bins, it, pe64_bin) {
|
||||
list = Pe64_rz_bin_mdmp_pe_get_imports(pe64_bin);
|
||||
if (list) {
|
||||
rz_list_join(ret, list);
|
||||
rz_list_free(list);
|
||||
vec = Pe64_rz_bin_mdmp_pe_get_imports(pe64_bin);
|
||||
if (vec) {
|
||||
void **vec_it;
|
||||
rz_pvector_foreach (vec, vec_it) {
|
||||
RzBinImport *import = *vec_it;
|
||||
rz_pvector_push(ret, import);
|
||||
}
|
||||
// this won't free import
|
||||
rz_pvector_free(vec);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
|
|||
return rz_bin_ne_get_symbols(bf->o->bin_obj);
|
||||
}
|
||||
|
||||
RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
return rz_bin_ne_get_imports(bf->o->bin_obj);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ static bool load_buffer(RzBinFile *bf, RzBinObject *obj, RzBuffer *b, Sdb *sdb)
|
|||
|
||||
ut64 ba = baddr(bf);
|
||||
bin->methods_list = rz_list_newf((RzListFree)rz_bin_symbol_free);
|
||||
bin->imports_list = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
bin->imports_vec = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
parseMod(b, bin, mod0, ba);
|
||||
obj->bin_obj = bin;
|
||||
|
||||
|
|
@ -277,13 +277,13 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
|
|||
return bin->methods_list;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzBinNXOObj *bin;
|
||||
if (!bf || !bf->o || !bf->o->bin_obj) {
|
||||
return NULL;
|
||||
}
|
||||
bin = (RzBinNXOObj *)bf->o->bin_obj;
|
||||
return bin->imports_list;
|
||||
return bin->imports_vec;
|
||||
}
|
||||
|
||||
static RzList /*<char *>*/ *libs(RzBinFile *bf) {
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -409,7 +409,7 @@ static void filter_import(ut8 *n) {
|
|||
}
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzList *relocs = NULL;
|
||||
RzBinImport *ptr = NULL;
|
||||
RzBinReloc *rel = NULL;
|
||||
|
|
@ -419,7 +419,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
if (!bf || !bf->o || !bf->o->bin_obj) {
|
||||
return NULL;
|
||||
}
|
||||
RzList *ret = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *ret = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -430,7 +430,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
}
|
||||
|
||||
if (!(relocs = rz_list_newf(free))) {
|
||||
free(ret);
|
||||
rz_pvector_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
((struct PE_(rz_bin_pe_obj_t) *)bf->o->bin_obj)->relocs = relocs;
|
||||
|
|
@ -451,7 +451,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
// NOTE(eddyb) a PE hint is just an optional possible DLL export table
|
||||
// index for the import. There is no point in exposing it.
|
||||
// ptr->hint = imports[i].hint;
|
||||
rz_list_append(ret, ptr);
|
||||
rz_pvector_push(ret, ptr);
|
||||
|
||||
if (!(rel = RZ_NEW0(RzBinReloc))) {
|
||||
break;
|
||||
|
|
@ -593,11 +593,11 @@ static bool is_vb6(RzBinFile *bf) {
|
|||
static int has_canary(RzBinFile *bf) {
|
||||
// XXX: We only need imports here but this causes leaks, we need to wait for the below. This is a horrible solution!
|
||||
// TODO: use O(1) when imports sdbized
|
||||
RzListIter *iter;
|
||||
struct PE_(rz_bin_pe_obj_t) *bin = bf->o->bin_obj;
|
||||
if (bin) {
|
||||
const RzList *relocs_list = bin->relocs;
|
||||
RzBinReloc *rel;
|
||||
RzListIter *iter;
|
||||
if (relocs_list) {
|
||||
rz_list_foreach (relocs_list, iter, rel) {
|
||||
if (!strcmp(rel->import->name, "__security_init_cookie")) {
|
||||
|
|
@ -606,10 +606,12 @@ static int has_canary(RzBinFile *bf) {
|
|||
}
|
||||
}
|
||||
} else { // rz_bin needs this as it will not initialise bin
|
||||
const RzList *imports_list = imports(bf);
|
||||
const RzPVector *imports_vec = imports(bf);
|
||||
RzBinImport *imp;
|
||||
if (imports_list) {
|
||||
rz_list_foreach (imports_list, iter, imp) {
|
||||
void **vec_it;
|
||||
if (imports_vec) {
|
||||
rz_pvector_foreach (imports_vec, vec_it) {
|
||||
imp = *vec_it;
|
||||
if (!strcmp(imp->name, "__security_init_cookie")) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ bad_alloc:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
static RzPVector /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
||||
RzBinWasmObj *bin = NULL;
|
||||
RzList *imports = NULL;
|
||||
RzBinImport *ptr = NULL;
|
||||
|
|
@ -231,7 +231,7 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
return NULL;
|
||||
}
|
||||
bin = bf->o->bin_obj;
|
||||
RzList *ret = rz_list_newf((RzListFree)rz_bin_import_free);
|
||||
RzPVector *ret = rz_pvector_new((RzListFree)rz_bin_import_free);
|
||||
if (!ret) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -264,12 +264,12 @@ static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
|
|||
ptr->type = "GLOBAL";
|
||||
break;
|
||||
}
|
||||
rz_list_append(ret, ptr);
|
||||
rz_pvector_push(ret, ptr);
|
||||
}
|
||||
return ret;
|
||||
bad_alloc:
|
||||
rz_list_free(imports);
|
||||
rz_list_free(ret);
|
||||
rz_pvector_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1233,10 +1233,11 @@ RZ_API bool rz_core_bin_apply_imports(RzCore *core, RzBinFile *binfile, bool va)
|
|||
if (cdsz <= 0) {
|
||||
return false;
|
||||
}
|
||||
RzListIter *iter;
|
||||
void **iter;
|
||||
RzBinImport *import;
|
||||
RzList *imports = o->imports;
|
||||
rz_list_foreach (imports, iter, import) {
|
||||
RzPVector *imports = o->imports;
|
||||
rz_pvector_foreach (imports, iter) {
|
||||
import = *iter;
|
||||
if (!import->libname || !strstr(import->libname, ".dll")) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2034,16 +2035,17 @@ RZ_API bool rz_core_bin_imports_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinF
|
|||
rz_return_val_if_fail(core && bf && bf->o && state, false);
|
||||
|
||||
int va = (core->io->va || core->bin->is_debugger) ? VA_TRUE : VA_FALSE;
|
||||
const RzList *imports = rz_bin_object_get_imports(bf->o);
|
||||
const RzPVector *imports = rz_bin_object_get_imports(bf->o);
|
||||
RzBinObject *o = bf->o;
|
||||
RzBinImport *import;
|
||||
RzListIter *iter;
|
||||
void **iter;
|
||||
bool demangle = rz_config_get_b(core->config, "bin.demangle");
|
||||
|
||||
rz_cmd_state_output_array_start(state);
|
||||
rz_cmd_state_output_set_columnsf(state, "nXssss", "nth", "vaddr", "bind", "type", "lib", "name");
|
||||
|
||||
rz_list_foreach (imports, iter, import) {
|
||||
rz_pvector_foreach (imports, iter) {
|
||||
import = *iter;
|
||||
if (!import->name) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1081,8 +1081,11 @@ RZ_API bool rz_core_bin_load(RZ_NONNULL RzCore *r, RZ_NULLABLE const char *filen
|
|||
rz_config_set_b(r->config, "bin.at", true);
|
||||
RZ_LOG_INFO("Linking imports...\n");
|
||||
RzBinImport *imp;
|
||||
RzList *imports = rz_bin_get_imports(r->bin);
|
||||
rz_list_foreach (imports, iter, imp) {
|
||||
RzBinObject *bin_obj = rz_bin_cur_object(r->bin);
|
||||
const RzPVector *imports = rz_bin_object_get_imports(bin_obj);
|
||||
void **vec_iter;
|
||||
rz_pvector_foreach (imports, vec_iter) {
|
||||
imp = *vec_iter;
|
||||
char *name = rz_str_newf("sym.imp.%s", imp->name);
|
||||
rz_name_filter(name + 8, strlen(name + 8) + 1, true);
|
||||
|
||||
|
|
|
|||
|
|
@ -153,9 +153,10 @@ RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *>*/ *rz_core_graph_importxrefs(RZ_NONN
|
|||
}
|
||||
|
||||
bool va = core->io->va || core->bin->is_debugger;
|
||||
RzListIter *iter;
|
||||
void **iter;
|
||||
RzBinImport *imp;
|
||||
rz_list_foreach (obj->imports, iter, imp) {
|
||||
rz_pvector_foreach (obj->imports, iter) {
|
||||
imp = *iter;
|
||||
RzBinSymbol *sym = rz_bin_object_get_symbol_of_import(obj, imp);
|
||||
ut64 addr = sym ? (va ? rz_bin_object_get_vaddr(obj, sym->paddr, sym->vaddr) : sym->paddr) : UT64_MAX;
|
||||
if (addr && addr != UT64_MAX) {
|
||||
|
|
|
|||
|
|
@ -2569,9 +2569,12 @@ RZ_API int rz_core_cmd_foreach3(RzCore *core, const char *cmd, char *each) { //
|
|||
{
|
||||
RzBinImport *imp;
|
||||
ut64 offorig = core->offset;
|
||||
list = rz_bin_get_imports(core->bin);
|
||||
RzBinObject *bin_obj = rz_bin_cur_object(core->bin);
|
||||
const RzPVector *imports = rz_bin_object_get_imports(bin_obj);
|
||||
void **vec_iter = NULL;
|
||||
RzList *lost = rz_list_newf(free);
|
||||
rz_list_foreach (list, iter, imp) {
|
||||
rz_pvector_foreach (imports, vec_iter) {
|
||||
imp = *vec_iter;
|
||||
char *impflag = rz_str_newf("sym.imp.%s", imp->name);
|
||||
ut64 addr = rz_num_math(core->num, impflag);
|
||||
ut64 *n = RZ_NEW(ut64);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef RZ_BIN_H
|
||||
#define RZ_BIN_H
|
||||
|
||||
#include "rz_vector.h"
|
||||
#include <rz_util.h>
|
||||
#include <rz_types.h>
|
||||
#include <rz_io.h>
|
||||
|
|
@ -268,7 +269,7 @@ typedef struct rz_bin_object_t {
|
|||
RzList /*<RzBinVirtualFile *>*/ *vfiles;
|
||||
RzList /*<RzBinMap *>*/ *maps;
|
||||
RzList /*<RzBinSection *>*/ *sections;
|
||||
RzList /*<RzBinImport *>*/ *imports;
|
||||
RzPVector /*<RzBinImport *>*/ *imports;
|
||||
RzList /*<RzBinSymbol *>*/ *symbols;
|
||||
RzList /*<RzBinResource *>*/ *resources;
|
||||
/**
|
||||
|
|
@ -532,7 +533,7 @@ typedef struct rz_bin_plugin_t {
|
|||
RzList /*<RzBinSection *>*/ *(*sections)(RzBinFile *bf);
|
||||
RZ_OWN RzBinSourceLineInfo *(*lines)(RzBinFile *bf); //< only called once on load, ownership is transferred to the caller
|
||||
RzList /*<RzBinSymbol *>*/ *(*symbols)(RzBinFile *bf);
|
||||
RzList /*<RzBinImport *>*/ *(*imports)(RzBinFile *bf);
|
||||
RzPVector /*<RzBinImport *>*/ *(*imports)(RzBinFile *bf);
|
||||
RzList /*<RzBinString *>*/ *(*strings)(RzBinFile *bf);
|
||||
RzBinInfo *(*info)(RzBinFile *bf);
|
||||
RzList /*<RzBinField *>*/ *(*fields)(RzBinFile *bf);
|
||||
|
|
@ -919,7 +920,6 @@ RZ_API RZ_OWN RzList /*<RzBinString *>*/ *rz_bin_file_strings(RZ_NONNULL RzBinFi
|
|||
// use RzBinFile instead
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinAddr *>*/ *rz_bin_get_entries(RZ_NONNULL RzBin *bin);
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinField *>*/ *rz_bin_get_fields(RZ_NONNULL RzBin *bin);
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinImport *>*/ *rz_bin_get_imports(RZ_NONNULL RzBin *bin);
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<char *>*/ *rz_bin_get_libs(RZ_NONNULL RzBin *bin);
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinSection *>*/ *rz_bin_get_sections(RZ_NONNULL RzBin *bin);
|
||||
RZ_DEPRECATE RZ_API RZ_BORROW RzList /*<RzBinClass *>*/ *rz_bin_get_classes(RZ_NONNULL RzBin *bin);
|
||||
|
|
@ -931,7 +931,7 @@ RZ_API RzList /*<RzBinTrycatch *>*/ *rz_bin_file_get_trycatch(RZ_NONNULL RzBinFi
|
|||
|
||||
RZ_API const RzList /*<RzBinAddr *>*/ *rz_bin_object_get_entries(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzList /*<RzBinField *>*/ *rz_bin_object_get_fields(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzList /*<RzBinImport *>*/ *rz_bin_object_get_imports(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzPVector /*<RzBinImport *>*/ *rz_bin_object_get_imports(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzBinInfo *rz_bin_object_get_info(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzList /*<char *>*/ *rz_bin_object_get_libs(RZ_NONNULL RzBinObject *obj);
|
||||
RZ_API const RzList /*<RzBinSection *>*/ *rz_bin_object_get_sections_all(RZ_NONNULL RzBinObject *obj);
|
||||
|
|
|
|||
|
|
@ -707,6 +707,12 @@ static const void *rz_diff_list_elem_at(const RzList /*<void *>*/ *array, ut32 i
|
|||
return rz_list_get_n(array, index);
|
||||
}
|
||||
|
||||
/**************************************** rzpvector ***************************************/
|
||||
|
||||
static const void *rz_diff_pvector_elem_at(const RzPVector /*<void *>*/ *array, ut32 index) {
|
||||
return rz_pvector_at(array, index);
|
||||
}
|
||||
|
||||
/**************************************** imports ***************************************/
|
||||
|
||||
static ut32 import_hash(const RzBinImport *elem) {
|
||||
|
|
@ -730,31 +736,31 @@ static int import_compare(const RzBinImport *a, const RzBinImport *b) {
|
|||
}
|
||||
|
||||
static RzDiff *rz_diff_imports_new(DiffFile *dfile_a, DiffFile *dfile_b) {
|
||||
RzList *list_a = NULL;
|
||||
RzList *list_b = NULL;
|
||||
RzPVector *vec_a = NULL;
|
||||
RzPVector *vec_b = NULL;
|
||||
|
||||
list_a = rz_diff_file_get(dfile_a, imports);
|
||||
if (!list_a) {
|
||||
vec_a = rz_diff_file_get(dfile_a, imports);
|
||||
if (!vec_a) {
|
||||
rz_diff_error_ret(NULL, "cannot get imports from '%s'\n", dfile_a->dio->filename);
|
||||
}
|
||||
|
||||
list_b = rz_diff_file_get(dfile_b, imports);
|
||||
if (!list_b) {
|
||||
vec_b = rz_diff_file_get(dfile_b, imports);
|
||||
if (!vec_b) {
|
||||
rz_diff_error_ret(NULL, "cannot get imports from '%s'\n", dfile_b->dio->filename);
|
||||
}
|
||||
|
||||
rz_list_sort(list_a, (RzListComparator)import_compare);
|
||||
rz_list_sort(list_b, (RzListComparator)import_compare);
|
||||
rz_pvector_sort(vec_a, (RzPVectorComparator)import_compare);
|
||||
rz_pvector_sort(vec_b, (RzPVectorComparator)import_compare);
|
||||
|
||||
RzDiffMethods methods = {
|
||||
.elem_at = (RzDiffMethodElemAt)rz_diff_list_elem_at,
|
||||
.elem_at = (RzDiffMethodElemAt)rz_diff_pvector_elem_at,
|
||||
.elem_hash = (RzDiffMethodElemHash)import_hash,
|
||||
.compare = (RzDiffMethodCompare)import_compare,
|
||||
.stringify = (RzDiffMethodStringify)import_stringify,
|
||||
.ignore = NULL,
|
||||
};
|
||||
|
||||
return rz_diff_generic_new(list_a, rz_list_length(list_a), list_b, rz_list_length(list_b), &methods);
|
||||
return rz_diff_generic_new(vec_a, rz_pvector_len(vec_a), vec_b, rz_pvector_len(vec_b), &methods);
|
||||
}
|
||||
|
||||
/**************************************** symbols ***************************************/
|
||||
|
|
|
|||
|
|
@ -226,8 +226,10 @@ static int rzfind_open_file(RzfindOptions *ro, const char *file, const ut8 *data
|
|||
|
||||
if (ro->import || ro->symbol) {
|
||||
RzBinFile *bf;
|
||||
const RzList *symbols, *imports;
|
||||
const RzList *symbols;
|
||||
const RzPVector *imports;
|
||||
RzListIter *iter, *it;
|
||||
void **vec_it;
|
||||
RzBinSymbol *symbol;
|
||||
RzBinImport *import;
|
||||
RzBin *bin = rz_bin_new();
|
||||
|
|
@ -254,7 +256,8 @@ static int rzfind_open_file(RzfindOptions *ro, const char *file, const ut8 *data
|
|||
if (!kw) {
|
||||
continue;
|
||||
}
|
||||
rz_list_foreach (imports, it, import) {
|
||||
rz_pvector_foreach (imports, vec_it) {
|
||||
import = *vec_it;
|
||||
if (!strcmp(import->name, kw)) {
|
||||
printf("ordinal: %d %s\n", import->ordinal, kw);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,13 +33,15 @@ bool test_rz_bin(void) {
|
|||
mu_assert_eq(entry->vaddr, 0x8048360, "entry virtual address");
|
||||
mu_assert_eq(entry->paddr, 0x360, "entry file offset");
|
||||
|
||||
const RzList *imports = rz_bin_object_get_imports(obj);
|
||||
mu_assert_eq(rz_list_length(imports), 5, "rz_bin_object_get_imports");
|
||||
const RzPVector *imports = rz_bin_object_get_imports(obj);
|
||||
mu_assert_eq(rz_pvector_len(imports), 5, "rz_bin_object_get_imports");
|
||||
const char *import_names[] = { "__libc_start_main", "printf", "scanf", "strcmp", "__gmon_start__" };
|
||||
bool has_import_names[sizeof(import_names)] = { 0 };
|
||||
RzBinImport *import;
|
||||
RzListIter *it;
|
||||
rz_list_foreach (imports, it, import) {
|
||||
void **vec_it;
|
||||
rz_pvector_foreach (imports, vec_it) {
|
||||
import = *vec_it;
|
||||
for (int i = 0; i < RZ_ARRAY_SIZE(import_names); ++i) {
|
||||
if (!strcmp(import->name, import_names[i])) {
|
||||
has_import_names[i] = true;
|
||||
|
|
|
|||
|
|
@ -67,12 +67,14 @@ bool test_rz_bin_symbols(void) {
|
|||
}
|
||||
}
|
||||
mu_assert_eq(matches, expected, "all checked symbols match");
|
||||
|
||||
const RzList *imports = rz_bin_object_get_imports(obj);
|
||||
|
||||
const RzPVector *imports = rz_bin_object_get_imports(obj);
|
||||
void **vec_it = NULL;
|
||||
mu_assert_notnull(symbols, "mipsbe-ip imports");
|
||||
matches = 0;
|
||||
expected = RZ_ARRAY_SIZE(mipsbe_ip_imports) - 1;
|
||||
rz_list_foreach (imports, it, sym) {
|
||||
rz_pvector_foreach (imports, vec_it) {
|
||||
sym = *vec_it;
|
||||
for (int i = 0; i < expected; i++) {
|
||||
if (sym && sym->name && !strcmp(sym->name, mipsbe_ip_imports[i].name)) {
|
||||
matches++;
|
||||
|
|
@ -80,7 +82,7 @@ bool test_rz_bin_symbols(void) {
|
|||
}
|
||||
}
|
||||
mu_assert_eq(matches, expected, "all checked imports match");
|
||||
|
||||
|
||||
rz_bin_free(bin);
|
||||
rz_io_free(io);
|
||||
mu_end;
|
||||
|
|
|
|||
Loading…
Reference in a new issue