18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file op_bfd.h 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Encapsulation of bfd objects 48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors 68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING 78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie 98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon 108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef OP_BFD_H 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define OP_BFD_H 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "config.h" 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector> 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string> 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <list> 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <map> 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <set> 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "bfd_support.h" 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h" 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "utility.h" 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "cached_value.h" 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_types.h" 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass op_bfd; 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass string_filter; 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass extra_images; 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// all symbol vector indexing uses this type 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef size_t symbol_index_t; 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * A symbol description from a bfd point of view. This duplicate 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * information pointed by an asymbol, we need this duplication in case 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the symbol is an artificial symbol 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass op_bfd_symbol { 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic: 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// ctor for real symbols 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd_symbol(asymbol const * a); 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// ctor for artificial symbols 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd_symbol(bfd_vma vma, size_t size, std::string const & name); 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bfd_vma vma() const { return symb_value + section_vma; } 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long value() const { return symb_value; } 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long filepos() const { return symb_value + section_filepos; } 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long symbol_endpos(void) const; 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd asection const * section(void) const { return bfd_symbol->section; } 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string const & name() const { return symb_name; } 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd asymbol const * symbol() const { return bfd_symbol; } 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t size() const { return symb_size; } 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void size(size_t s) { symb_size = s; } 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool hidden() const { return symb_hidden; } 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool weak() const { return symb_weak; } 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool artificial() const { return symb_artificial; } 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// compare two symbols by their filepos() 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool operator<(op_bfd_symbol const & lhs) const; 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate: 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the original bfd symbol, this can be null if the symbol is an 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// artificial symbol 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd asymbol const * bfd_symbol; 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the offset of this symbol relative to the begin of the section's 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// symbol 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long symb_value; 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the section filepos for this symbol 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long section_filepos; 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the section vma for this symbol 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bfd_vma section_vma; 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the size of this symbol 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t symb_size; 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// the name of the symbol 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string symb_name; 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// normally not externally visible symbol 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool symb_hidden; 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// whether other symbols can override it 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool symb_weak; 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// symbol is artificially created 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool symb_artificial; 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// code bytes corresponding to symbol -- used for XML generation 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string symb_bytes; 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Encapsulation of a bfd object. Simplifies open/close of bfd, enumerating 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * symbols and retrieving informations for symbols or vma. 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Use of this class relies on a std::ostream cverb 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass op_bfd { 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic: 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param filename the name of the image file 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param symbol_filter filter to apply to symbols 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param extra_images container where all extra candidate filenames 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * are stored 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param ok in-out parameter: on in, if not set, don't 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * open the bfd (because it's not there or whatever). On out, 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * it's set to false if the bfd couldn't be loaded. 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd(std::string const & filename, 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string_filter const & symbol_filter, 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_images const & extra_images, 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool & ok); 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * This constructor is used when processing an SPU profile 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * where the SPU ELF is embedded within the PPE binary. 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd(uint64_t spu_offset, 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string const & filename, 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string_filter const & symbol_filter, 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_images const & extra_images, 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool & ok); 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string get_embedding_filename() const { return embedding_filename; } 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// close an opened bfd image and free all related resources 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ~op_bfd(); 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param sym_idx index of the symbol 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param offset fentry number 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param filename output parameter to store filename 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param linenr output parameter to store linenr. 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Retrieve the relevant finename:linenr information for the sym_idx 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * at offset. If the lookup fails, return false. In some cases this 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * function can retrieve the filename and return true but fail to 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * retrieve the linenr and so can return zero in linenr 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool get_linenr(symbol_index_t sym_idx, bfd_vma offset, 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string & filename, unsigned int & linenr) const; 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param sym_idx symbol index 1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param start reference to start var 1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param end reference to end var 1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Calculates the range of sample file entries covered by sym. start 1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * and end will be filled in appropriately. If index is the last entry 1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * in symbol table, all entries up to the end of the sample file will 1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * be used. After calculating start and end they are sanitized 1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * All errors are fatal. 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void get_symbol_range(symbol_index_t sym_idx, 1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long long & start, unsigned long long & end) const; 1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param start reference to the start vma 1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param end reference to the end vma 1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * return in start, end the vma range for this binary object. 1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void get_vma_range(bfd_vma & start, bfd_vma & end) const; 1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** return the relocated PC value for the given file offset */ 1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bfd_vma offset_to_pc(bfd_vma offset) const; 1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * If passed 0, return the file position of the .text section. 1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Otherwise, return the filepos of a section with a matching 1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * vma. 1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned long get_start_offset(bfd_vma vma = 0) const; 1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Return the image name of the underlying binary image. For an 1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * archive, this returns the path *within* the archive, not the 1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * full path of the file. 1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string get_filename() const; 1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// sorted vector by vma of interesting symbol. 1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::vector<op_bfd_symbol> syms; 1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// return in bits the bfd_vma size for this binary. This is needed 1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// because gprof output depend on the bfd_vma for *this* binary 1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// and do not depend on sizeof(bfd_vma) 1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t bfd_arch_bits_per_address() const; 1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// return true if binary contain some debug information 1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool has_debug_info() const; 1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param sym_idx symbol index 1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Return true or false, indicating whether or not the 1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * symbol referenced by the passed sym_idx has code available. 1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Some symbols have no code associated with them; for example, 1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * artificial symbols created for anonymous memory samples or for 2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * stripped binaries with no symbol debug info. Additionally, 2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * if the bfd object associated with the symbol is not valid, 2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * this function will also return false. 2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * NOTE: This call should be made prior to invoking 2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * get_symbol_contents to avoid unnecessarily allocating 2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * memory for the symbol contents. 2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool symbol_has_contents(symbol_index_t sym_idx); 2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool get_symbol_contents(symbol_index_t sym_index, 2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd unsigned char * contents) const; 2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool valid() const { return ibfd.valid(); } 2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate: 2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// temporary container type for getting symbols 2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef std::list<op_bfd_symbol> symbols_found_t; 2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Parse and sort in ascending order all symbols 2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * in the file pointed to by abfd that reside in 2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * a %SEC_CODE section. 2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The symbols are filtered through 2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the interesting_symbol() predicate and sorted 2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * with op_bfd_symbol::operator<() comparator. 2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void get_symbols(symbols_found_t & symbols); 2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Helper function for get_symbols. 2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Populates bfd_syms and extracts the "interesting_symbol"s. 2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void get_symbols_from_file(bfd_info & bfd, size_t start, 2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd::symbols_found_t & symbols, 2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool debug_file); 2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Add the symbols in the binary, applying filtering, 2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * and handling artificial symbols. 2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void add_symbols(symbols_found_t & symbols, 2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string_filter const & symbol_filter); 2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * symbol_size - return the size of a symbol 2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param sym symbol to get size 2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param next next symbol in vma order if any 2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd size_t symbol_size(op_bfd_symbol const & sym, 2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd_symbol const * next) const; 2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// create an artificial symbol for a symbolless binary 2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd op_bfd_symbol const create_artificial_symbol(); 2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /* Generate symbols using bfd functions for 2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the image file associated with the ibfd arg. 2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd uint process_symtab(bfd_info * bfd, uint start); 2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// filename we open (not including archive path) 2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string filename; 2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// path to archive 2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string archive_path; 2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// reference to extra_images 2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd extra_images const & extra_found_images; 2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// file size in bytes 2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd off_t file_size; 2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// corresponding debug file name 2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd mutable std::string debug_filename; 2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// true if at least one section has (flags & SEC_DEBUGGING) != 0 2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd mutable cached_value<bool> debug_info; 2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// our main bfd object: .bfd may be NULL 2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bfd_info ibfd; 2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // corresponding debug bfd object, if one is found 2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd mutable bfd_info dbfd; 2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// sections we will avoid to use symbol from, this is needed 2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// because elf file allows sections with identical vma and we can't 2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// allow overlapping symbols. Such elf layout is used actually by 2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /// kernel modules where all code section vma are set to 0. 2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::vector<asection const *> filtered_section; 2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef std::map<std::string, u32> filepos_map_t; 2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // mapping of section names to filepos in the original binary 2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd filepos_map_t filepos_map; 2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd /** 2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * If spu_offset is non-zero, embedding_filename is the file containing 2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the embedded SPU image. 2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */ 2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd std::string embedding_filename; 3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool anon_obj; 3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !OP_BFD_H */ 306