Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}