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