From 47f231a51308e70a24ad087c6d0bc5d934483b50 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Wed, 6 Nov 2013 20:38:05 +0100 Subject: [PATCH] Provide virtual symbols for ppc64 function descriptors backends/ 2013-11-30 Jan Kratochvil Provide virtual symbols for ppc64 function descriptors. * Makefile.am (ppc64_SRCS): Add ppc64_get_symbol.c. * ppc64_get_symbol.c: New file. * ppc64_init.c (ppc64_init): Install init_symbols, get_symbol and destr. libdwfl/ 2013-11-30 Jan Kratochvil * dwfl_module_addrsym.c (dwfl_module_addrsym): Adjust FIRST_GLOBAL also for EBL_FIRST_GLOBAL. * dwfl_module_getdwarf.c (getsym_helper): New function. (find_symtab): Call also ebl_init_symbols. (dwfl_module_getsymtab): Count also EBL_SYMENTS. * dwfl_module_getsym.c (dwfl_module_getsym_elf): Count also EBL_FIRST_GLOBAL, EBL_SYMENTS. Call also ebl_get_symbol. * libdwflP.h (DWFL_ERRORS): Add INVALID_INDEX. (struct Dwfl_Module): Add fields ebl_syments and ebl_first_global. libebl/ 2013-11-30 Jan Kratochvil Provide virtual symbols for ppc64 function descriptors. * Makefile.am (gen_SOURCES): Add eblgetsymbol.c. * ebl-hooks.h (init_symbols, get_symbol): New. * eblgetsymbol.c: New file. * libebl.h (ebl_getsym_t): New definition. (ebl_init_symbols, ebl_get_symbol): New declarations. * libeblP.h (struct ebl): New field backend. tests/ 2013-11-30 Jan Kratochvil Provide virtual symbols for ppc64 function descriptors. * Makefile.am (EXTRA_DIST): Add testfile66.bz2 and testfile66.core.bz2. * dwflsyms.c (list_syms): Remove unused from parameter mod_name. Print error on dwfl_module_getsymtab error. * run-addrname-test.sh (testfile66, testfile66.core): New tests. * run-dwflsyms.sh (testfile66, testfile66.core, hello_ppc64.ko): New tests. * testfile66.bz2: New file. * testfile66.core.bz2: New file. Signed-off-by: Jan Kratochvil --- backends/Makefile.am | 2 +- backends/ppc64_get_symbol.c | 264 +++++++++++++++++++++++++++++++++ backends/ppc64_init.c | 3 + libdwfl/dwfl_module_addrsym.c | 21 +-- libdwfl/dwfl_module_getdwarf.c | 18 ++- libdwfl/dwfl_module_getsym.c | 48 +++++- libdwfl/libdwflP.h | 5 +- libebl/Makefile.am | 2 +- libebl/ebl-hooks.h | 9 ++ libebl/eblgetsymbol.c | 57 +++++++ libebl/libebl.h | 28 ++++ libebl/libeblP.h | 3 + tests/Makefile.am | 3 +- tests/dwflsyms.c | 9 +- tests/run-addrname-test.sh | 39 +++++ tests/run-dwflsyms.sh | 100 +++++++++++++ tests/testfile66.bz2 | Bin 0 -> 741 bytes tests/testfile66.core.bz2 | Bin 0 -> 56448 bytes 18 files changed, 586 insertions(+), 25 deletions(-) create mode 100644 backends/ppc64_get_symbol.c create mode 100644 libebl/eblgetsymbol.c create mode 100755 tests/testfile66.bz2 create mode 100644 tests/testfile66.core.bz2 diff --git a/backends/Makefile.am b/backends/Makefile.am index 9bca99415..40460ae73 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -101,7 +101,7 @@ am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ - ppc_cfi.c + ppc_cfi.c ppc64_get_symbol.c libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) diff --git a/backends/ppc64_get_symbol.c b/backends/ppc64_get_symbol.c new file mode 100644 index 000000000..4be84b101 --- /dev/null +++ b/backends/ppc64_get_symbol.c @@ -0,0 +1,264 @@ +/* Provide virtual symbols for ppc64 function descriptors. + Copyright (C) 2013 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#define BACKEND ppc64_ +#include "libebl_CPU.h" + +/* Pointer to the first entry is stored into ebl->backend. + It has Dwfl_Module->ebl_syments entries and its memory is followed by + strings for the NAME entries. */ + +struct sym_entry +{ + GElf_Sym sym; + GElf_Word shndx; + const char *name; +}; + +/* Find section containing ADDR in its address range. */ + +static Elf_Scn * +scnfindaddr (Elf *elf, GElf_Addr addr) +{ + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + if (likely (shdr != NULL) + && likely ((shdr->sh_flags & SHF_ALLOC) != 0) + && addr >= shdr->sh_addr + && addr < shdr->sh_addr + shdr->sh_size) + break; + } + return scn; +} + +static int +symnames_get_compar (const void *ap, const void *bp) +{ + const char *const *a = ap; + const char *const *b = bp; + return strcmp (*a, *b); +} + +static const char ** +symnames_get (size_t syments, ebl_getsym_t *getsym, void *arg, bool is_linux, + size_t *symnames_countp) +{ + assert (syments > 0); + const char **symnames = malloc (syments * sizeof (*symnames)); + if (symnames == NULL) + return NULL; + *symnames_countp = 0; + for (size_t symi = 0; symi < syments; symi++) + { + GElf_Sym sym; + const char *symname = getsym (arg, symi, &sym, NULL, NULL); + if (symname == NULL || symname[0] != '.') + continue; + if (GELF_ST_TYPE (sym.st_info) != STT_FUNC + && (! is_linux || GELF_ST_TYPE (sym.st_info) != STT_GNU_IFUNC)) + continue; + symnames[(*symnames_countp)++] = &symname[1]; + } + qsort (symnames, *symnames_countp, sizeof (*symnames), symnames_get_compar); + return symnames; +} + +/* Scan all the symbols of EBL and create table of struct sym_entry entries for + every function symbol pointing to the .opd section. This includes automatic + derefencing of the symbols via the .opd section content to create the + virtual symbols for the struct sym_entry entries. As GETSYM points to + dwfl_module_getsym we scan all the available symbols, either + Dwfl_Module.main plus Dwfl_Module.aux_sym or Dwfl_Module.debug. + Symbols from all the available files are included in the SYMENTS count. + + .opd section contents is described in: + http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES + http://www.ibm.com/developerworks/library/l-ppc/ + - see: Function descriptors -- the .opd section */ + +bool +ppc64_init_symbols (Ebl *ebl, size_t syments, GElf_Addr main_bias, + ebl_getsym_t *getsym, void *arg, size_t *ebl_symentsp, + int *ebl_first_globalp) +{ + assert (ebl != NULL); + assert (ebl->backend == NULL); + if (syments == 0) + return true; + Elf *elf = ebl->elf; + GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem); + if (ehdr == NULL) + return false; + GElf_Shdr opd_shdr_mem, *opd_shdr; + Elf_Data *opd_data = NULL; + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) + { + opd_shdr = gelf_getshdr (scn, &opd_shdr_mem); + if (opd_shdr == NULL || (opd_shdr->sh_flags & SHF_ALLOC) == 0) + continue; + if (strcmp (elf_strptr (elf, ehdr->e_shstrndx, opd_shdr->sh_name), ".opd") + != 0) + continue; + opd_data = elf_getdata (scn, NULL); + /* SHT_NOBITS will produce NULL D_BUF. */ + if (opd_data == NULL || opd_data->d_buf == NULL) + return false; + assert (opd_data->d_size == opd_shdr->sh_size); + break; + } + if (opd_data == NULL) + return true; + char *ident = elf_getident (elf, NULL); + bool is_linux = ident != NULL && ident[EI_OSABI] == ELFOSABI_LINUX; + size_t symnames_count; + const char **symnames = symnames_get (syments, getsym, arg, is_linux, + &symnames_count); + if (symnames == NULL) + return false; + struct sym_entry *sym_table = malloc (syments * sizeof (*sym_table)); + if (sym_table == NULL) + { + free (symnames); + return false; + } + ebl->backend = sym_table; + size_t names_size = 0; + size_t ebl_syments = 0; + int ebl_first_global = 0; + for (size_t symi = 0; symi < syments; symi++) + { + GElf_Sym sym; + GElf_Word sym_shndx; + Elf *sym_elf; + const char *symname = getsym (arg, symi, &sym, &sym_shndx, &sym_elf); + if (symname == NULL || symname[0] == '.') + continue; + if (GELF_ST_TYPE (sym.st_info) != STT_FUNC + && (! is_linux || GELF_ST_TYPE (sym.st_info) != STT_GNU_IFUNC)) + continue; + Elf_Scn *sym_scn = elf_getscn (sym_elf, sym_shndx); + if (sym_scn == NULL) + continue; + GElf_Shdr sym_shdr_mem, *sym_shdr; + sym_shdr = gelf_getshdr (sym_scn, &sym_shdr_mem); + if (sym_shdr == NULL) + continue; + GElf_Ehdr sym_ehdr_mem, *sym_ehdr = gelf_getehdr (sym_elf, &sym_ehdr_mem); + if (sym_ehdr == NULL) + continue; + if (strcmp (elf_strptr (sym_elf, sym_ehdr->e_shstrndx, sym_shdr->sh_name), + ".opd") + != 0) + continue; + if (sym.st_value < opd_shdr->sh_addr + main_bias + || sym.st_value > (opd_shdr->sh_addr + main_bias + + opd_shdr->sh_size - sizeof (uint64_t))) + continue; + if (bsearch (&symname, symnames, symnames_count, sizeof (*symnames), + symnames_get_compar) + != 0) + continue; + uint64_t val64 = *(const uint64_t *) (opd_data->d_buf + sym.st_value + - (opd_shdr->sh_addr + main_bias)); + val64 = (elf_getident (elf, NULL)[EI_DATA] == ELFDATA2MSB + ? be64toh (val64) : le64toh (val64)); + Elf_Scn *entry_scn = scnfindaddr (elf, val64); + if (entry_scn == NULL) + continue; + if (GELF_ST_BIND (sym.st_info) == STB_LOCAL) + ebl_first_global++; + struct sym_entry *dest = &sym_table[ebl_syments]; + dest->sym = sym; + dest->sym.st_value = val64 + main_bias; + dest->shndx = elf_ndxscn (entry_scn); + dest->sym.st_shndx = (dest->shndx > SHN_HIRESERVE + ? SHN_XINDEX : dest->shndx); + dest->name = symname; + names_size += 1 + strlen (symname) + 1; + ebl_syments++; + } + free (symnames); + if (ebl_syments == 0) + { + free (sym_table); + ebl->backend = NULL; + return true; + } + sym_table = realloc (sym_table, + ebl_syments * sizeof (*sym_table) + names_size); + if (sym_table == NULL) + return false; + ebl->backend = sym_table; + char *names = (void *) &sym_table[ebl_syments]; + char *names_dest = names; + for (size_t symi = 0; symi < ebl_syments; symi++) + { + struct sym_entry *dest = &sym_table[symi]; + const char *symname = dest->name; + dest->name = names_dest; + *names_dest++ = '.'; + names_dest = stpcpy (names_dest, symname) + 1; + } + assert (names_dest == names + names_size); + *ebl_symentsp = ebl_syments; + *ebl_first_globalp = ebl_first_global; + return true; +} + +const char * +ppc64_get_symbol (Ebl *ebl, size_t ndx, GElf_Sym *symp, GElf_Word *shndxp) +{ + assert (ebl != NULL); + if (ebl->backend == NULL) + return NULL; + struct sym_entry *sym_table = ebl->backend; + const struct sym_entry *found = &sym_table[ndx]; + *symp = found->sym; + if (shndxp) + *shndxp = found->shndx; + return found->name; +} + +void +ppc64_destr (Ebl *ebl) +{ + free (ebl->backend); +} diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c index 143587546..3ed882bbc 100644 --- a/backends/ppc64_init.c +++ b/backends/ppc64_init.c @@ -65,6 +65,9 @@ ppc64_init (elf, machine, eh, ehlen) HOOK (eh, core_note); HOOK (eh, auxv_info); HOOK (eh, abi_cfi); + HOOK (eh, init_symbols); + HOOK (eh, get_symbol); + HOOK (eh, destr); return MODVERSION; } diff --git a/libdwfl/dwfl_module_addrsym.c b/libdwfl/dwfl_module_addrsym.c index 320d41f18..b11ba7562 100644 --- a/libdwfl/dwfl_module_addrsym.c +++ b/libdwfl/dwfl_module_addrsym.c @@ -179,16 +179,17 @@ dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, } } - /* First go through global symbols. mod->first_global and - mod->aux_first_global are setup by dwfl_module_getsymtab to the - index of the first global symbol in those symbol tables. Both - are non-zero when the table exist, except when there is only a - dynsym table loaded through phdrs, then first_global is zero and - there will be no auxiliary table. All symbols with local binding - come first in the symbol table, then all globals. The zeroth, - null entry, in the auxiliary table is skipped if there is a main - table. */ - int first_global = mod->first_global + mod->aux_first_global; + /* First go through global symbols. mod->first_global, + mod->aux_first_global and mod->ebl_first_global are setup by + dwfl_module_getsymtab to the index of the first global symbol in + those symbol tables. Both are non-zero when the table exist, + except when there is only a dynsym table loaded through phdrs, then + first_global is zero and there will be no auxiliary table. All + symbols with local binding come first in the symbol table, then all + globals. The zeroth, null entry, in the auxiliary table is skipped + if there is a main table. */ + int first_global = (mod->first_global + mod->aux_first_global + + mod->ebl_first_global); if (mod->syments > 0 && mod->aux_syments > 0) first_global--; search_table (first_global == 0 ? 1 : first_global, syments); diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c index dd76f2579..223374cd6 100644 --- a/libdwfl/dwfl_module_getdwarf.c +++ b/libdwfl/dwfl_module_getdwarf.c @@ -962,6 +962,13 @@ find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)), #endif } +static const char * +getsym_helper (void *arg, int ndx, GElf_Sym *sym, GElf_Word *shndxp, Elf **elfp) +{ + Dwfl_Module *mod = arg; + return dwfl_module_getsym_elf (mod, ndx, sym, shndxp, elfp, NULL); +} + /* Try to find a symbol table in either MOD->main.elf or MOD->debug.elf. */ static void find_symtab (Dwfl_Module *mod) @@ -1081,7 +1088,7 @@ find_symtab (Dwfl_Module *mod) mod->aux_syments = 0; elf_end (mod->aux_sym.elf); mod->aux_sym.elf = NULL; - return; + goto aux_done; } mod->aux_symstrdata = elf_getdata (elf_getscn (mod->aux_sym.elf, @@ -1102,7 +1109,14 @@ find_symtab (Dwfl_Module *mod) mod->aux_symdata = elf_getdata (aux_symscn, NULL); if (mod->aux_symdata == NULL) goto aux_cleanup; + aux_done:; } + + Dwfl_Error error = __libdwfl_module_getebl (mod); + if (error == DWFL_E_NOERROR) + ebl_init_symbols (mod->ebl, mod->syments + mod->aux_syments, + mod->main_bias, getsym_helper, mod, + &mod->ebl_syments, &mod->ebl_first_global); } @@ -1259,7 +1273,7 @@ dwfl_module_getsymtab (Dwfl_Module *mod) find_symtab (mod); if (mod->symerr == DWFL_E_NOERROR) /* We will skip the auxiliary zero entry if there is another one. */ - return (mod->syments + mod->aux_syments + return (mod->syments + mod->aux_syments + mod->ebl_syments - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0)); __libdwfl_seterrno (mod->symerr); diff --git a/libdwfl/dwfl_module_getsym.c b/libdwfl/dwfl_module_getsym.c index 319f97586..42eb43bbc 100644 --- a/libdwfl/dwfl_module_getsym.c +++ b/libdwfl/dwfl_module_getsym.c @@ -54,8 +54,7 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, Elf_Data *symdata; Elf_Data *symxndxdata; Elf_Data *symstrdata; - if (mod->aux_symdata == NULL - || ndx < mod->first_global) + if (ndx < mod->first_global) { /* main symbol table (locals). */ tndx = ndx; @@ -73,24 +72,61 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, symxndxdata = mod->aux_symxndxdata; symstrdata = mod->aux_symstrdata; } - else if ((size_t) ndx < mod->syments + mod->aux_first_global - skip_aux_zero) + else if (ndx < (mod->first_global + mod->aux_first_global + + mod->ebl_first_global - skip_aux_zero)) + { + /* ebl symbol lookup (locals). */ + symdata = NULL; + tndx = ndx - (mod->first_global + mod->aux_first_global - skip_aux_zero); + } + else if ((size_t) ndx < (mod->syments + mod->aux_first_global + + mod->ebl_first_global - skip_aux_zero)) { /* main symbol table (globals). */ - tndx = ndx - mod->aux_first_global + skip_aux_zero; + tndx = ndx - (mod->aux_first_global + mod->ebl_first_global + - skip_aux_zero); elf = mod->symfile->elf; symdata = mod->symdata; symxndxdata = mod->symxndxdata; symstrdata = mod->symstrdata; } - else + else if ((size_t) ndx < (mod->syments + mod->aux_syments + + mod->ebl_first_global - skip_aux_zero)) { /* aux symbol table (globals). */ - tndx = ndx - mod->syments + skip_aux_zero; + tndx = ndx - (mod->syments + mod->ebl_first_global - skip_aux_zero); elf = mod->aux_sym.elf; symdata = mod->aux_symdata; symxndxdata = mod->aux_symxndxdata; symstrdata = mod->aux_symstrdata; } + else if ((size_t) ndx < (mod->syments + mod->aux_syments + + mod->ebl_syments - skip_aux_zero)) + { + /* ebl symbol lookup (globals). */ + symdata = NULL; + tndx = ndx - (mod->syments + mod->aux_syments - skip_aux_zero); + } + else + { + /* out of range NDX. */ + __libdwfl_seterrno (DWFL_E_INVALID_INDEX); + return NULL; + } + + if (symdata == NULL) + { + const char *name = ebl_get_symbol (mod->ebl, tndx, sym, shndxp); + if (likely (name != NULL)) + { + if (elfp) + *elfp = mod->main.elf; + return name; + } + __libdwfl_seterrno (DWFL_E_LIBEBL); + return NULL; + } + sym = gelf_getsymshndx (symdata, symxndxdata, tndx, sym, &shndx); if (unlikely (sym == NULL)) diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index ba1c758d5..89e78fc17 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -89,7 +89,8 @@ typedef struct Dwfl_Process Dwfl_Process; DWFL_ERROR (ATTACH_STATE_CONFLICT, N_("Dwfl already has attached state")) \ DWFL_ERROR (NO_ATTACH_STATE, N_("Dwfl has no attached state")) \ DWFL_ERROR (NO_UNWIND, N_("Unwinding not supported for this architecture")) \ - DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument")) + DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument")) \ + DWFL_ERROR (INVALID_INDEX, N_("invalid section index")) #define DWFL_ERROR(name, text) DWFL_E_##name, typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error; @@ -173,8 +174,10 @@ struct Dwfl_Module Elf_Data *aux_symdata; /* Data in the auxiliary ELF symbol table. */ size_t syments; /* sh_size / sh_entsize of that section. */ size_t aux_syments; /* sh_size / sh_entsize of aux_sym section. */ + size_t ebl_syments; /* Number of symbols from ebl_getsym. */ int first_global; /* Index of first global symbol of table. */ int aux_first_global; /* Index of first global of aux_sym table. */ + int ebl_first_global; /* Index of first global from ebl_getsym. */ Elf_Data *symstrdata; /* Data for its string table. */ Elf_Data *aux_symstrdata; /* Data for aux_sym string table. */ Elf_Data *symxndxdata; /* Data in the extended section index table. */ diff --git a/libebl/Makefile.am b/libebl/Makefile.am index 4487c5f97..1fb3da311 100644 --- a/libebl/Makefile.am +++ b/libebl/Makefile.am @@ -54,7 +54,7 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \ eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \ eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ - eblstother.c eblinitreg.c + eblstother.c eblinitreg.c eblgetsymbol.c libebl_a_SOURCES = $(gen_SOURCES) diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h index cb52fee40..7204514ba 100644 --- a/libebl/ebl-hooks.h +++ b/libebl/ebl-hooks.h @@ -162,5 +162,14 @@ bool EBLHOOK(set_initial_registers_tid) (pid_t tid, ebl_tid_registers_t *setfunc, void *arg); +/* See ebl_init_symbols. */ +bool EBLHOOK(init_symbols) (Ebl *ebl, size_t syments, GElf_Addr main_bias, + ebl_getsym_t *getsym, void *arg, + size_t *ebl_symentsp, int *ebl_first_globalp); + +/* See ebl_get_symbol. */ +const char *EBLHOOK(get_symbol) (Ebl *ebl, size_t ndx, GElf_Sym *symp, + GElf_Word *shndxp); + /* Destructor for ELF backend handle. */ void EBLHOOK(destr) (struct ebl *); diff --git a/libebl/eblgetsymbol.c b/libebl/eblgetsymbol.c new file mode 100644 index 000000000..ef664bf60 --- /dev/null +++ b/libebl/eblgetsymbol.c @@ -0,0 +1,57 @@ +/* Provide virtual symbols from backend. + Copyright (C) 2013 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +bool +ebl_init_symbols (Ebl *ebl, size_t syments, GElf_Addr main_bias, + ebl_getsym_t *getsym, void *arg, size_t *ebl_symentsp, + int *ebl_first_globalp) +{ + *ebl_symentsp = 0; + *ebl_first_globalp = 0; + if (ebl == NULL) + return false; + if (ebl->init_symbols == NULL) + return true; + return ebl->init_symbols (ebl, syments, main_bias, getsym, arg, ebl_symentsp, + ebl_first_globalp); +} + +const char * +ebl_get_symbol (Ebl *ebl, size_t ndx, GElf_Sym *symp, GElf_Word *shndxp) +{ + if (ebl == NULL || ebl->get_symbol == NULL) + return NULL; + return ebl->get_symbol (ebl, ndx, symp, shndxp); +} diff --git a/libebl/libebl.h b/libebl/libebl.h index 045a19809..d81715321 100644 --- a/libebl/libebl.h +++ b/libebl/libebl.h @@ -402,6 +402,34 @@ extern bool ebl_set_initial_registers_tid (Ebl *ebl, extern size_t ebl_frame_nregs (Ebl *ebl) __nonnull_attribute__ (1); +/* Callback type for ebl_init_symbols, + it is forwarded to dwfl_module_getsym_elf. */ +typedef const char *(ebl_getsym_t) (void *arg, int ndx, GElf_Sym *symp, + GElf_Word *shndxp, Elf **elfp) + __nonnull_attribute__ (3); + +/* Initialize virtual backend symbol table for EBL->elf currently containing + SYMENTS symbols, EBL->elf is using MAIN_BIAS. GETSYM is a callback to fetch + the existing EBL->elf symbols, ARG is an opaque parameter for GETSYM. + Fill in *EBL_SYMENTSP with the total number of virtual symbols found, + *EBL_FIRST_GLOBALP of them are local. Function must be called exactly once + for new EBL. Function returns false if there was an error; *EBL_SYMENTSP + and *EBL_FIRST_GLOBALP are left as zero in such case. If function returns + true (success) *EBL_SYMENTSP and *EBL_FIRST_GLOBALP still can be zero, + if the file does not contain any matching symbols. */ +extern bool ebl_init_symbols (Ebl *ebl, size_t syments, Dwarf_Addr symbias, + ebl_getsym_t *getsym, void *arg, + size_t *ebl_symentsp, int *ebl_first_globalp) + __nonnull_attribute__ (1, 4, 6, 7); + +/* Return NDXth virtual backend symbol from MOD, store it to *SYM and its + section to *SHNDX. Return its name. NDX must be less than *EBL_SYMENTSP + returned by init_symbols above. SHNDXP may be NULL. Returned name is valid + as long as EBL is valid. */ +extern const char *ebl_get_symbol (Ebl *ebl, size_t ndx, GElf_Sym *symp, + GElf_Word *shndxp) + __nonnull_attribute__ (1, 3); + #ifdef __cplusplus } #endif diff --git a/libebl/libeblP.h b/libebl/libeblP.h index 4f4137d59..328205074 100644 --- a/libebl/libeblP.h +++ b/libebl/libeblP.h @@ -66,6 +66,9 @@ struct ebl /* Internal data. */ void *dlhandle; + + /* Data specific to the backend. */ + void *backend; }; diff --git a/tests/Makefile.am b/tests/Makefile.am index a74830ba3..f57333c89 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -245,7 +245,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-backtrace-native-core.sh run-backtrace-native-core-biarch.sh \ run-backtrace-core-x86_64.sh run-backtrace-core-i386.sh \ backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ - backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 + backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ + testfile66.bz2 testfile66.core.bz2 if USE_VALGRIND valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no' diff --git a/tests/dwflsyms.c b/tests/dwflsyms.c index 10c01f1f0..19f1dbebe 100644 --- a/tests/dwflsyms.c +++ b/tests/dwflsyms.c @@ -106,13 +106,16 @@ addr_in_section (Elf *elf, GElf_Word shndx, GElf_Addr addr) static int list_syms (struct Dwfl_Module *mod, - void **user __attribute__ ((unused)), - const char *mod_name __attribute__ ((unused)), + void **user __attribute__ ((unused)), const char *mod_name, Dwarf_Addr low_addr __attribute__ ((unused)), void *arg __attribute__ ((unused))) { int syms = dwfl_module_getsymtab (mod); - assert (syms >= 0); + if (syms < 0) + { + printf ("%s: %s\n", mod_name, dwfl_errmsg (-1)); + return DWARF_CB_OK; + } for (int ndx = 0; ndx < syms; ndx++) { diff --git a/tests/run-addrname-test.sh b/tests/run-addrname-test.sh index 8624074fa..bdf8ea6a0 100755 --- a/tests/run-addrname-test.sh +++ b/tests/run-addrname-test.sh @@ -298,6 +298,45 @@ __vdso_time ??:0 EOF +# .section ".text" +# .globl _start +# .section ".opd","aw" +#_start: .quad .L._start,.TOC.@tocbase +# .previous +# .type _start, @function +#.L._start: +# .byte 0x7d, 0x82, 0x10, 0x08 +# .size _start,.-.L._start +testfiles testfile66 testfile66.core +testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile66 _start 0x103d0 0x103d3 0x103d4 ._start 0x2d8 0x2db 0x2dc <<\EOF +_start +??:0 +_start +??:0 +_start+0x3 +??:0 +()+0x103d4 +??:0 +._start +??:0 +._start +??:0 +._start+0x3 +??:0 +()+0x2dc +??:0 +EOF +testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile66 --core=testfile66.core _start 0x461c03d0 ._start 0x461b02d8 <<\EOF +_start +??:0 +_start +??:0 +._start +??:0 +._start +??:0 +EOF + testfiles testfile69.core testfile69.so testrun_compare ${abs_top_builddir}/src/addr2line --core=./testfile69.core -S 0x7f0bc6a33535 0x7f0bc6a33546 <<\EOF libstatic+0x9 diff --git a/tests/run-dwflsyms.sh b/tests/run-dwflsyms.sh index 3cd7bf368..60909051f 100755 --- a/tests/run-dwflsyms.sh +++ b/tests/run-dwflsyms.sh @@ -362,4 +362,104 @@ testrun_compare ${abs_builddir}/dwflsyms -e testfilebasmin <<\EOF 8: FUNC GLOBAL bar (44) 0x40017a, rel: 0x40017a (.text) EOF +testfiles testfile66 +testrun_compare ${abs_builddir}/dwflsyms -e testfile66 <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x190 + 2: SECTION LOCAL (0) 0x1a4 + 3: SECTION LOCAL (0) 0x1c8 + 4: SECTION LOCAL (0) 0x1f8 + 5: SECTION LOCAL (0) 0x288 + 6: SECTION LOCAL (0) 0x2a8 + 7: SECTION LOCAL (0) 0x2d8 + 8: SECTION LOCAL (0) 0x102e0 + 9: SECTION LOCAL (0) 0x103d0 + 10: SECTION LOCAL (0) 0x103e8 + 11: SECTION LOCAL (0) 0x103e8 + 12: OBJECT LOCAL _DYNAMIC (0) 0x102e0 + 13: FUNC GLOBAL _start (4) 0x103d0, rel: 0x103d0 (.opd) + 14: NOTYPE GLOBAL __bss_start (0) 0x103f0 + 15: NOTYPE GLOBAL _edata (0) 0x103f0 + 16: NOTYPE GLOBAL _end (0) 0x103f0 + 17: FUNC GLOBAL ._start (4) 0x2d8, rel: 0x2d8 (.text) +EOF + +testfiles testfile66.core +testrun_compare ${abs_builddir}/dwflsyms -e testfile66 --core=testfile66.core <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0xfffb1af0410 + 2: NOTYPE GLOBAL __kernel_datapage_offset (0) 0xfffb1af05dc + 3: OBJECT GLOBAL LINUX_2.6.15 (0) 0 + 4: NOTYPE GLOBAL __kernel_clock_getres (64) 0xfffb1af052c + 5: NOTYPE GLOBAL __kernel_get_tbfreq (24) 0xfffb1af0620 + 6: NOTYPE GLOBAL __kernel_gettimeofday (84) 0xfffb1af0440 + 7: NOTYPE GLOBAL __kernel_sync_dicache (20) 0xfffb1af06c4 + 8: NOTYPE GLOBAL __kernel_sync_dicache_p5 (20) 0xfffb1af06c4 + 9: NOTYPE GLOBAL __kernel_sigtramp_rt64 (12) 0xfffb1af0418 + 10: NOTYPE GLOBAL __kernel_clock_gettime (152) 0xfffb1af0494 + 11: NOTYPE GLOBAL __kernel_get_syscall_map (44) 0xfffb1af05f4 +ld64.so.1: Callback returned failure + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x461b0190 + 2: SECTION LOCAL (0) 0x461b01a4 + 3: SECTION LOCAL (0) 0x461b01c8 + 4: SECTION LOCAL (0) 0x461b01f8 + 5: SECTION LOCAL (0) 0x461b0288 + 6: SECTION LOCAL (0) 0x461b02a8 + 7: SECTION LOCAL (0) 0x461b02d8 + 8: SECTION LOCAL (0) 0x461c02e0 + 9: SECTION LOCAL (0) 0x461c03d0 + 10: SECTION LOCAL (0) 0x461c03e8 + 11: SECTION LOCAL (0) 0x461c03e8 + 12: OBJECT LOCAL _DYNAMIC (0) 0x102e0 + 13: FUNC GLOBAL _start (4) 0x461c03d0, rel: 0x103d0 (.opd) + 14: NOTYPE GLOBAL __bss_start (0) 0x103f0 + 15: NOTYPE GLOBAL _edata (0) 0x103f0 + 16: NOTYPE GLOBAL _end (0) 0x103f0 + 17: FUNC GLOBAL ._start (4) 0x461b02d8, rel: 0x2d8 (.text) +EOF + +# Test the already present dot-prefixed names do not get duplicated. +testfiles hello_ppc64.ko +testrun_compare ${abs_builddir}/dwflsyms -e hello_ppc64.ko <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0 + 2: SECTION LOCAL (0) 0x94 + 3: SECTION LOCAL (0) 0xba + 4: SECTION LOCAL (0) 0xd0 + 5: SECTION LOCAL (0) 0x13a + 6: SECTION LOCAL (0) 0x13a + 7: SECTION LOCAL (0) 0x150 + 8: SECTION LOCAL (0) 0x170 + 9: SECTION LOCAL (0) 0x188 + 10: SECTION LOCAL (0) 0x410 + 11: SECTION LOCAL (0) 0x434 + 12: SECTION LOCAL (0) 0x438 + 13: SECTION LOCAL (0) 0x438 + 14: SECTION LOCAL (0) 0 + 15: SECTION LOCAL (0) 0 + 16: SECTION LOCAL (0) 0 + 17: SECTION LOCAL (0) 0 + 18: SECTION LOCAL (0) 0 + 19: SECTION LOCAL (0) 0 + 20: SECTION LOCAL (0) 0 + 21: SECTION LOCAL (0) 0 + 22: SECTION LOCAL (0) 0 + 23: SECTION LOCAL (0) 0 + 24: FILE LOCAL init.c (0) 0 + 25: FILE LOCAL exit.c (0) 0 + 26: FILE LOCAL hello.mod.c (0) 0 + 27: OBJECT LOCAL __mod_srcversion23 (35) 0xd0 + 28: OBJECT LOCAL __module_depends (9) 0xf8 + 29: OBJECT LOCAL __mod_vermagic5 (50) 0x108 + 30: OBJECT GLOBAL __this_module (648) 0x188 + 31: FUNC GLOBAL .cleanup_module (72) 0x4c, rel: 0x4c (.text) + 32: FUNC GLOBAL cleanup_module (24) 0x160, rel: 0x10 (.opd) + 33: NOTYPE GLOBAL .printk (0) 0 + 34: FUNC GLOBAL init_module (24) 0x150, rel: 0 (.opd) + 35: NOTYPE GLOBAL ._mcount (0) 0 + 36: FUNC GLOBAL .init_module (76) 0, rel: 0 (.text) + 37: NOTYPE GLOBAL _mcount (0) 0 +EOF + exit 0 diff --git a/tests/testfile66.bz2 b/tests/testfile66.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..4797590e2f4ad9e618de393bf498e76882eeecbb GIT binary patch literal 741 zc-jHw0vi27T4*^jL0KkKS!&pZ_5cGu|NsC0|9(uf00003Mj`5HrqpO;dO&IrX&QP-=BAlO zo}dpG0B8UJ01_l3YM!T&00YVfk5B*y zsA$ok&}aYv01X;6Jxv~8)y1h1g49BdEKx~7+h+t;QTG{U`f_MUC}2%iip2#LeH=}T z>ZZZdMVrd9Z7C%onpDJh8if0G@v5$=Fura)i12QfYBP0Qm0vYStb{2{FPP+oF4~DJ zB+xKhM7UcJ!G&mfgTNL!Lgi5E6p|4cnC&HYP}c!yy#6z{?WVd2O3hl==r1rchtJ{H z!x0P+5S5NhNg1~_SrzPUUbK=H7K&={U@N6Jn~ZI(2-bMG^Pf5pmF8~R4o-dDG{LZ` zzCi34dQHj)9cHYUW{K-xzx2ux@MEXD|2##>}c8DBZ!IVtbbnCeCa+U>3cxRXpD zGJ>$=v3`(MNAe7t*6ehvBNu4v)+S?0R{jw2QH$CT@VQAq5D^rq~Z#RgqaDZN0A~SOq>?Oiw+0~MQzOlyFSbE zr>e@)g+tlq1XWm`@@@}^#c)CkQ2siW~l^mI9EyxxH^FJ#C1%WcWs&3l-|6G)N(2i45(N(L`qb}i}3mh5EMSi zCmtk4NMRYNDu@8W)|V!w!6$*QJsisrjCS-T`eLv@uy$Fpw3aG@ACLI}u}v78F=}KZ XMJ*Sl22CbkU-5S&Q-uizt%z@6@PRxr literal 0 Hc-jL100001 diff --git a/tests/testfile66.core.bz2 b/tests/testfile66.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..12e2d4442a18fe2d7074c79b365f1711a38b5dc4 GIT binary patch literal 56448 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 GgSAK?PXna@ literal 0 Hc-jL100001 -- 2.47.2