type Binutils … var objdumpLLVMVerRE … var elfOpen … type binrep … // get returns the current representation for bu, initializing it if necessary. func (bu *Binutils) get() *binrep { … } // update modifies the rep for bu via the supplied function. func (bu *Binutils) update(fn func(r *binrep)) { … } // String returns string representation of the binutils state for debug logging. func (bu *Binutils) String() string { … } // SetFastSymbolization sets a toggle that makes binutils use fast // symbolization (using nm), which is much faster than addr2line but // provides only symbol name information (no file/line). func (bu *Binutils) SetFastSymbolization(fast bool) { … } // SetTools processes the contents of the tools option. It // expects a set of entries separated by commas; each entry is a pair // of the form t:path, where cmd will be used to look only for the // tool named t. If t is not specified, the path is searched for all // tools. func (bu *Binutils) SetTools(config string) { … } func initTools(b *binrep, config string) { … } // findObjdump finds and returns path to preferred objdump binary. // Order of preference is: llvm-objdump, objdump. // On MacOS only, also looks for gobjdump with least preference. // Accepts a list of paths and returns: // a string with path to the preferred objdump binary if found, // or an empty string if not found; // a boolean if any acceptable objdump was found; // a boolean indicating if it is an LLVM objdump. func findObjdump(paths []string) (string, bool, bool) { … } // chooseExe finds and returns path to preferred binary. names is a list of // names to search on both Linux and OSX. osxNames is a list of names specific // to OSX. names always has a higher priority than osxNames. The order of // the name within each list decides its priority (e.g. the first name has a // higher priority than the second name in the list). // // It returns a string with path to the binary and a boolean indicating if any // acceptable binary was found. func chooseExe(names, osxNames []string, paths []string) (string, bool) { … } // isLLVMObjdump accepts a string with path to an objdump binary, // and returns a boolean indicating if the given binary is an LLVM // objdump binary of an acceptable version. func isLLVMObjdump(output string) bool { … } // isBuObjdump accepts a string with path to an objdump binary, // and returns a boolean indicating if the given binary is a GNU // binutils objdump binary. No version check is performed. func isBuObjdump(output string) bool { … } // findExe looks for an executable command on a set of paths. // If it cannot find it, returns cmd. func findExe(cmd string, paths []string) (string, bool) { … } // Disasm returns the assembly instructions for the specified address range // of a binary. func (bu *Binutils) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { … } // Open satisfies the plugin.ObjTool interface. func (bu *Binutils) Open(name string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { … } func (b *binrep) openMachOCommon(name string, of *macho.File, start, limit, offset uint64) (plugin.ObjFile, error) { … } func (b *binrep) openFatMachO(name string, start, limit, offset uint64) (plugin.ObjFile, error) { … } func (b *binrep) openMachO(name string, start, limit, offset uint64) (plugin.ObjFile, error) { … } func (b *binrep) openELF(name string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { … } func (b *binrep) openPE(name string, start, limit, offset uint64) (plugin.ObjFile, error) { … } type elfMapping … // findProgramHeader returns the program segment that matches the current // mapping and the given address, or an error if it cannot find a unique program // header. func (m *elfMapping) findProgramHeader(ef *elf.File, addr uint64) (*elf.ProgHeader, error) { … } type file … // computeBase computes the relocation base for the given binary file only if // the elfMapping field is set. It populates the base and isData fields and // returns an error. func (f *file) computeBase(addr uint64) error { … } func (f *file) Name() string { … } func (f *file) ObjAddr(addr uint64) (uint64, error) { … } func (f *file) BuildID() string { … } func (f *file) SourceLine(addr uint64) ([]plugin.Frame, error) { … } func (f *file) Close() error { … } func (f *file) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { … } type fileNM … func (f *fileNM) SourceLine(addr uint64) ([]plugin.Frame, error) { … } type fileAddr2Line … func (f *fileAddr2Line) SourceLine(addr uint64) ([]plugin.Frame, error) { … } func (f *fileAddr2Line) init() { … } func (f *fileAddr2Line) Close() error { … }