bfelf64_sword bfelf_file_resolve_symbol(struct bfelf_file_t *ef, struct e_string_t *name, void **addr) { bfelf64_sword ret = 0; struct bfelf_sym *found_sym = 0; if (!ef) return invalid_argument("ef == NULL"); if (!name) return invalid_argument("name == NULL"); if (!addr) return invalid_argument("addr == NULL"); if (ef->relocated == 0) return out_of_order("you need to call bfelf_loader_relocate first"); ret = private_symbol_by_name(ef, name, &found_sym); if (ret != BFELF_SUCCESS) return ret; ret = private_resolve_symbol(ef, found_sym, addr); if (ret != BFELF_SUCCESS) return ret; return BFELF_SUCCESS; }
int64_t bfelf_loader_resolve_symbol(struct bfelf_loader_t *loader, struct e_string_t *name, void **addr) { int64_t ret = 0; struct bfelf_sym *found_sym = 0; struct bfelf_file_t *found_ef = 0; if (!loader) return invalid_argument("loader == NULL"); if (!name) return invalid_argument("name == NULL"); if (!addr) return invalid_argument("addr == NULL"); if (loader->relocated == 0) return out_of_order("you need to call bfelf_loader_relocate first"); ret = private_symbol_global(loader, name, &found_ef, &found_sym); if (ret != BFELF_SUCCESS) return ret; ret = private_resolve_symbol(found_ef, found_sym, addr); if (ret != BFELF_SUCCESS) return ret; return BFELF_SUCCESS; }