MachO.h revision fd7aa38e304a09fa0ef51b85b773b649b7e58c5e
1f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===- MachO.h - MachO object file implementation ---------------*- C++ -*-===// 2f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// 3f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// The LLVM Compiler Infrastructure 4f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// 5f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// This file is distributed under the University of Illinois Open Source 6f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// License. See LICENSE.TXT for details. 7f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// 8f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===----------------------------------------------------------------------===// 9f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// 10fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola// This file declares the MachOObjectFile class, which implement the ObjectFile 11fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola// interface for MachO files. 12f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson// 13f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson//===----------------------------------------------------------------------===// 14f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 15f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#ifndef LLVM_OBJECT_MACHO_H 16f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#define LLVM_OBJECT_MACHO_H 17f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 18f16c2bb320f4d5b33dfaf8df8865f547e6d66005Rafael Espindola#include "llvm/ADT/ArrayRef.h" 19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h" 20774e7c82a84189a1f8194a63dc8040136ca6b4d8Rafael Espindola#include "llvm/Object/MachOFormat.h" 21255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Object/ObjectFile.h" 22f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#include "llvm/Support/MachO.h" 231832f4d94eb292d63824eaa043118ed6cc61389bOwen Anderson#include "llvm/Support/raw_ostream.h" 24f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 25f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace llvm { 26f7c93a3867b45e42db6927536f76e7d2869ead60Owen Andersonnamespace object { 27f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 28fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaclass MachOObjectFile : public ObjectFile { 29da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindolapublic: 30fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola struct LoadCommandInfo { 31fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola const char *Ptr; // Where in memory the load command is. 32fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::LoadCommand C; // The command itself. 33fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola }; 34da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola 35fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola MachOObjectFile(MemoryBuffer *Object, bool IsLittleEndian, bool Is64Bits, 36fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola error_code &ec); 37da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola 38fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 39fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 40fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 41fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; 42fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 43da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola virtual error_code getSymbolType(DataRefImpl Symb, 44da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola SymbolRef::Type &Res) const; 45fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 46fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; 47da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola virtual error_code getSymbolSection(DataRefImpl Symb, 48da2a2372c6ae715befae7f086afe769dd80814f3Rafael Espindola section_iterator &Res) const; 49fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const; 50f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 51fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 52fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 53f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 54f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 55f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 56f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const; 57f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 58fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const; 59fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const; 60fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, 61fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool &Res) const; 62fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const; 63f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const; 64fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const; 65fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 66fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool &Result) const; 67fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const; 68f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const; 69fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 70fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getRelocationNext(DataRefImpl Rel, 71fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola RelocationRef &Res) const; 72f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationAddress(DataRefImpl Rel, uint64_t &Res) const; 73f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const; 74f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationSymbol(DataRefImpl Rel, SymbolRef &Res) const; 75f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const; 76f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationTypeName(DataRefImpl Rel, 77f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola SmallVectorImpl<char> &Result) const; 78fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel, 79fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola int64_t &Res) const; 80f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationValueString(DataRefImpl Rel, 81f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola SmallVectorImpl<char> &Result) const; 82f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const; 83f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 84fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getLibraryNext(DataRefImpl LibData, LibraryRef &Res) const; 85fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual error_code getLibraryPath(DataRefImpl LibData, StringRef &Res) const; 86f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 87fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator begin_symbols() const; 88fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator end_symbols() const; 89f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 90fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator begin_dynamic_symbols() const; 91fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual symbol_iterator end_dynamic_symbols() const; 92f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 93fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual section_iterator begin_sections() const; 94fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual section_iterator end_sections() const; 95f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 96fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual library_iterator begin_libraries_needed() const; 97fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual library_iterator end_libraries_needed() const; 98f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 99fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual uint8_t getBytesInAddress() const; 100f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 101fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual StringRef getFileFormatName() const; 102fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual unsigned getArch() const; 103f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 104fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola virtual StringRef getLoadName() const; 105f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 106fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // In a MachO file, sections have a segment name. This is used in the .o 107fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // files. They have a single segment, but this field specifies which segment 108fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // a section should be put in in the final object. 109fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola StringRef getSectionFinalSegmentName(DataRefImpl Sec) const; 110f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 111fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // Names are stored as 16 bytes. These returns the raw 16 bytes without 112fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // interpreting them as a C string. 113fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola ArrayRef<char> getSectionRawName(DataRefImpl Sec) const; 114fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola ArrayRef<char> getSectionRawFinalSegmentName(DataRefImpl Sec) const; 115f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 116fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // MachO specific Info about relocations. 117fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool isRelocationScattered(const macho::RelocationEntry &RE) const; 118fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getPlainRelocationSymbolNum(const macho::RelocationEntry &RE) const; 119fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool getPlainRelocationExternal(const macho::RelocationEntry &RE) const; 120fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool getScatteredRelocationScattered(const macho::RelocationEntry &RE) const; 121fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola uint32_t getScatteredRelocationValue(const macho::RelocationEntry &RE) const; 122fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationAddress(const macho::RelocationEntry &RE) const; 123fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationPCRel(const macho::RelocationEntry &RE) const; 124fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationLength(const macho::RelocationEntry &RE) const; 125fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola unsigned getAnyRelocationType(const macho::RelocationEntry &RE) const; 126fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 127fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // Walk load commands. 128fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola LoadCommandInfo getFirstLoadCommandInfo() const; 129fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const; 130fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola 131fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola // MachO specific structures. 132fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Section getSection(DataRefImpl DRI) const; 133fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Section64 getSection64(DataRefImpl DRI) const; 134fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::SymbolTableEntry getSymbolTableEntry(DataRefImpl DRI) const; 135fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Symbol64TableEntry getSymbol64TableEntry(DataRefImpl DRI) const; 136fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::LinkeditDataLoadCommand 137fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola getLinkeditDataLoadCommand(const LoadCommandInfo &L) const; 138fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::RelocationEntry getRelocation(DataRefImpl Rel) const; 139fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::Header getHeader() const; 140fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola macho::SymtabLoadCommand getSymtabLoadCommand() const; 141f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 142fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola bool is64Bit() const; 143fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola void ReadULEB128s(uint64_t Index, SmallVectorImpl<uint64_t> &Out) const; 144f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 145fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola static bool classof(const Binary *v) { 146fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola return v->isMachO(); 147f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola } 148f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 149fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindolaprivate: 150fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola typedef SmallVector<const char*, 1> SectionList; 151fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola SectionList Sections; 152fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola const char *SymtabLoadCmd; 153fd7aa38e304a09fa0ef51b85b773b649b7e58c5eRafael Espindola}; 154f6cfc15705140cc958b784a1bc98f7f0f09be6beRafael Espindola 155f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson} 156f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson} 157f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 158f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson#endif 159f7c93a3867b45e42db6927536f76e7d2869ead60Owen Anderson 160