• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file bfd_support.h
3  * BFD muck we have to deal with.
4  *
5  * @remark Copyright 2005 OProfile authors
6  * @remark Read the file COPYING
7  *
8  * @author John Levon
9  */
10 
11 #ifndef BFD_SUPPORT_H
12 #define BFD_SUPPORT_H
13 
14 #include "utility.h"
15 #include "op_types.h"
16 #include "locate_images.h"
17 
18 #include <bfd.h>
19 #include <stdint.h>
20 
21 #include <string>
22 
23 class op_bfd_symbol;
24 
25 /// holder for BFD state we must keep
26 struct bfd_info {
bfd_infobfd_info27 	bfd_info() : abfd(0), nr_syms(0), synth_syms(0), image_bfd_info(0) {}
28 
29 	~bfd_info();
30 
31 	/// close the BFD, setting abfd to NULL
32 	void close();
33 
34 	/// return true if BFD is readable
validbfd_info35 	bool valid() const { return abfd; }
36 
37 	/// return true if BFD has debug info
38 	bool has_debug_info() const;
39 
40 	/// pick out the symbols from the bfd, if we can
41 	void get_symbols();
42 
43 	/// the actual BFD
44 	bfd * abfd;
45 	/// normal symbols (includes synthesized symbols)
46 	scoped_array<asymbol *> syms;
47 	/// nr. symbols
48 	size_t nr_syms;
49 
set_image_bfd_infobfd_info50 	void set_image_bfd_info(bfd_info * ibfd) { image_bfd_info = ibfd; }
51 
52 private:
53 	/**
54 	 * Acquire the synthetic symbols if we need to.
55 	 */
56 	bool get_synth_symbols();
57 
58 	/**
59 	 * On PPC64, synth_syms points to an array of synthetic asymbol
60 	 * structs returned from bfd_get_synthetic_symtab.  The syms
61 	 * member points into this array, so we have to keep it around
62 	 * until ~bfd_info time.
63 	 */
64 	asymbol * synth_syms;
65 
66 	/**
67 	 * Under certain circumstances, correct handling of the bfd for a
68 	 * debuginfo file is not possible without access to the bfd for
69 	 * the actual image file.  The image_bfd_info field provides access to
70 	 * that bfd when this bfd_info is for a debuginfo file; otherwise
71 	 * image_bfd_info is NULL.
72 	 */
73 	bfd_info * image_bfd_info;
74 
75 	/* To address a different issue, we discard symbols whose section
76 	 * flag does not contain SEC_LOAD.  But since this is true for symbols
77 	 * found in debuginfo files, we must run those debuginfo symbols
78 	 * through the function below to prevent them from being inadvertently
79 	 * discarded.  This function maps the sections from the symbols in
80 	 * the debuginfo bfd to those of the real image bfd.  Then, when
81 	 * we later do symbol filtering, we see the sections from the real
82 	 * bfd, which do contain SEC_LOAD in the section flag.
83 	 */
84 	void translate_debuginfo_syms(asymbol ** dbg_syms, long nr_dbg_syms);
85 
86 };
87 
88 
89 /*
90  * find_separate_debug_file - return true if a valid separate debug file found
91  * @param ibfd binary file
92  * @param dir_in directory holding the binary file
93  * @param global_in
94  * @param filename path to valid debug file
95  *
96  * Search order for debug file and use first one found:
97  * 1) dir_in directory
98  * 2) dir_in/.debug directory
99  * 3) global_in/dir_in directory
100  *
101  * Newer binutils and Linux distributions (e.g. Fedora) allow the
102  * creation of debug files that are separate from the binary. The
103  * debugging information is stripped out of the binary file, placed in
104  * this separate file, and a link to the new file is placed in the
105  * binary. The debug files hold the information needed by the debugger
106  * (and OProfile) to map machine instructions back to source code.
107  */
108 extern bool
109 find_separate_debug_file(bfd * ibfd,
110                          std::string const & filepath_in,
111                          std::string & debug_filename,
112                          extra_images const & extra);
113 
114 /// open the given BFD
115 bfd * open_bfd(std::string const & file);
116 
117 /// open the given BFD from the fd
118 bfd * fdopen_bfd(std::string const & file, int fd);
119 
120 /// Return a BFD for an SPU ELF embedded in PPE binary file
121 bfd * spu_open_bfd(std::string const name, int fd, uint64_t offset_to_spu_elf);
122 
123 /// Return true if the symbol is worth looking at
124 bool interesting_symbol(asymbol * sym);
125 
126 /**
127  * return true if the first symbol is less interesting than the second symbol
128  * boring symbol are eliminated when multiple symbol exist at the same vma
129  */
130 bool boring_symbol(op_bfd_symbol const & first, op_bfd_symbol const & second);
131 
132 /// debug info for a given pc
133 struct linenr_info {
134 	/// did we find something?
135 	bool found;
136 	/// filename
137 	std::string filename;
138 	/// line number
139 	unsigned int line;
140 };
141 
142 /**
143  * Attempt to locate a filename + line number for the given symbol and
144  * offset.
145  *
146  * The bfd object is either the object associated with the binary or the
147  * once associated with the separated debug info file so find_nearest_line()
148  * can't lookup the section contents of code section etc. The filepos of
149  * debuginfo symbols are different from the original file but we fixed symbol
150  * filepos earlier.
151  */
152 linenr_info const
153 find_nearest_line(bfd_info const & ibfd, op_bfd_symbol const & sym,
154                   bfd_vma offset, bool anon_obj);
155 
156 #endif /* !BFD_SUPPORT_H */
157