LLVM  10.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 
61  if (!Name)
62  return Name.takeError();
63  OS << *Name;
64  return Error::success();
65 }
66 
68 
70  Expected<StringRef> NameOrErr = getSectionName(Sec);
71  if (NameOrErr)
72  return *NameOrErr == ".llvmbc";
73  consumeError(NameOrErr.takeError());
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 
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 = 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:
135  case file_magic::elf:
140  return createELFObjectFile(Object);
152  return createMachOObjectFile(Object);
156  return createCOFFObjectFile(Object);
162  return createWasmObjectFile(Object);
163  }
164  llvm_unreachable("Unexpected Object File Type");
165 }
166 
170  MemoryBuffer::getFile(ObjectPath);
171  if (std::error_code EC = FileOrErr.getError())
172  return errorCodeToError(EC);
173  std::unique_ptr<MemoryBuffer> Buffer = std::move(FileOrErr.get());
174 
176  createObjectFile(Buffer->getMemBufferRef());
177  if (Error Err = ObjOrErr.takeError())
178  return std::move(Err);
179  std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
180 
181  return OwningBinary<ObjectFile>(std::move(Obj), std::move(Buffer));
182 }
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
Definition: ObjectFile.cpp:168
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:253
virtual Expected< section_iterator > getRelocatedSection(DataRefImpl Sec) const
Definition: ObjectFile.cpp:88
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
Error takeError()
Take ownership of the stored error.
Definition: Error.h:552
static Expected< std::unique_ptr< ObjectFile > > createXCOFFObjectFile(MemoryBufferRef Object, unsigned FileType)
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const
Definition: ObjectFile.cpp:67
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:126
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: yaml2obj.h:21
64-bit XCOFF object file
Definition: Magic.h:49
ELF Relocatable object file.
Definition: Magic.h:26
content_iterator< SectionRef > section_iterator
Definition: ObjectFile.h:48
Windows minidump file.
Definition: Magic.h:42
COFF import library.
Definition: Magic.h:45
virtual bool isSectionBitcode(DataRefImpl Sec) const
Definition: ObjectFile.cpp:69
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:395
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:1188
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:87
void setTriple(const Twine &Str)
setTriple - Set all components to the new triple Str.
Definition: Triple.cpp:1164
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
virtual Expected< StringRef > getSectionName(DataRefImpl Sec) const =0
void consumeError(Error Err)
Consume a Error without doing anything.
Definition: Error.h:1001
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
static ErrorSuccess success()
Create a success value.
Definition: Error.h:326
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:321
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:160
WebAssembly Object file.
Definition: Magic.h:50
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:292
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:122
Mach-O Executable.
Definition: Magic.h:31
Unrecognized file.
Definition: Magic.h:22
Windows PDB debug info file.
Definition: Magic.h:51
Text-based Dynamic Library Stub file.
Definition: Magic.h:52
void setArch(ArchType Kind)
setArch - Set the architecture (first) component of the triple to a known type.
Definition: Triple.cpp:1168
reference get()
Definition: ErrorOr.h:156
Error printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override
Definition: ObjectFile.cpp:59
file_magic - An "enum class" enumeration of file types based on magic (the first N bytes of the file)...
Definition: Magic.h:20