18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file bfd_support.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * BFD muck we have to deal with.
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2005 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef BFD_SUPPORT_H
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define BFD_SUPPORT_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "utility.h"
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_types.h"
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h"
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <bfd.h>
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <stdint.h>
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass op_bfd_symbol;
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// holder for BFD state we must keep
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct bfd_info {
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bfd_info() : abfd(0), nr_syms(0), synth_syms(0), image_bfd_info(0) {}
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	~bfd_info();
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// close the BFD, setting abfd to NULL
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void close();
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if BFD is readable
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool valid() const { return abfd; }
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if BFD has debug info
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool has_debug_info() const;
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// pick out the symbols from the bfd, if we can
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void get_symbols();
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the actual BFD
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bfd * abfd;
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// normal symbols (includes synthesized symbols)
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	scoped_array<asymbol *> syms;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// nr. symbols
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	size_t nr_syms;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void set_image_bfd_info(bfd_info * ibfd) { image_bfd_info = ibfd; }
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Acquire the synthetic symbols if we need to.
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool get_synth_symbols();
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * On PPC64, synth_syms points to an array of synthetic asymbol
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * structs returned from bfd_get_synthetic_symtab.  The syms
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * member points into this array, so we have to keep it around
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * until ~bfd_info time.
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	asymbol * synth_syms;
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * Under certain circumstances, correct handling of the bfd for a
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * debuginfo file is not possible without access to the bfd for
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * the actual image file.  The image_bfd_info field provides access to
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * that bfd when this bfd_info is for a debuginfo file; otherwise
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * image_bfd_info is NULL.
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bfd_info * image_bfd_info;
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* To address a different issue, we discard symbols whose section
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * flag does not contain SEC_LOAD.  But since this is true for symbols
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * found in debuginfo files, we must run those debuginfo symbols
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * through the function below to prevent them from being inadvertently
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * discarded.  This function maps the sections from the symbols in
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * the debuginfo bfd to those of the real image bfd.  Then, when
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * we later do symbol filtering, we see the sections from the real
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * bfd, which do contain SEC_LOAD in the section flag.
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void translate_debuginfo_syms(asymbol ** dbg_syms, long nr_dbg_syms);
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/*
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * find_separate_debug_file - return true if a valid separate debug file found
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param ibfd binary file
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param dir_in directory holding the binary file
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param global_in
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param filename path to valid debug file
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Search order for debug file and use first one found:
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 1) dir_in directory
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 2) dir_in/.debug directory
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * 3) global_in/dir_in directory
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Newer binutils and Linux distributions (e.g. Fedora) allow the
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * creation of debug files that are separate from the binary. The
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * debugging information is stripped out of the binary file, placed in
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * this separate file, and a link to the new file is placed in the
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * binary. The debug files hold the information needed by the debugger
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * (and OProfile) to map machine instructions back to source code.
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern bool
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfind_separate_debug_file(bfd * ibfd,
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                         std::string const & filepath_in,
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                         std::string & debug_filename,
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                         extra_images const & extra);
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// open the given BFD
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbfd * open_bfd(std::string const & file);
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// open the given BFD from the fd
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbfd * fdopen_bfd(std::string const & file, int fd);
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// Return a BFD for an SPU ELF embedded in PPE binary file
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbfd * spu_open_bfd(std::string const name, int fd, uint64_t offset_to_spu_elf);
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// Return true if the symbol is worth looking at
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool interesting_symbol(asymbol * sym);
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * return true if the first symbol is less interesting than the second symbol
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * boring symbol are eliminated when multiple symbol exist at the same vma
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool boring_symbol(op_bfd_symbol const & first, op_bfd_symbol const & second);
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// debug info for a given pc
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct linenr_info {
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// did we find something?
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool found;
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// filename
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	std::string filename;
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// line number
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unsigned int line;
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Attempt to locate a filename + line number for the given symbol and
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * offset.
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * The bfd object is either the object associated with the binary or the
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * once associated with the separated debug info file so find_nearest_line()
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * can't lookup the section contents of code section etc. The filepos of
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * debuginfo symbols are different from the original file but we fixed symbol
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * filepos earlier.
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddlinenr_info const
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfind_nearest_line(bfd_info const & ibfd, op_bfd_symbol const & sym,
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                  bfd_vma offset, bool anon_obj);
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !BFD_SUPPORT_H */
157