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