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; }
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; }