LLVM  9.0.0svn
ObjectFile.cpp
Go to the documentation of this file.
1 //===- ObjectFile.cpp - File format independent object file ---------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines a file format independent ObjectFile class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/Object/ObjectFile.h"
14 #include "llvm/ADT/StringRef.h"
16 #include "llvm/Object/Binary.h"
17 #include "llvm/Object/COFF.h"
18 #include "llvm/Object/Error.h"
19 #include "llvm/Object/MachO.h"
20 #include "llvm/Object/Wasm.h"
21 #include "llvm/Support/Error.h"
23 #include "llvm/Support/ErrorOr.h"
27 #include <algorithm>
28 #include <cstdint>
29 #include <memory>
30 #include <system_error>
31 
32 using namespace llvm;
33 using namespace object;
34 
35 void ObjectFile::anchor() {}
36 
38  : SymbolicFile(Type, Source) {}
39 
42  if (!SymSec) {
43  // TODO: Actually report errors helpfully.
44  consumeError(SymSec.takeError());
45  return false;
46  }
47  return *this == **SymSec;
48 }
49 
51  uint32_t Flags = getSymbolFlags(Ref);
52  if (Flags & SymbolRef::SF_Undefined)
53  return 0;
54  if (Flags & SymbolRef::SF_Common)
55  return getCommonSymbolSize(Ref);
56  return getSymbolValueImpl(Ref);
57 }
58 
60  DataRefImpl Symb) const {
62  if (!Name)
63  return errorToErrorCode(Name.takeError());
64  OS << *Name;
65  return std::error_code();
66 }
67 
69 
71  StringRef SectName;
72  if (!getSectionName(Sec, SectName))
73  return SectName == ".llvmbc";
74  return false;
75 }
76 
77 bool ObjectFile::isSectionStripped(DataRefImpl Sec) const { return false; }
78 
80  return isSectionText(Sec);
81 }
82 
84  return isSectionData(Sec);
85 }
86 
88  return section_iterator(SectionRef(Sec, this));
89 }
90 
92  Triple TheTriple;
93  auto Arch = getArch();
94  TheTriple.setArch(Triple::ArchType(Arch));
95 
96  // For ARM targets, try to use the build attributes to build determine
97  // the build target. Target features are also added, but later during
98  // disassembly.
99  if (Arch == Triple::arm || Arch == Triple::armeb)
100  setARMSubArch(TheTriple);
101 
102  // TheTriple defaults to ELF, and COFF doesn't have an environment:
103  // the best we can do here is indicate that it is mach-o.
104  if (isMachO())
105  TheTriple.setObjectFormat(Triple::MachO);
106 
107  if (isCOFF()) {
108  const auto COFFObj = dyn_cast<COFFObjectFile>(this);
109  if (COFFObj->getArch() == Triple::thumb)
110  TheTriple.setTriple("thumbv7-windows");
111  }
112 
113  return TheTriple;
114 }
115 
118  StringRef Data = Object.getBuffer();
119  if (Type == file_magic::unknown)
120  Type = identify_magic(Data);
121 
122  switch (Type) {
123  case file_magic::unknown:
124  case file_magic::bitcode:
126  case file_magic::archive:
129  case file_magic::pdb:
132  case file_magic::elf:
137  return createELFObjectFile(Object);
149  return createMachOObjectFile(Object);
153  return createCOFFObjectFile(Object);
155  return createXCOFFObjectFile(Object);
157  return createWasmObjectFile(Object);
158  }
159  llvm_unreachable("Unexpected Object File Type");
160 }
161 
165  MemoryBuffer::getFile(ObjectPath);
166  if (std::error_code EC = FileOrErr.getError())
167  return errorCodeToError(EC);
168  std::unique_ptr<MemoryBuffer> Buffer = std::move(FileOrErr.get());
169 
171  createObjectFile(Buffer->getMemBufferRef());
172  if (Error Err = ObjOrErr.takeError())
173  return std::move(Err);
174  std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
175 
176  return OwningBinary<ObjectFile>(std::move(Obj), std::move(Buffer));
177 }
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
Definition: ObjectFile.cpp:163
32-bit XCOFF object file
Definition: Magic.h:48
Represents either an error or a value T.
Definition: ErrorOr.h:56
Mach-O Object file.
Definition: Magic.h:30
ELF core image.
Definition: Magic.h:29
virtual bool isBerkeleyData(DataRefImpl Sec) const
Definition: ObjectFile.cpp:83
This class represents lattice values for constants.
Definition: AllocatorList.h:23
Microsoft cl.exe&#39;s intermediate code file.
Definition: Magic.h:43
ELF dynamically linked shared lib.
Definition: Magic.h:28
amdgpu Simplify well known AMD library false FunctionCallee Value const Twine & Name
friend class SectionRef
Definition: ObjectFile.h:257
Triple makeTriple() const
Create a triple from the data in this object file.
Definition: ObjectFile.cpp:91
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:552
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const
Definition: ObjectFile.cpp:68
virtual Expected< StringRef > getSymbolName(DataRefImpl Symb) const =0
virtual bool isSectionStripped(DataRefImpl Sec) const
Definition: ObjectFile.cpp:77
Mach-O Bundle file.
Definition: Magic.h:37
Mach-O Preloaded Executable.
Definition: Magic.h:34
Bitcode file.
Definition: Magic.h:23
bool isCOFF() const
Definition: Binary.h:120
StringRef getBuffer() const
Definition: MemoryBuffer.h:272
file_magic identify_magic(StringRef magic)
Identify the type of a binary file based on how magical it is.
Definition: Magic.cpp:34
The Mach-O dynamic linker.
Definition: Magic.h:36
Tagged union holding either a T or a Error.
Definition: CachePruning.h:22
ELF Relocatable object file.
Definition: Magic.h:26
content_iterator< SectionRef > section_iterator
Definition: ObjectFile.h:47
Windows minidump file.
Definition: Magic.h:42
COFF import library.
Definition: Magic.h:45
virtual bool isSectionBitcode(DataRefImpl Sec) const
Definition: ObjectFile.cpp:70
Mach-O universal binary.
Definition: Magic.h:41
Expected< section_iterator > getSection() const
Get section this symbol is defined in reference to.
Definition: ObjectFile.h:405
Mach-O Core File.
Definition: Magic.h:33
Mach-O dSYM companion file.
Definition: Magic.h:39
virtual uint32_t getSymbolFlags(DataRefImpl Symb) const =0
void setObjectFormat(ObjectFormatType Kind)
setObjectFormat - Set the object file format
Definition: Triple.cpp:1173
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:45
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition: Error.cpp:87
void setTriple(const Twine &Str)
setTriple - Set all components to the new triple Str.
Definition: Triple.cpp:1149
static Expected< std::unique_ptr< ObjectFile > > createELFObjectFile(MemoryBufferRef Object)
std::error_code getError() const
Definition: ErrorOr.h:159
bool containsSymbol(SymbolRef S) const
Definition: ObjectFile.cpp:40
PECOFF executable file.
Definition: Magic.h:46
static Expected< std::unique_ptr< ObjectFile > > createXCOFFObjectFile(MemoryBufferRef Object)
void consumeError(Error Err)
Consume a Error without doing anything.
Definition: Error.h:981
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:43
static Expected< std::unique_ptr< WasmObjectFile > > createWasmObjectFile(MemoryBufferRef Object)
Mach-O kext bundle file.
Definition: Magic.h:40
ar style archive file
Definition: Magic.h:24
std::error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override
Definition: ObjectFile.cpp:59
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:326
virtual Triple::ArchType getArch() const =0
uint64_t getSymbolValue(DataRefImpl Symb) const
Definition: ObjectFile.cpp:50
ELF Unknown type.
Definition: Magic.h:25
ELF Executable image.
Definition: Magic.h:27
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:164
WebAssembly Object file.
Definition: Magic.h:49
virtual bool isBerkeleyText(DataRefImpl Sec) const
Definition: ObjectFile.cpp:79
virtual bool isSectionData(DataRefImpl Sec) const =0
uint64_t getCommonSymbolSize(DataRefImpl Symb) const
Definition: ObjectFile.h:297
virtual section_iterator getRelocatedSection(DataRefImpl Sec) const
Definition: ObjectFile.cpp:87
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:332
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:157
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
bool isMachO() const
Definition: Binary.h:116
Mach-O Executable.
Definition: Magic.h:31
Unrecognized file.
Definition: Magic.h:22
std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
Definition: Error.cpp:93
Windows PDB debug info file.
Definition: Magic.h:50
void setArch(ArchType Kind)
setArch - Set the architecture (first) component of the triple to a known type.
Definition: Triple.cpp:1153
reference get()
Definition: ErrorOr.h:156
file_magic - An "enum class" enumeration of file types based on magic (the first N bytes of the file)...
Definition: Magic.h:20