1 //===- ObjectLinker.cpp ---------------------------------------------------===//
2 //
3 // The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #include <mcld/Object/ObjectLinker.h>
10
11 #include <mcld/LinkerConfig.h>
12 #include <mcld/Module.h>
13 #include <mcld/InputTree.h>
14 #include <mcld/IRBuilder.h>
15 #include <mcld/LD/LDSection.h>
16 #include <mcld/LD/LDContext.h>
17 #include <mcld/LD/Archive.h>
18 #include <mcld/LD/ArchiveReader.h>
19 #include <mcld/LD/ObjectReader.h>
20 #include <mcld/LD/DynObjReader.h>
21 #include <mcld/LD/GroupReader.h>
22 #include <mcld/LD/BinaryReader.h>
23 #include <mcld/LD/ObjectWriter.h>
24 #include <mcld/LD/ResolveInfo.h>
25 #include <mcld/LD/RelocData.h>
26 #include <mcld/LD/Relocator.h>
27 #include <mcld/Support/RealPath.h>
28 #include <mcld/Support/MemoryArea.h>
29 #include <mcld/Support/MsgHandling.h>
30 #include <mcld/Support/DefSymParser.h>
31 #include <mcld/Target/TargetLDBackend.h>
32 #include <mcld/Fragment/FragmentLinker.h>
33 #include <mcld/Object/ObjectBuilder.h>
34
35 #include <llvm/Support/Casting.h>
36
37
38 using namespace llvm;
39 using namespace mcld;
ObjectLinker(const LinkerConfig & pConfig,TargetLDBackend & pLDBackend)40 ObjectLinker::ObjectLinker(const LinkerConfig& pConfig,
41 TargetLDBackend& pLDBackend)
42 : m_Config(pConfig),
43 m_pLinker(NULL),
44 m_pModule(NULL),
45 m_pBuilder(NULL),
46 m_LDBackend(pLDBackend),
47 m_pObjectReader(NULL),
48 m_pDynObjReader(NULL),
49 m_pArchiveReader(NULL),
50 m_pGroupReader(NULL),
51 m_pBinaryReader(NULL),
52 m_pWriter(NULL) {
53 }
54
~ObjectLinker()55 ObjectLinker::~ObjectLinker()
56 {
57 delete m_pLinker;
58 delete m_pObjectReader;
59 delete m_pDynObjReader;
60 delete m_pArchiveReader;
61 delete m_pGroupReader;
62 delete m_pBinaryReader;
63 delete m_pWriter;
64 }
65
setup(Module & pModule,IRBuilder & pBuilder)66 void ObjectLinker::setup(Module& pModule, IRBuilder& pBuilder)
67 {
68 m_pModule = &pModule;
69 m_pBuilder = &pBuilder;
70
71 // set up soname
72 if (!m_Config.options().soname().empty()) {
73 m_pModule->setName(m_Config.options().soname());
74 }
75 }
76
77 /// initFragmentLinker - initialize FragmentLinker
78 /// Connect all components with FragmentLinker
initFragmentLinker()79 bool ObjectLinker::initFragmentLinker()
80 {
81 if (NULL == m_pLinker) {
82 m_pLinker = new FragmentLinker(m_Config,
83 *m_pModule,
84 m_LDBackend);
85 }
86
87 // initialize the readers and writers
88 // Because constructor can not be failed, we initalize all readers and
89 // writers outside the FragmentLinker constructors.
90 m_pObjectReader = m_LDBackend.createObjectReader(*m_pBuilder);
91 m_pArchiveReader = m_LDBackend.createArchiveReader(*m_pModule);
92 m_pDynObjReader = m_LDBackend.createDynObjReader(*m_pBuilder);
93 m_pBinaryReader = m_LDBackend.createBinaryReader(*m_pBuilder);
94 m_pGroupReader = new GroupReader(*m_pModule, *m_pObjectReader,
95 *m_pDynObjReader, *m_pArchiveReader, *m_pBinaryReader);
96 m_pWriter = m_LDBackend.createWriter();
97
98 // initialize Relocator
99 m_LDBackend.initRelocator();
100 return true;
101 }
102
103 /// initStdSections - initialize standard sections
initStdSections()104 bool ObjectLinker::initStdSections()
105 {
106 ObjectBuilder builder(m_Config, *m_pModule);
107
108 // initialize standard sections
109 if (!m_LDBackend.initStdSections(builder))
110 return false;
111
112 // initialize target-dependent sections
113 m_LDBackend.initTargetSections(*m_pModule, builder);
114
115 return true;
116 }
117
normalize()118 void ObjectLinker::normalize()
119 {
120 // ----- set up inputs ----- //
121 Module::input_iterator input, inEnd = m_pModule->input_end();
122 for (input = m_pModule->input_begin(); input!=inEnd; ++input) {
123 // is a group node
124 if (isGroup(input)) {
125 getGroupReader()->readGroup(input, m_pBuilder->getInputBuilder(), m_Config);
126 continue;
127 }
128
129 // already got type - for example, bitcode or external OIR (object
130 // intermediate representation)
131 if ((*input)->type() == Input::Script ||
132 (*input)->type() == Input::Archive ||
133 (*input)->type() == Input::External)
134 continue;
135
136 if (Input::Object == (*input)->type()) {
137 m_pModule->getObjectList().push_back(*input);
138 continue;
139 }
140
141 if (Input::DynObj == (*input)->type()) {
142 m_pModule->getLibraryList().push_back(*input);
143 continue;
144 }
145
146 // read input as a binary file
147 if (m_Config.options().isBinaryInput()) {
148 (*input)->setType(Input::Object);
149 getBinaryReader()->readBinary(**input);
150 m_pModule->getObjectList().push_back(*input);
151 }
152 // is a relocatable object file
153 else if (getObjectReader()->isMyFormat(**input)) {
154 (*input)->setType(Input::Object);
155 getObjectReader()->readHeader(**input);
156 getObjectReader()->readSections(**input);
157 getObjectReader()->readSymbols(**input);
158 m_pModule->getObjectList().push_back(*input);
159 }
160 // is a shared object file
161 else if (getDynObjReader()->isMyFormat(**input)) {
162 (*input)->setType(Input::DynObj);
163 getDynObjReader()->readHeader(**input);
164 getDynObjReader()->readSymbols(**input);
165 m_pModule->getLibraryList().push_back(*input);
166 }
167 // is an archive
168 else if (getArchiveReader()->isMyFormat(**input)) {
169 (*input)->setType(Input::Archive);
170 Archive archive(**input, m_pBuilder->getInputBuilder());
171 getArchiveReader()->readArchive(archive);
172 if(archive.numOfObjectMember() > 0) {
173 m_pModule->getInputTree().merge<InputTree::Inclusive>(input,
174 archive.inputs());
175 }
176 }
177 else {
178 fatal(diag::err_unrecognized_input_file) << (*input)->path()
179 << m_Config.targets().triple().str();
180 }
181 } // end of for
182 }
183
linkable() const184 bool ObjectLinker::linkable() const
185 {
186 // check we have input and output files
187 if (m_pModule->getInputTree().empty()) {
188 error(diag::err_no_inputs);
189 return false;
190 }
191
192 // can not mix -static with shared objects
193 Module::const_lib_iterator lib, libEnd = m_pModule->lib_end();
194 for (lib = m_pModule->lib_begin(); lib != libEnd; ++lib) {
195 if((*lib)->attribute()->isStatic()) {
196 error(diag::err_mixed_shared_static_objects)
197 << (*lib)->name() << (*lib)->path();
198 return false;
199 }
200 }
201
202 // --nmagic and --omagic options lead to static executable program.
203 // These options turn off page alignment of sections. Because the
204 // sections are not aligned to pages, these sections can not contain any
205 // exported functions. Also, because the two options disable linking
206 // against shared libraries, the output absolutely does not call outside
207 // functions.
208 if (m_Config.options().nmagic() && !m_Config.isCodeStatic()) {
209 error(diag::err_nmagic_not_static);
210 return false;
211 }
212 if (m_Config.options().omagic() && !m_Config.isCodeStatic()) {
213 error(diag::err_omagic_not_static);
214 return false;
215 }
216
217 return true;
218 }
219
220 /// readRelocations - read all relocation entries
221 ///
222 /// All symbols should be read and resolved before this function.
readRelocations()223 bool ObjectLinker::readRelocations()
224 {
225 // Bitcode is read by the other path. This function reads relocation sections
226 // in object files.
227 mcld::InputTree::bfs_iterator input, inEnd = m_pModule->getInputTree().bfs_end();
228 for (input=m_pModule->getInputTree().bfs_begin(); input!=inEnd; ++input) {
229 if ((*input)->type() == Input::Object && (*input)->hasMemArea()) {
230 if (!getObjectReader()->readRelocations(**input))
231 return false;
232 }
233 // ignore the other kinds of files.
234 }
235 return true;
236 }
237
238 /// mergeSections - put allinput sections into output sections
mergeSections()239 bool ObjectLinker::mergeSections()
240 {
241 ObjectBuilder builder(m_Config, *m_pModule);
242 Module::obj_iterator obj, objEnd = m_pModule->obj_end();
243 for (obj = m_pModule->obj_begin(); obj != objEnd; ++obj) {
244 LDContext::sect_iterator sect, sectEnd = (*obj)->context()->sectEnd();
245 for (sect = (*obj)->context()->sectBegin(); sect != sectEnd; ++sect) {
246 switch ((*sect)->kind()) {
247 // Some *INPUT sections should not be merged.
248 case LDFileFormat::Ignore:
249 case LDFileFormat::Null:
250 case LDFileFormat::Relocation:
251 case LDFileFormat::NamePool:
252 case LDFileFormat::Group:
253 case LDFileFormat::StackNote:
254 // skip
255 continue;
256 case LDFileFormat::Target:
257 if (!m_LDBackend.mergeSection(*m_pModule, **sect)) {
258 error(diag::err_cannot_merge_section) << (*sect)->name()
259 << (*obj)->name();
260 return false;
261 }
262 break;
263 case LDFileFormat::EhFrame: {
264 if (!(*sect)->hasEhFrame())
265 continue; // skip
266
267 LDSection* out_sect = NULL;
268 if (NULL == (out_sect = builder.MergeSection(**sect))) {
269 error(diag::err_cannot_merge_section) << (*sect)->name()
270 << (*obj)->name();
271 return false;
272 }
273
274 if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
275 error(diag::err_cannot_merge_section) << (*sect)->name()
276 << (*obj)->name();
277 return false;
278 }
279 break;
280 }
281 default: {
282 if (!(*sect)->hasSectionData())
283 continue; // skip
284
285 LDSection* out_sect = NULL;
286 if (NULL == (out_sect = builder.MergeSection(**sect))) {
287 error(diag::err_cannot_merge_section) << (*sect)->name()
288 << (*obj)->name();
289 return false;
290 }
291
292 if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
293 error(diag::err_cannot_merge_section) << (*sect)->name()
294 << (*obj)->name();
295 return false;
296 }
297 break;
298 }
299 } // end of switch
300 } // for each section
301 } // for each obj
302 return true;
303 }
304
305 /// addStandardSymbols - shared object and executable files need some
306 /// standard symbols
307 /// @return if there are some input symbols with the same name to the
308 /// standard symbols, return false
addStandardSymbols()309 bool ObjectLinker::addStandardSymbols()
310 {
311 // create and add section symbols for each output section
312 Module::iterator iter, iterEnd = m_pModule->end();
313 for (iter = m_pModule->begin(); iter != iterEnd; ++iter) {
314 m_pModule->getSectionSymbolSet().add(**iter, m_pModule->getNamePool());
315 }
316
317 return m_LDBackend.initStandardSymbols(*m_pBuilder, *m_pModule);
318 }
319
320 /// addTargetSymbols - some targets, such as MIPS and ARM, need some
321 /// target-dependent symbols
322 /// @return if there are some input symbols with the same name to the
323 /// target symbols, return false
addTargetSymbols()324 bool ObjectLinker::addTargetSymbols()
325 {
326 m_LDBackend.initTargetSymbols(*m_pBuilder, *m_pModule);
327 return true;
328 }
329
330 /// addScriptSymbols - define symbols from the command line option or linker
331 /// scripts.
addScriptSymbols()332 bool ObjectLinker::addScriptSymbols()
333 {
334 const LinkerScript& script = m_pModule->getScript();
335 LinkerScript::DefSymMap::const_entry_iterator it;
336 LinkerScript::DefSymMap::const_entry_iterator ie = script.defSymMap().end();
337 // go through the entire defSymMap
338 for (it = script.defSymMap().begin(); it != ie; ++it) {
339 const llvm::StringRef sym = it.getEntry()->key();
340 ResolveInfo* old_info = m_pModule->getNamePool().findInfo(sym);
341 // if the symbol does not exist, we can set type to NOTYPE
342 // else we retain its type, same goes for size - 0 or retain old value
343 // and visibility - Default or retain
344 if (old_info != NULL) {
345 if(!m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
346 sym,
347 static_cast<ResolveInfo::Type>(old_info->type()),
348 ResolveInfo::Define,
349 ResolveInfo::Absolute,
350 old_info->size(),
351 0x0,
352 FragmentRef::Null(),
353 old_info->visibility()))
354 return false;
355 }
356 else {
357 if (!m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
358 sym,
359 ResolveInfo::NoType,
360 ResolveInfo::Define,
361 ResolveInfo::Absolute,
362 0x0,
363 0x0,
364 FragmentRef::Null(),
365 ResolveInfo::Default))
366 return false;
367 }
368 }
369 return true;
370 }
371
scanRelocations()372 bool ObjectLinker::scanRelocations()
373 {
374 // apply all relocations of all inputs
375 Module::obj_iterator input, inEnd = m_pModule->obj_end();
376 for (input = m_pModule->obj_begin(); input != inEnd; ++input) {
377 m_LDBackend.getRelocator()->initializeScan(**input);
378 LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
379 for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
380 // bypass the reloc section if
381 // 1. its section kind is changed to Ignore. (The target section is a
382 // discarded group section.)
383 // 2. it has no reloc data. (All symbols in the input relocs are in the
384 // discarded group sections)
385 if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData())
386 continue;
387 RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end();
388 for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) {
389 Relocation* relocation = llvm::cast<Relocation>(reloc);
390 // scan relocation
391 if (LinkerConfig::Object != m_Config.codeGenType())
392 m_LDBackend.getRelocator()->scanRelocation(
393 *relocation, *m_pBuilder, *m_pModule, **rs);
394 else
395 m_LDBackend.getRelocator()->partialScanRelocation(
396 *relocation, *m_pModule, **rs);
397 } // for all relocations
398 } // for all relocation section
399 m_LDBackend.getRelocator()->finalizeScan(**input);
400 } // for all inputs
401 return true;
402 }
403
404 /// initStubs - initialize stub-related stuff.
initStubs()405 bool ObjectLinker::initStubs()
406 {
407 // initialize BranchIslandFactory
408 m_LDBackend.initBRIslandFactory();
409
410 // initialize StubFactory
411 m_LDBackend.initStubFactory();
412
413 // initialize target stubs
414 m_LDBackend.initTargetStubs();
415 return true;
416 }
417
418 /// allocateCommonSymobols - allocate fragments for common symbols to the
419 /// corresponding sections
allocateCommonSymbols()420 bool ObjectLinker::allocateCommonSymbols()
421 {
422 if (LinkerConfig::Object != m_Config.codeGenType() ||
423 m_Config.options().isDefineCommon())
424 return m_LDBackend.allocateCommonSymbols(*m_pModule);
425 return true;
426 }
427
428 /// prelayout - help backend to do some modification before layout
prelayout()429 bool ObjectLinker::prelayout()
430 {
431 // finalize the section symbols, set their fragment reference and push them
432 // into output symbol table
433 Module::iterator sect, sEnd = m_pModule->end();
434 for (sect = m_pModule->begin(); sect != sEnd; ++sect) {
435 m_pModule->getSectionSymbolSet().finalize(**sect,
436 m_pModule->getSymbolTable(),
437 m_Config.codeGenType() == LinkerConfig::Object);
438 }
439
440 m_LDBackend.preLayout(*m_pModule, *m_pBuilder);
441
442 /// check program interpreter - computer the name size of the runtime dyld
443 if (!m_Config.isCodeStatic() &&
444 (LinkerConfig::Exec == m_Config.codeGenType() ||
445 m_Config.options().isPIE() ||
446 m_Config.options().hasDyld()))
447 m_LDBackend.sizeInterp();
448
449 /// measure NamePools - compute the size of name pool sections
450 /// In ELF, will compute the size of.symtab, .strtab, .dynsym, .dynstr,
451 /// .hash and .shstrtab sections.
452 ///
453 /// dump all symbols and strings from FragmentLinker and build the format-dependent
454 /// hash table.
455 /// @note sizeNamePools replies on LinkerConfig::CodePosition. Must determine
456 /// code position model before calling GNULDBackend::sizeNamePools()
457 m_LDBackend.sizeNamePools(*m_pModule);
458
459 return true;
460 }
461
462 /// layout - linearly layout all output sections and reserve some space
463 /// for GOT/PLT
464 /// Because we do not support instruction relaxing in this early version,
465 /// if there is a branch can not jump to its target, we return false
466 /// directly
layout()467 bool ObjectLinker::layout()
468 {
469 m_LDBackend.layout(*m_pModule);
470 return true;
471 }
472
473 /// prelayout - help backend to do some modification after layout
postlayout()474 bool ObjectLinker::postlayout()
475 {
476 m_LDBackend.postLayout(*m_pModule, *m_pBuilder);
477 return true;
478 }
479
480 /// finalizeSymbolValue - finalize the resolved symbol value.
481 /// Before relocate(), after layout(), FragmentLinker should correct value of all
482 /// symbol.
finalizeSymbolValue()483 bool ObjectLinker::finalizeSymbolValue()
484 {
485 bool finalized = m_pLinker->finalizeSymbols() && m_LDBackend.finalizeSymbols();
486 bool scriptSymsAdded = true;
487 uint64_t symVal;
488 const LinkerScript& script = m_pModule->getScript();
489 LinkerScript::DefSymMap::const_entry_iterator it;
490 LinkerScript::DefSymMap::const_entry_iterator ie = script.defSymMap().end();
491
492 DefSymParser parser(*m_pModule);
493 for (it = script.defSymMap().begin(); it != ie; ++it) {
494 llvm::StringRef symName = it.getEntry()->key();
495 llvm::StringRef expr = it.getEntry()->value();
496
497 LDSymbol* symbol = m_pModule->getNamePool().findSymbol(symName);
498 assert(NULL != symbol && "--defsym symbol should be in the name pool");
499 scriptSymsAdded &= parser.parse(expr, symVal);
500 if (!scriptSymsAdded)
501 break;
502 symbol->setValue(symVal);
503 }
504 return finalized && scriptSymsAdded ;
505 }
506
507 /// relocate - applying relocation entries and create relocation
508 /// section in the output files
509 /// Create relocation section, asking TargetLDBackend to
510 /// read the relocation information into RelocationEntry
511 /// and push_back into the relocation section
relocation()512 bool ObjectLinker::relocation()
513 {
514 return m_pLinker->applyRelocations();
515 }
516
517 /// emitOutput - emit the output file.
emitOutput(MemoryArea & pOutput)518 bool ObjectLinker::emitOutput(MemoryArea& pOutput)
519 {
520 return llvm::errc::success == getWriter()->writeObject(*m_pModule, pOutput);
521 }
522
523
524 /// postProcessing - do modification after all processes
postProcessing(MemoryArea & pOutput)525 bool ObjectLinker::postProcessing(MemoryArea& pOutput)
526 {
527 m_pLinker->syncRelocationResult(pOutput);
528
529 // emit .eh_frame_hdr
530 // eh_frame_hdr should be emitted after syncRelocation, because eh_frame_hdr
531 // needs FDE PC value, which will be corrected at syncRelocation
532 m_LDBackend.postProcessing(pOutput);
533 return true;
534 }
535
536