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; }
bfelf64_sword bfelf_loader_get_info(struct bfelf_loader_t *loader, struct bfelf_file_t *ef, struct section_info_t *info) { bfelf64_sword ret = 0; struct bfelf_shdr *shdr = 0; struct e_string_t name_ctors = {".ctors", 6}; struct e_string_t name_dtors = {".dtors", 6}; struct e_string_t name_eh_frame = {".eh_frame", 9}; if (!loader) return invalid_argument("loader == NULL"); if (!ef) return invalid_argument("ef == NULL"); if (!info) return invalid_argument("info == NULL"); if (loader->relocated == 0) return out_of_order("you need to call bfelf_loader_relocate first"); ret = private_get_section_by_name(ef, &name_ctors, &shdr); if (ret != BFELF_SUCCESS) goto failure; if (shdr != 0) { ret = private_check_section(shdr, bfsht_progbits, bfshf_wa, 8, 0); if (ret != BFELF_SUCCESS) goto failure; info->ctors_addr = shdr->sh_addr + ef->exec; info->ctors_size = shdr->sh_size; } ret = private_get_section_by_name(ef, &name_dtors, &shdr); if (ret != BFELF_SUCCESS) goto failure; if (shdr != 0) { ret = private_check_section(shdr, bfsht_progbits, bfshf_wa, 8, 0); if (ret != BFELF_SUCCESS) goto failure; info->dtors_addr = shdr->sh_addr + ef->exec; info->dtors_size = shdr->sh_size; } ret = private_get_section_by_name(ef, &name_eh_frame, &shdr); if (ret != BFELF_SUCCESS) goto failure; if (shdr != 0) { ret = private_check_section(shdr, bfsht_progbits, bfshf_wa, 8, 0); if (ret != BFELF_SUCCESS) goto failure; info->eh_frame_addr = shdr->sh_addr + ef->exec; info->eh_frame_size = shdr->sh_size; } return BFELF_SUCCESS; failure: info->ctors_addr = 0; info->ctors_size = 0; info->dtors_addr = 0; info->dtors_size = 0; info->eh_frame_addr = 0; info->eh_frame_size = 0; return ret; }