LLVM  8.0.1
ObjectFile.cpp
Go to the documentation of this file.
1 //===- ObjectFile.cpp - File format independent object file ---------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines a file format independent ObjectFile class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/Object/ObjectFile.h"
15 #include "llvm/ADT/StringRef.h"
17 #include "llvm/Object/Binary.h"
18 #include "llvm/Object/COFF.h"
19 #include "llvm/Object/Error.h"
20 #include "llvm/Object/MachO.h"
21 #include "llvm/Object/Wasm.h"
22 #include "llvm/Support/Error.h"
24 #include "llvm/Support/ErrorOr.h"
28 #include <algorithm>
29 #include <cstdint>
30 #include <memory>
31 #include <system_error>
32 
33 using namespace llvm;
34 using namespace object;
35 
36 void ObjectFile::anchor() {}
37 
39  : SymbolicFile(Type, Source) {}
40 
43  if (!SymSec) {
44  // TODO: Actually report errors helpfully.
45  consumeError(SymSec.takeError());
46  return false;
47  }
48  return *this == **SymSec;
49 }
50 
52  uint32_t Flags = getSymbolFlags(Ref);
53  if (Flags & SymbolRef::SF_Undefined)
54  return 0;
55  if (Flags & SymbolRef::SF_Common)
56  return getCommonSymbolSize(Ref);
57  return getSymbolValueImpl(Ref);
58 }
59 
61  DataRefImpl Symb) const {
63  if (!Name)
64  return errorToErrorCode(Name.takeError());
65  OS << *Name;
66  return std::error_code();
67 }
68 
70 
72  StringRef SectName;
73  if (!getSectionName(Sec, SectName))
74  return SectName == ".llvmbc";
75  return false;
76 }
77 
78 bool ObjectFile::isSectionStripped(DataRefImpl Sec) const { return false; }
79 
81  return isSectionText(Sec);
82 }
83 
85  return isSectionData(Sec);
86 }
87 
89  return section_iterator(SectionRef(Sec, this));
90 }
91 
93  Triple TheTriple;
94  auto Arch = getArch();
95  TheTriple.setArch(Triple::ArchType(Arch));
96 
97  // For ARM targets, try to use the build attributes to build determine
98  // the build target. Target features are also added, but later during
99  // disassembly.
100  if (Arch == Triple::arm || Arch == Triple::armeb)
101  setARMSubArch(TheTriple);
102 
103  // TheTriple defaults to ELF, and COFF doesn't have an environment:
104  // the best we can do here is indicate that it is mach-o.
105  if (isMachO())
106  TheTriple.setObjectFormat(Triple::MachO);
107 
108  if (isCOFF()) {
109  const auto COFFObj = dyn_cast<COFFObjectFile>(this);
110  if (COFFObj->getArch() == Triple::thumb)
111  TheTriple.setTriple("thumbv7-windows");
112  }
113 
114  return TheTriple;
115 }
116 
119  StringRef Data = Object.getBuffer();
120  if (Type == file_magic::unknown)
121  Type = identify_magic(Data);
122 
123  switch (Type) {
124  case file_magic::unknown:
125  case file_magic::bitcode:
127  case file_magic::archive:
130  case file_magic::pdb:
132  case file_magic::elf:
137  return createELFObjectFile(Object);
149  return createMachOObjectFile(Object);
153  return createCOFFObjectFile(Object);
155  return createWasmObjectFile(Object);
156  }
157  llvm_unreachable("Unexpected Object File Type");
158 }
159 
163  MemoryBuffer::getFile(ObjectPath);
164  if (std::error_code EC = FileOrErr.getError())
165  return errorCodeToError(EC);
166  std::unique_ptr<MemoryBuffer> Buffer = std::move(FileOrErr.get());
167 
169  createObjectFile(Buffer->getMemBufferRef());
170  if (Error Err = ObjOrErr.takeError())
171  return std::move(Err);
172  std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
173 
174  return OwningBinary<ObjectFile>(std::move(Obj), std::move(Buffer));
175 }
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
Definition: ObjectFile.cpp:161
Represents either an error or a value T.
Definition: ErrorOr.h:57
Mach-O Object file.
Definition: Magic.h:31
ELF core image.
Definition: Magic.h:30
virtual bool isBerkeleyData(DataRefImpl Sec) const
Definition: ObjectFile.cpp:84
This class represents lattice values for constants.
Definition: AllocatorList.h:24
Microsoft cl.exe&#39;s intermediate code file.
Definition: Magic.h:43
ELF dynamically linked shared lib.
Definition: Magic.h:29
friend class SectionRef
Definition: ObjectFile.h:234
Triple makeTriple() const
Create a triple from the data in this object file.
Definition: ObjectFile.cpp:92
Windows compiled resource file (.res)
Definition: Magic.h:47
virtual std::error_code getSectionName(DataRefImpl Sec, StringRef &Res) const =0
Error takeError()
Take ownership of the stored error.
Definition: Error.h:553
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const
Definition: ObjectFile.cpp:69
virtual Expected< StringRef > getSymbolName(DataRefImpl Symb) const =0
virtual bool isSectionStripped(DataRefImpl Sec) const
Definition: ObjectFile.cpp:78
Mach-O Bundle file.
Definition: Magic.h:38
Mach-O Preloaded Executable.
Definition: Magic.h:35
Bitcode file.
Definition: Magic.h:24
bool isCOFF() const
Definition: Binary.h:117
amdgpu Simplify well known AMD library false Value Value const Twine & Name
StringRef getBuffer() const
Definition: MemoryBuffer.h:273
file_magic identify_magic(StringRef magic)
Identify the type of a binary file based on how magical it is.
Definition: Magic.cpp:35
The Mach-O dynamic linker.
Definition: Magic.h:37
Tagged union holding either a T or a Error.
Definition: CachePruning.h:23
ELF Relocatable object file.
Definition: Magic.h:27
content_iterator< SectionRef > section_iterator
Definition: ObjectFile.h:48
COFF import library.
Definition: Magic.h:45
virtual bool isSectionBitcode(DataRefImpl Sec) const
Definition: ObjectFile.cpp:71
Mach-O universal binary.
Definition: Magic.h:42
Expected< section_iterator > getSection() const
Get section this symbol is defined in reference to.
Definition: ObjectFile.h:379
Mach-O Core File.
Definition: Magic.h:34
Mach-O dSYM companion file.
Definition: Magic.h:40
virtual uint32_t getSymbolFlags(DataRefImpl Symb) const =0
void setObjectFormat(ObjectFormatType Kind)
setObjectFormat - Set the object file format
Definition: Triple.cpp:1166
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition: Error.cpp:88
void setTriple(const Twine &Str)
setTriple - Set all components to the new triple Str.
Definition: Triple.cpp:1142
static Expected< std::unique_ptr< ObjectFile > > createELFObjectFile(MemoryBufferRef Object)
std::error_code getError() const
Definition: ErrorOr.h:160
bool containsSymbol(SymbolRef S) const
Definition: ObjectFile.cpp:41
PECOFF executable file.
Definition: Magic.h:46
void consumeError(Error Err)
Consume a Error without doing anything.
Definition: Error.h:982
COFF object file.
Definition: Magic.h:44
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
static Expected< std::unique_ptr< WasmObjectFile > > createWasmObjectFile(MemoryBufferRef Object)
Mach-O kext bundle file.
Definition: Magic.h:41
ar style archive file
Definition: Magic.h:25
std::error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override
Definition: ObjectFile.cpp:60
static Expected< std::unique_ptr< COFFObjectFile > > createCOFFObjectFile(MemoryBufferRef Object)
static Expected< std::unique_ptr< MachOObjectFile > > createMachOObjectFile(MemoryBufferRef Object, uint32_t UniversalCputype=0, uint32_t UniversalIndex=0)
virtual void setARMSubArch(Triple &TheTriple) const
Definition: ObjectFile.h:303
virtual Triple::ArchType getArch() const =0
uint64_t getSymbolValue(DataRefImpl Symb) const
Definition: ObjectFile.cpp:51
ELF Unknown type.
Definition: Magic.h:26
ELF Executable image.
Definition: Magic.h:28
MemoryBufferRef Data
Definition: Binary.h:37
virtual bool isSectionText(DataRefImpl Sec) const =0
This is a value type class that represents a single symbol in the list of symbols in the object file...
Definition: ObjectFile.h:141
WebAssembly Object file.
Definition: Magic.h:48
virtual bool isBerkeleyText(DataRefImpl Sec) const
Definition: ObjectFile.cpp:80
virtual bool isSectionData(DataRefImpl Sec) const =0
uint64_t getCommonSymbolSize(DataRefImpl Symb) const
Definition: ObjectFile.h:274
virtual section_iterator getRelocatedSection(DataRefImpl Sec) const
Definition: ObjectFile.cpp:88
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
virtual uint64_t getSymbolValueImpl(DataRefImpl Symb) const =0
Provides ErrorOr<T> smart pointer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful, otherwise returning null.
Lightweight error class with error context and mandatory checking.
Definition: Error.h:158
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
bool isMachO() const
Definition: Binary.h:113
Mach-O Executable.
Definition: Magic.h:32
Unrecognized file.
Definition: Magic.h:23
std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
Definition: Error.cpp:94
Windows PDB debug info file.
Definition: Magic.h:49
void setArch(ArchType Kind)
setArch - Set the architecture (first) component of the triple to a known type.
Definition: Triple.cpp:1146
reference get()
Definition: ErrorOr.h:157
file_magic - An "enum class" enumeration of file types based on magic (the first N bytes of the file)...
Definition: Magic.h:21