blob: 5eabb298c2a548d2a2f6b6ea7fd78040ce359fe9 [file] [log] [blame]
Michael J. Spencer84487f12015-07-24 21:03:07 +00001//===- InputFiles.cpp -----------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "InputFiles.h"
Rafael Espindola9d06ab62015-09-22 00:01:39 +000011#include "InputSection.h"
Rafael Espindola192e1fa2015-08-06 15:08:23 +000012#include "Error.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000013#include "Symbols.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000014#include "llvm/ADT/STLExtras.h"
15
Michael J. Spencer1b348a62015-09-04 22:28:10 +000016using namespace llvm;
Michael J. Spencer84487f12015-07-24 21:03:07 +000017using namespace llvm::ELF;
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000018using namespace llvm::object;
Rui Ueyamaf5c4aca2015-09-30 17:06:09 +000019using namespace llvm::sys::fs;
Michael J. Spencer84487f12015-07-24 21:03:07 +000020
21using namespace lld;
22using namespace lld::elf2;
23
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000024template <class ELFT> static uint16_t getEMachine(const ELFFileBase &B) {
25 bool IsShared = isa<SharedFileBase>(B);
26 if (IsShared)
27 return cast<SharedFile<ELFT>>(B).getEMachine();
28 return cast<ObjectFile<ELFT>>(B).getEMachine();
Rafael Espindola3c9cb4b2015-08-05 12:03:34 +000029}
30
Rafael Espindola503fe942015-09-22 16:53:55 +000031uint16_t ELFFileBase::getEMachine() const {
32 switch (EKind) {
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000033 case ELF32BEKind:
Rafael Espindola503fe942015-09-22 16:53:55 +000034 return ::getEMachine<ELF32BE>(*this);
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000035 case ELF32LEKind:
Rafael Espindola503fe942015-09-22 16:53:55 +000036 return ::getEMachine<ELF32LE>(*this);
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000037 case ELF64BEKind:
Rafael Espindola503fe942015-09-22 16:53:55 +000038 return ::getEMachine<ELF64BE>(*this);
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000039 case ELF64LEKind:
Rafael Espindola503fe942015-09-22 16:53:55 +000040 return ::getEMachine<ELF64LE>(*this);
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000041 }
Rafael Espindola55eed7ef2015-09-03 22:25:11 +000042 llvm_unreachable("Invalid kind");
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000043}
44
45bool ELFFileBase::isCompatibleWith(const ELFFileBase &Other) const {
46 return getELFKind() == Other.getELFKind() &&
Rafael Espindola503fe942015-09-22 16:53:55 +000047 getEMachine() == Other.getEMachine();
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000048}
49
Rafael Espindolae1901cc2015-09-24 15:11:50 +000050namespace {
51class ECRAII {
Michael J. Spencer84487f12015-07-24 21:03:07 +000052 std::error_code EC;
Rafael Espindolae1901cc2015-09-24 15:11:50 +000053
54public:
55 std::error_code &getEC() { return EC; }
56 ~ECRAII() { error(EC); }
57};
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000058}
59
Rafael Espindola18173d42015-09-08 15:50:05 +000060template <class ELFT>
Rafael Espindolae1901cc2015-09-24 15:11:50 +000061ELFData<ELFT>::ELFData(MemoryBufferRef MB)
62 : ELFObj(MB.getBuffer(), ECRAII().getEC()) {}
63
64template <class ELFT>
Davide Italiano6d328d32015-09-16 20:45:57 +000065typename ELFData<ELFT>::Elf_Sym_Range
66ELFData<ELFT>::getSymbolsHelper(bool Local) {
Rafael Espindola18173d42015-09-08 15:50:05 +000067 if (!Symtab)
68 return Elf_Sym_Range(nullptr, nullptr);
Rafael Espindolae1901cc2015-09-24 15:11:50 +000069 Elf_Sym_Range Syms = ELFObj.symbols(Symtab);
Rafael Espindola18173d42015-09-08 15:50:05 +000070 uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
71 uint32_t FirstNonLocal = Symtab->sh_info;
72 if (FirstNonLocal > NumSymbols)
73 error("Invalid sh_info in symbol table");
Davide Italiano6d328d32015-09-16 20:45:57 +000074 if (!Local)
Rui Ueyama90b3daa2015-09-30 02:37:51 +000075 return make_range(Syms.begin() + FirstNonLocal, Syms.end());
76 // +1 to skip over dummy symbol.
77 return make_range(Syms.begin() + 1, Syms.begin() + FirstNonLocal);
Davide Italiano6d328d32015-09-16 20:45:57 +000078}
79
80template <class ELFT>
81typename ELFData<ELFT>::Elf_Sym_Range ELFData<ELFT>::getNonLocalSymbols() {
82 if (!Symtab)
83 return Elf_Sym_Range(nullptr, nullptr);
Rafael Espindolae1901cc2015-09-24 15:11:50 +000084 ErrorOr<StringRef> StringTableOrErr = ELFObj.getStringTableForSymtab(*Symtab);
Davide Italiano6d328d32015-09-16 20:45:57 +000085 error(StringTableOrErr.getError());
86 StringTable = *StringTableOrErr;
87 return getSymbolsHelper(false);
88}
89
90template <class ELFT>
Rafael Espindolae1901cc2015-09-24 15:11:50 +000091ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M)
92 : ObjectFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}
93
94template <class ELFT>
Davide Italiano6d328d32015-09-16 20:45:57 +000095typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {
96 return this->getSymbolsHelper(true);
Rafael Espindola18173d42015-09-08 15:50:05 +000097}
98
Rafael Espindolaf98d6d82015-09-03 20:03:54 +000099template <class ELFT> void elf2::ObjectFile<ELFT>::parse() {
Michael J. Spencer84487f12015-07-24 21:03:07 +0000100 // Read section and symbol tables.
Rafael Espindola71675852015-09-22 00:16:19 +0000101 initializeSections();
Michael J. Spencer84487f12015-07-24 21:03:07 +0000102 initializeSymbols();
103}
104
Rafael Espindola71675852015-09-22 00:16:19 +0000105template <class ELFT> void elf2::ObjectFile<ELFT>::initializeSections() {
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000106 uint64_t Size = this->ELFObj.getNumSections();
Rafael Espindola71675852015-09-22 00:16:19 +0000107 Sections.resize(Size);
Rafael Espindola832b93f2015-08-24 20:06:32 +0000108 unsigned I = 0;
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000109 for (const Elf_Shdr &Sec : this->ELFObj.sections()) {
Rafael Espindolacde25132015-08-13 14:45:44 +0000110 switch (Sec.sh_type) {
111 case SHT_SYMTAB:
Rafael Espindola18173d42015-09-08 15:50:05 +0000112 this->Symtab = &Sec;
Rafael Espindolacde25132015-08-13 14:45:44 +0000113 break;
Rafael Espindola20348222015-08-24 21:43:25 +0000114 case SHT_SYMTAB_SHNDX: {
Rafael Espindolaf98d6d82015-09-03 20:03:54 +0000115 ErrorOr<ArrayRef<Elf_Word>> ErrorOrTable =
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000116 this->ELFObj.getSHNDXTable(Sec);
Rafael Espindola20348222015-08-24 21:43:25 +0000117 error(ErrorOrTable);
118 SymtabSHNDX = *ErrorOrTable;
119 break;
120 }
Rafael Espindolacde25132015-08-13 14:45:44 +0000121 case SHT_STRTAB:
122 case SHT_NULL:
Rafael Espindolacde25132015-08-13 14:45:44 +0000123 break;
Michael J. Spencer67bc8d62015-08-27 23:15:56 +0000124 case SHT_RELA:
125 case SHT_REL: {
126 uint32_t RelocatedSectionIndex = Sec.sh_info;
127 if (RelocatedSectionIndex >= Size)
128 error("Invalid relocated section index");
Rafael Espindola71675852015-09-22 00:16:19 +0000129 InputSection<ELFT> *RelocatedSection = Sections[RelocatedSectionIndex];
Michael J. Spencer67bc8d62015-08-27 23:15:56 +0000130 if (!RelocatedSection)
131 error("Unsupported relocation reference");
132 RelocatedSection->RelocSections.push_back(&Sec);
133 break;
134 }
Rafael Espindolacde25132015-08-13 14:45:44 +0000135 default:
Rafael Espindola71675852015-09-22 00:16:19 +0000136 Sections[I] = new (Alloc) InputSection<ELFT>(this, &Sec);
Rafael Espindolacde25132015-08-13 14:45:44 +0000137 break;
Michael J. Spencer84487f12015-07-24 21:03:07 +0000138 }
Rafael Espindola832b93f2015-08-24 20:06:32 +0000139 ++I;
Michael J. Spencer84487f12015-07-24 21:03:07 +0000140 }
141}
142
143template <class ELFT> void elf2::ObjectFile<ELFT>::initializeSymbols() {
Rafael Espindola18173d42015-09-08 15:50:05 +0000144 Elf_Sym_Range Syms = this->getNonLocalSymbols();
Reid Klecknerf7b85e02015-08-11 20:06:51 +0000145 uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
Rafael Espindola18173d42015-09-08 15:50:05 +0000146 SymbolBodies.reserve(NumSymbols);
Rafael Espindola30318512015-08-04 14:00:56 +0000147 for (const Elf_Sym &Sym : Syms)
Rafael Espindola18173d42015-09-08 15:50:05 +0000148 SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));
Michael J. Spencer84487f12015-07-24 21:03:07 +0000149}
150
151template <class ELFT>
152SymbolBody *elf2::ObjectFile<ELFT>::createSymbolBody(StringRef StringTable,
153 const Elf_Sym *Sym) {
154 ErrorOr<StringRef> NameOrErr = Sym->getName(StringTable);
155 error(NameOrErr.getError());
156 StringRef Name = *NameOrErr;
Rafael Espindola20348222015-08-24 21:43:25 +0000157
158 uint32_t SecIndex = Sym->st_shndx;
Rafael Espindola51d46902015-08-28 21:26:51 +0000159 switch (SecIndex) {
160 case SHN_ABS:
Rafael Espindola0e0c1902015-08-27 12:40:06 +0000161 return new (Alloc) DefinedAbsolute<ELFT>(Name, *Sym);
Rafael Espindola51d46902015-08-28 21:26:51 +0000162 case SHN_UNDEF:
163 return new (Alloc) Undefined<ELFT>(Name, *Sym);
164 case SHN_COMMON:
165 return new (Alloc) DefinedCommon<ELFT>(Name, *Sym);
166 case SHN_XINDEX:
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000167 SecIndex = this->ELFObj.getExtendedSymbolTableIndex(Sym, this->Symtab,
168 SymtabSHNDX);
Rafael Espindola51d46902015-08-28 21:26:51 +0000169 break;
170 }
Rafael Espindola20348222015-08-24 21:43:25 +0000171
Rafael Espindola71675852015-09-22 00:16:19 +0000172 if (SecIndex >= Sections.size() || (SecIndex != 0 && !Sections[SecIndex]))
Rafael Espindola5cd113d2015-08-24 22:00:25 +0000173 error("Invalid section index");
174
Rafael Espindolab13df652015-08-11 17:33:02 +0000175 switch (Sym->getBinding()) {
176 default:
177 error("unexpected binding");
178 case STB_GLOBAL:
Rafael Espindola3a63f3f2015-08-28 20:19:34 +0000179 case STB_WEAK:
Rafael Espindola71675852015-09-22 00:16:19 +0000180 return new (Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sections[SecIndex]);
Rafael Espindolab13df652015-08-11 17:33:02 +0000181 }
Michael J. Spencer84487f12015-07-24 21:03:07 +0000182}
183
Igor Kudrin2696bbe2015-10-01 18:02:21 +0000184static std::unique_ptr<Archive> openArchive(MemoryBufferRef MB) {
Rui Ueyamad0e5aeb2015-09-30 02:42:27 +0000185 ErrorOr<std::unique_ptr<Archive>> ArchiveOrErr = Archive::create(MB);
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000186 error(ArchiveOrErr, "Failed to parse archive");
Igor Kudrin2696bbe2015-10-01 18:02:21 +0000187 return std::move(*ArchiveOrErr);
188}
189
190void ArchiveFile::parse() {
191 File = openArchive(MB);
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000192
193 // Allocate a buffer for Lazy objects.
194 size_t NumSyms = File->getNumberOfSymbols();
195 LazySymbols.reserve(NumSyms);
196
197 // Read the symbol table to construct Lazy objects.
198 for (const Archive::Symbol &Sym : File->symbols())
199 LazySymbols.emplace_back(this, Sym);
200}
201
202// Returns a buffer pointing to a member file containing a given symbol.
203MemoryBufferRef ArchiveFile::getMember(const Archive::Symbol *Sym) {
204 ErrorOr<Archive::child_iterator> ItOrErr = Sym->getMember();
205 error(ItOrErr,
206 Twine("Could not get the member for symbol ") + Sym->getName());
207 Archive::child_iterator It = *ItOrErr;
208
Michael J. Spencer88f0d632015-09-08 20:36:20 +0000209 if (!Seen.insert(It->getChildOffset()).second)
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000210 return MemoryBufferRef();
Michael J. Spencer88f0d632015-09-08 20:36:20 +0000211
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000212 ErrorOr<MemoryBufferRef> Ret = It->getMemoryBufferRef();
213 error(Ret, Twine("Could not get the buffer for the member defining symbol ") +
214 Sym->getName());
215 return *Ret;
216}
217
Igor Kudrin2696bbe2015-10-01 18:02:21 +0000218std::vector<MemoryBufferRef> ArchiveFile::getMembers() {
219 File = openArchive(MB);
220
221 std::vector<MemoryBufferRef> Result;
222 for (const Archive::Child &Child : File->children()) {
223 ErrorOr<MemoryBufferRef> MbOrErr = Child.getMemoryBufferRef();
224 error(MbOrErr,
225 Twine("Could not get the buffer for a child of the archive ") +
226 File->getFileName());
227 Result.push_back(MbOrErr.get());
228 }
229 return Result;
230}
231
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000232template <class ELFT>
233SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
234 : SharedFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}
Rafael Espindola18173d42015-09-08 15:50:05 +0000235
Rafael Espindolae1901cc2015-09-24 15:11:50 +0000236template <class ELFT> void SharedFile<ELFT>::parse() {
Rafael Espindolac8b15812015-10-01 15:47:50 +0000237 typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
238 typedef typename ELFFile<ELFT>::uintX_t uintX_t;
239 const Elf_Shdr *DynamicSec = nullptr;
240
241 const ELFFile<ELFT> Obj = this->ELFObj;
242 for (const Elf_Shdr &Sec : Obj.sections()) {
243 uint32_t Type = Sec.sh_type;
244 if (Type == SHT_DYNSYM)
Rafael Espindola18173d42015-09-08 15:50:05 +0000245 this->Symtab = &Sec;
Rafael Espindolac8b15812015-10-01 15:47:50 +0000246 else if (Type == SHT_DYNAMIC)
247 DynamicSec = &Sec;
248 }
249
250 // Also sets StringTable
251 Elf_Sym_Range Syms = this->getNonLocalSymbols();
252 SoName = getName();
253
254 if (DynamicSec) {
255 auto *Begin =
256 reinterpret_cast<const Elf_Dyn *>(Obj.base() + DynamicSec->sh_offset);
257 const Elf_Dyn *End = Begin + DynamicSec->sh_size / sizeof(Elf_Dyn);
258
259 for (const Elf_Dyn &Dyn : make_range(Begin, End)) {
260 if (Dyn.d_tag == DT_SONAME) {
261 uintX_t Val = Dyn.getVal();
262 if (Val >= this->StringTable.size())
263 error("Invalid DT_SONAME entry");
264 SoName = StringRef(this->StringTable.data() + Val);
265 break;
266 }
Rafael Espindola18173d42015-09-08 15:50:05 +0000267 }
268 }
269
Rafael Espindola18173d42015-09-08 15:50:05 +0000270 uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
271 SymbolBodies.reserve(NumSymbols);
272 for (const Elf_Sym &Sym : Syms) {
273 if (Sym.isUndefined())
274 continue;
275
276 ErrorOr<StringRef> NameOrErr = Sym.getName(this->StringTable);
277 error(NameOrErr.getError());
278 StringRef Name = *NameOrErr;
279
280 SymbolBodies.emplace_back(Name, Sym);
281 }
282}
Rafael Espindolaf98d6d82015-09-03 20:03:54 +0000283
Michael J. Spencer84487f12015-07-24 21:03:07 +0000284namespace lld {
285namespace elf2 {
Davide Italiano6d328d32015-09-16 20:45:57 +0000286
Michael J. Spencer84487f12015-07-24 21:03:07 +0000287template class elf2::ObjectFile<llvm::object::ELF32LE>;
288template class elf2::ObjectFile<llvm::object::ELF32BE>;
289template class elf2::ObjectFile<llvm::object::ELF64LE>;
290template class elf2::ObjectFile<llvm::object::ELF64BE>;
Rafael Espindolaf98d6d82015-09-03 20:03:54 +0000291
292template class elf2::SharedFile<llvm::object::ELF32LE>;
293template class elf2::SharedFile<llvm::object::ELF32BE>;
294template class elf2::SharedFile<llvm::object::ELF64LE>;
295template class elf2::SharedFile<llvm::object::ELF64BE>;
Michael J. Spencer84487f12015-07-24 21:03:07 +0000296}
297}