Example #1
0
static telf_status
symentryfs_gen_info(telf_obj *obj,
                    Elf64_Sym *sym,
                    char **bufp,
                    size_t *buf_lenp)
{
        char *symname = NULL;
        char *buf = NULL;
        size_t buf_len = 0;
        char tmpbuf[1024] = "";
        telf_status ret;

        /* default value */
        symname = "NONAME";

        if (sym->st_name) {
                symname = ((ELF_SECTION_SYMTAB == obj->parent->type) ?
                           elf_getsymname :
                           elf_getdsymname)(obj->ctx, sym);

                if (! symname || ! *symname)
                        symname = "UNRESOLVED";
        }

        buf_len = sprintf(tmpbuf,
                          "value: %p\n"
                          "size: %zu\n"
                          "type: %s\n"
                          "bind: %s\n"
                          "name: %s\n",
                          (void *) sym->st_value,
                          sym->st_size,
                          sym_type_to_str(sym),
                          sym_bind_to_str(sym),
                          symname);

        if (bufp) {
                buf = malloc(buf_len + 1);
                if (! buf) {
                        ERR("malloc: %s", strerror(errno));
                        ret = ELF_ENOMEM;
                        goto end;
                }

                strncpy(buf, tmpbuf, buf_len);
                buf[buf_len] = 0;
        }

        ret = ELF_SUCCESS;
  end:
        if (bufp)
                *bufp = buf;
        else
                free(buf);

        if (buf_lenp)
                *buf_lenp = buf_len;

        return ret;
}
Example #2
0
static telf_status
symentryfs_read_info(void *obj_hdl,
                     char **bufp,
                     size_t *buf_lenp)
{
        telf_obj *obj = obj_hdl;
        char *symname = NULL;
        char *buf = NULL;
        size_t buf_len = 0;
        telf_status ret;
        FILE *out = NULL;
        ElfW(Sym) *sym = obj->parent->data;

        /* default value */
        symname = "NONAME";

        if (sym->st_name) {
                symname = ((ELF_SECTION_SYMTAB == obj->parent->type) ?
                           elf_getsymname :
                           elf_getdsymname)(obj->ctx, sym);

                if (! symname || ! *symname)
                        symname = "UNRESOLVED";
        }

        out = open_memstream(&buf, &buf_len);
        if (! out) {
                ERR("open_memstream: %s", strerror(errno));
                ret = ELF_ENOMEM;
                goto end;
        }

        fprintf(out,
                "value: %p\n"
                "size: %zu\n"
                "type: %s\n"
                "bind: %s\n"
                "name: %s\n",
                (void *) sym->st_value,
                sym->st_size,
                sym_type_to_str(sym),
                sym_bind_to_str(sym),
                symname);

        ret = ELF_SUCCESS;
  end:
        if (out)
                fclose(out);

        if (bufp)
                *bufp = buf;
        else
                free(buf);

        if (buf_lenp)
                *buf_lenp = buf_len;

        return ret;
}