void dump_symbols(const char *filename){ bfd *abfd; asymbol *store; char *p; void *minisyms; int symnum,i; size_t size; int dyn=0; int ret; abfd=bfd_openr(filename,NULL); assert(abfd); ret=bfd_check_format(abfd,bfd_object); assert(ret); if(!(bfd_get_file_flags(abfd)&& HAS_SYMS)){ bfd_close(abfd); return; } store = bfd_make_empty_symbol(abfd); symnum = bfd_read_minisymbols(abfd,dyn,&minisyms,&size); assert(symnum>=0); p=(char *)minisyms; for(i=0;i<symnum;i++){ asymbol *sym = bfd_minisymbol_to_symbol(abfd,dyn,p,store); const char *name = bfd_asymbol_name(sym); int value = bfd_asymbol_value(sym); printf("%08x %s\n",value,name); p+=size; } free(store); free(minisyms); bfd_close(abfd); }
/** * Load text symbols from the file into supplied table. * * @param bc the BFD context pointing to the file * @param st the symbol table where symbols should be added */ static void bfd_util_load_text(bfd_ctx_t *bc, symbols_t *st) { long i; asymbol* empty; void *p; bfd_ctx_check(bc); g_assert(st != NULL); if (0 == bc->count) return; mutex_lock_fast(&bc->lock); g_assert(bc->symbols != NULL); empty = bfd_make_empty_symbol(bc->handle); symbols_lock(st); for ( i = 0, p = bc->symbols; i < bc->count; i++, p = ptr_add_offset(p, bc->symsize) ) { asymbol *sym; symbol_info syminfo; sym = bfd_minisymbol_to_symbol(bc->handle, bc->dynamic, p, empty); bfd_get_symbol_info(bc->handle, sym, &syminfo); if ('T' == syminfo.type || 't' == syminfo.type) { const char *name = bfd_asymbol_name(sym); if (name != NULL && name[0] != '.') { void *addr = ulong_to_pointer(syminfo.value); symbols_append(st, addr, name); } } } symbols_unlock(st); mutex_unlock_fast(&bc->lock); }
void leaky::ReadSymbols(const char *aFileName, u_long aBaseAddress) { int initialSymbols = usefulSymbols; if (nullptr == externalSymbols) { externalSymbols = (Symbol**) calloc(sizeof(Symbol*),10000); Symbol *new_array = new Symbol[10000]; for (int i = 0; i < 10000; i++) { externalSymbols[i] = &new_array[i]; } numExternalSymbols = 10000; } Symbol** sp = externalSymbols + usefulSymbols; lastSymbol = externalSymbols + numExternalSymbols; // Create a dummy symbol for the library so, if it doesn't have any // symbols, we show it by library. (*sp)->Init(aFileName, aBaseAddress); NEXT_SYMBOL; bfd_boolean kDynamic = (bfd_boolean) false; static int firstTime = 1; if (firstTime) { firstTime = 0; bfd_init (); } bfd* lib = bfd_openr(aFileName, nullptr); if (nullptr == lib) { return; } if (!bfd_check_format(lib, bfd_object)) { bfd_close(lib); return; } bfd *symbolFile = find_debug_file(lib, aFileName); // read mini symbols PTR minisyms; unsigned int size; long symcount = 0; if (symbolFile) { symcount = bfd_read_minisymbols(symbolFile, kDynamic, &minisyms, &size); if (symcount == 0) { bfd_close(symbolFile); } else { bfd_close(lib); } } if (symcount == 0) { symcount = bfd_read_minisymbols(lib, kDynamic, &minisyms, &size); if (symcount == 0) { // symtab is empty; try dynamic symbols kDynamic = (bfd_boolean) true; symcount = bfd_read_minisymbols(lib, kDynamic, &minisyms, &size); } symbolFile = lib; } asymbol* store; store = bfd_make_empty_symbol(symbolFile); // Scan symbols bfd_byte* from = (bfd_byte *) minisyms; bfd_byte* fromend = from + symcount * size; for (; from < fromend; from += size) { asymbol *sym; sym = bfd_minisymbol_to_symbol(symbolFile, kDynamic, (const PTR) from, store); symbol_info syminfo; bfd_get_symbol_info (symbolFile, sym, &syminfo); // if ((syminfo.type == 'T') || (syminfo.type == 't')) { const char* nm = bfd_asymbol_name(sym); if (nm && nm[0]) { char* dnm = nullptr; if (strncmp("__thunk", nm, 7)) { dnm = abi::__cxa_demangle(nm, 0, 0, 0); } (*sp)->Init(dnm ? dnm : nm, syminfo.value + aBaseAddress); if (dnm) { free(dnm); } NEXT_SYMBOL; } // } } bfd_close(symbolFile); int interesting = sp - externalSymbols; if (!quiet) { printf("%s provided %d symbols\n", aFileName, interesting - initialSymbols); } usefulSymbols = interesting; }