• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===- GNULDBackend.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  
10  #include <mcld/Target/GNULDBackend.h>
11  
12  #include <string>
13  #include <cstring>
14  #include <cassert>
15  
16  #include <llvm/Support/ELF.h>
17  
18  #include <mcld/ADT/SizeTraits.h>
19  #include <mcld/LD/LDSymbol.h>
20  #include <mcld/LD/Layout.h>
21  #include <mcld/LD/FillFragment.h>
22  #include <mcld/MC/MCLDInfo.h>
23  #include <mcld/MC/MCLDOutput.h>
24  #include <mcld/MC/InputTree.h>
25  #include <mcld/MC/SymbolCategory.h>
26  #include <mcld/MC/MCLinker.h>
27  #include <mcld/Support/MemoryArea.h>
28  #include <mcld/Support/MemoryRegion.h>
29  #include <mcld/Support/MsgHandling.h>
30  #include <mcld/Support/MemoryAreaFactory.h>
31  
32  using namespace mcld;
33  
34  //===----------------------------------------------------------------------===//
35  // GNULDBackend
36  //===----------------------------------------------------------------------===//
GNULDBackend()37  GNULDBackend::GNULDBackend()
38    : m_pArchiveReader(NULL),
39      m_pObjectReader(NULL),
40      m_pDynObjReader(NULL),
41      m_pObjectWriter(NULL),
42      m_pDynObjWriter(NULL),
43      m_pExecWriter(NULL),
44      m_pDynObjFileFormat(NULL),
45      m_pExecFileFormat(NULL),
46      m_ELFSegmentTable(9), // magic number
47      m_pEhFrameHdr(NULL),
48      f_pPreInitArrayStart(NULL),
49      f_pPreInitArrayEnd(NULL),
50      f_pInitArrayStart(NULL),
51      f_pInitArrayEnd(NULL),
52      f_pFiniArrayStart(NULL),
53      f_pFiniArrayEnd(NULL),
54      f_pStack(NULL),
55      f_pExecutableStart(NULL),
56      f_pEText(NULL),
57      f_p_EText(NULL),
58      f_p__EText(NULL),
59      f_pEData(NULL),
60      f_p_EData(NULL),
61      f_pBSSStart(NULL),
62      f_pEnd(NULL),
63      f_p_End(NULL) {
64    m_pSymIndexMap = new HashTableType(1024);
65  }
66  
~GNULDBackend()67  GNULDBackend::~GNULDBackend()
68  {
69    if (NULL != m_pArchiveReader)
70      delete m_pArchiveReader;
71    if (NULL != m_pObjectReader)
72      delete m_pObjectReader;
73    if (NULL != m_pDynObjReader)
74      delete m_pDynObjReader;
75    if (NULL != m_pObjectWriter)
76      delete m_pObjectWriter;
77    if (NULL != m_pDynObjWriter)
78      delete m_pDynObjWriter;
79    if (NULL != m_pExecWriter)
80      delete m_pExecWriter;
81    if (NULL != m_pDynObjFileFormat)
82      delete m_pDynObjFileFormat;
83    if (NULL != m_pExecFileFormat)
84      delete m_pExecFileFormat;
85    if (NULL != m_pSymIndexMap)
86      delete m_pSymIndexMap;
87    if (NULL != m_pEhFrameHdr)
88      delete m_pEhFrameHdr;
89  }
90  
sectionStartOffset() const91  size_t GNULDBackend::sectionStartOffset() const
92  {
93    // FIXME: use fixed offset, we need 10 segments by default
94    return sizeof(llvm::ELF::Elf64_Ehdr)+10*sizeof(llvm::ELF::Elf64_Phdr);
95  }
96  
segmentStartAddr(const Output & pOutput,const MCLDInfo & pInfo) const97  uint64_t GNULDBackend::segmentStartAddr(const Output& pOutput,
98                                          const MCLDInfo& pInfo) const
99  {
100    // TODO: handle the user option: -TText=
101    if (isOutputPIC(pOutput, pInfo))
102      return 0x0;
103    else
104      return defaultTextSegmentAddr();
105  }
106  
initArchiveReader(MCLinker & pLinker,MCLDInfo & pInfo,MemoryAreaFactory & pMemAreaFactory)107  bool GNULDBackend::initArchiveReader(MCLinker& pLinker,
108                                       MCLDInfo& pInfo,
109                                       MemoryAreaFactory& pMemAreaFactory)
110  {
111    if (NULL == m_pArchiveReader) {
112      assert(NULL != m_pObjectReader);
113      m_pArchiveReader = new GNUArchiveReader(pInfo,
114                                              pMemAreaFactory,
115                                              *m_pObjectReader);
116    }
117    return true;
118  }
119  
initObjectReader(MCLinker & pLinker)120  bool GNULDBackend::initObjectReader(MCLinker& pLinker)
121  {
122    if (NULL == m_pObjectReader)
123      m_pObjectReader = new ELFObjectReader(*this, pLinker);
124    return true;
125  }
126  
initDynObjReader(MCLinker & pLinker)127  bool GNULDBackend::initDynObjReader(MCLinker& pLinker)
128  {
129    if (NULL == m_pDynObjReader)
130      m_pDynObjReader = new ELFDynObjReader(*this, pLinker);
131    return true;
132  }
133  
initObjectWriter(MCLinker &)134  bool GNULDBackend::initObjectWriter(MCLinker&)
135  {
136    // TODO
137    return true;
138  }
139  
initDynObjWriter(MCLinker & pLinker)140  bool GNULDBackend::initDynObjWriter(MCLinker& pLinker)
141  {
142    if (NULL == m_pDynObjWriter)
143      m_pDynObjWriter = new ELFDynObjWriter(*this, pLinker);
144    return true;
145  }
146  
initExecWriter(MCLinker & pLinker)147  bool GNULDBackend::initExecWriter(MCLinker& pLinker)
148  {
149    if (NULL == m_pExecWriter)
150      m_pExecWriter = new ELFExecWriter(*this, pLinker);
151    return true;
152  }
153  
initExecSections(MCLinker & pMCLinker)154  bool GNULDBackend::initExecSections(MCLinker& pMCLinker)
155  {
156    if (NULL == m_pExecFileFormat)
157      m_pExecFileFormat = new ELFExecFileFormat(*this);
158  
159    // initialize standard sections
160    m_pExecFileFormat->initStdSections(pMCLinker);
161    return true;
162  }
163  
initDynObjSections(MCLinker & pMCLinker)164  bool GNULDBackend::initDynObjSections(MCLinker& pMCLinker)
165  {
166    if (NULL == m_pDynObjFileFormat)
167      m_pDynObjFileFormat = new ELFDynObjFileFormat(*this);
168  
169    // initialize standard sections
170    m_pDynObjFileFormat->initStdSections(pMCLinker);
171    return true;
172  }
173  
initStandardSymbols(MCLinker & pLinker,const Output & pOutput)174  bool GNULDBackend::initStandardSymbols(MCLinker& pLinker, const Output& pOutput)
175  {
176    ELFFileFormat* file_format = getOutputFormat(pOutput);
177  
178    // -----  section symbols  ----- //
179    // .preinit_array
180    FragmentRef* preinit_array = NULL;
181    if (file_format->hasPreInitArray()) {
182      preinit_array = pLinker.getLayout().getFragmentRef(
183                     *(file_format->getPreInitArray().getSectionData()->begin()),
184                     0x0);
185    }
186    f_pPreInitArrayStart =
187       pLinker.defineSymbol<MCLinker::AsRefered,
188                            MCLinker::Resolve>("__preinit_array_start",
189                                               false, // isDyn
190                                               ResolveInfo::NoType,
191                                               ResolveInfo::Define,
192                                               ResolveInfo::Global,
193                                               0x0, // size
194                                               0x0, // value
195                                               preinit_array, // FragRef
196                                               ResolveInfo::Hidden);
197    f_pPreInitArrayEnd =
198       pLinker.defineSymbol<MCLinker::AsRefered,
199                            MCLinker::Resolve>("__preinit_array_end",
200                                               false, // isDyn
201                                               ResolveInfo::NoType,
202                                               ResolveInfo::Define,
203                                               ResolveInfo::Global,
204                                               0x0, // size
205                                               0x0, // value
206                                               NULL, // FragRef
207                                               ResolveInfo::Hidden);
208  
209    // .init_array
210    FragmentRef* init_array = NULL;
211    if (file_format->hasInitArray()) {
212      init_array = pLinker.getLayout().getFragmentRef(
213                        *(file_format->getInitArray().getSectionData()->begin()),
214                        0x0);
215    }
216  
217    f_pInitArrayStart =
218       pLinker.defineSymbol<MCLinker::AsRefered,
219                            MCLinker::Resolve>("__init_array_start",
220                                               false, // isDyn
221                                               ResolveInfo::NoType,
222                                               ResolveInfo::Define,
223                                               ResolveInfo::Global,
224                                               0x0, // size
225                                               0x0, // value
226                                               init_array, // FragRef
227                                               ResolveInfo::Hidden);
228    f_pInitArrayEnd =
229       pLinker.defineSymbol<MCLinker::AsRefered,
230                            MCLinker::Resolve>("__init_array_end",
231                                               false, // isDyn
232                                               ResolveInfo::NoType,
233                                               ResolveInfo::Define,
234                                               ResolveInfo::Global,
235                                               0x0, // size
236                                               0x0, // value
237                                               init_array, // FragRef
238                                               ResolveInfo::Hidden);
239  
240    // .fini_array
241    FragmentRef* fini_array = NULL;
242    if (file_format->hasFiniArray()) {
243      fini_array = pLinker.getLayout().getFragmentRef(
244                       *(file_format->getFiniArray().getSectionData()->begin()),
245                       0x0);
246    }
247  
248    f_pFiniArrayStart =
249       pLinker.defineSymbol<MCLinker::AsRefered,
250                            MCLinker::Resolve>("__fini_array_start",
251                                               false, // isDyn
252                                               ResolveInfo::NoType,
253                                               ResolveInfo::Define,
254                                               ResolveInfo::Global,
255                                               0x0, // size
256                                               0x0, // value
257                                               fini_array, // FragRef
258                                               ResolveInfo::Hidden);
259    f_pFiniArrayEnd =
260       pLinker.defineSymbol<MCLinker::AsRefered,
261                            MCLinker::Resolve>("__fini_array_end",
262                                               false, // isDyn
263                                               ResolveInfo::NoType,
264                                               ResolveInfo::Define,
265                                               ResolveInfo::Global,
266                                               0x0, // size
267                                               0x0, // value
268                                               fini_array, // FragRef
269                                               ResolveInfo::Hidden);
270  
271    // .stack
272    FragmentRef* stack = NULL;
273    if (file_format->hasStack()) {
274      stack = pLinker.getLayout().getFragmentRef(
275                            *(file_format->getStack().getSectionData()->begin()),
276                            0x0);
277    }
278    f_pStack =
279       pLinker.defineSymbol<MCLinker::AsRefered,
280                            MCLinker::Resolve>("__stack",
281                                               false, // isDyn
282                                               ResolveInfo::NoType,
283                                               ResolveInfo::Define,
284                                               ResolveInfo::Global,
285                                               0x0, // size
286                                               0x0, // value
287                                               stack, // FragRef
288                                               ResolveInfo::Hidden);
289  
290    // -----  segment symbols  ----- //
291    f_pExecutableStart =
292       pLinker.defineSymbol<MCLinker::AsRefered,
293                            MCLinker::Resolve>("__executable_start",
294                                               false, // isDyn
295                                               ResolveInfo::NoType,
296                                               ResolveInfo::Define,
297                                               ResolveInfo::Absolute,
298                                               0x0, // size
299                                               0x0, // value
300                                               NULL, // FragRef
301                                               ResolveInfo::Default);
302    f_pEText =
303       pLinker.defineSymbol<MCLinker::AsRefered,
304                            MCLinker::Resolve>("etext",
305                                               false, // isDyn
306                                               ResolveInfo::NoType,
307                                               ResolveInfo::Define,
308                                               ResolveInfo::Absolute,
309                                               0x0, // size
310                                               0x0, // value
311                                               NULL, // FragRef
312                                               ResolveInfo::Default);
313    f_p_EText =
314       pLinker.defineSymbol<MCLinker::AsRefered,
315                            MCLinker::Resolve>("_etext",
316                                               false, // isDyn
317                                               ResolveInfo::NoType,
318                                               ResolveInfo::Define,
319                                               ResolveInfo::Absolute,
320                                               0x0, // size
321                                               0x0, // value
322                                               NULL, // FragRef
323                                               ResolveInfo::Default);
324    f_p__EText =
325       pLinker.defineSymbol<MCLinker::AsRefered,
326                            MCLinker::Resolve>("__etext",
327                                               false, // isDyn
328                                               ResolveInfo::NoType,
329                                               ResolveInfo::Define,
330                                               ResolveInfo::Absolute,
331                                               0x0, // size
332                                               0x0, // value
333                                               NULL, // FragRef
334                                               ResolveInfo::Default);
335    f_pEData =
336       pLinker.defineSymbol<MCLinker::AsRefered,
337                            MCLinker::Resolve>("edata",
338                                               false, // isDyn
339                                               ResolveInfo::NoType,
340                                               ResolveInfo::Define,
341                                               ResolveInfo::Absolute,
342                                               0x0, // size
343                                               0x0, // value
344                                               NULL, // FragRef
345                                               ResolveInfo::Default);
346  
347    f_pEnd =
348       pLinker.defineSymbol<MCLinker::AsRefered,
349                            MCLinker::Resolve>("end",
350                                               false, // isDyn
351                                               ResolveInfo::NoType,
352                                               ResolveInfo::Define,
353                                               ResolveInfo::Absolute,
354                                               0x0, // size
355                                               0x0, // value
356                                               NULL, // FragRef
357                                               ResolveInfo::Default);
358  
359    // _edata is defined forcefully.
360    // @ref Google gold linker: defstd.cc: 186
361    f_p_EData =
362       pLinker.defineSymbol<MCLinker::Force,
363                            MCLinker::Resolve>("_edata",
364                                               false, // isDyn
365                                               ResolveInfo::NoType,
366                                               ResolveInfo::Define,
367                                               ResolveInfo::Absolute,
368                                               0x0, // size
369                                               0x0, // value
370                                               NULL, // FragRef
371                                               ResolveInfo::Default);
372  
373    // __bss_start is defined forcefully.
374    // @ref Google gold linker: defstd.cc: 214
375    f_pBSSStart =
376       pLinker.defineSymbol<MCLinker::Force,
377                            MCLinker::Resolve>("__bss_start",
378                                               false, // isDyn
379                                               ResolveInfo::NoType,
380                                               ResolveInfo::Define,
381                                               ResolveInfo::Absolute,
382                                               0x0, // size
383                                               0x0, // value
384                                               NULL, // FragRef
385                                               ResolveInfo::Default);
386  
387    // _end is defined forcefully.
388    // @ref Google gold linker: defstd.cc: 228
389    f_p_End =
390       pLinker.defineSymbol<MCLinker::Force,
391                            MCLinker::Resolve>("_end",
392                                               false, // isDyn
393                                               ResolveInfo::NoType,
394                                               ResolveInfo::Define,
395                                               ResolveInfo::Absolute,
396                                               0x0, // size
397                                               0x0, // value
398                                               NULL, // FragRef
399                                               ResolveInfo::Default);
400  
401    return true;
402  }
403  
404  bool
finalizeStandardSymbols(MCLinker & pLinker,const Output & pOutput)405  GNULDBackend::finalizeStandardSymbols(MCLinker& pLinker, const Output& pOutput)
406  {
407    ELFFileFormat* file_format = getOutputFormat(pOutput);
408  
409    // -----  section symbols  ----- //
410    if (NULL != f_pPreInitArrayStart) {
411      if (!f_pPreInitArrayStart->hasFragRef()) {
412        f_pPreInitArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute);
413        f_pPreInitArrayStart->setValue(0x0);
414      }
415    }
416  
417    if (NULL != f_pPreInitArrayEnd) {
418      if (f_pPreInitArrayEnd->hasFragRef()) {
419        f_pPreInitArrayEnd->setValue(f_pPreInitArrayEnd->value() +
420                                     file_format->getPreInitArray().size());
421      }
422      else {
423        f_pPreInitArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute);
424        f_pPreInitArrayEnd->setValue(0x0);
425      }
426    }
427  
428    if (NULL != f_pInitArrayStart) {
429      if (!f_pInitArrayStart->hasFragRef()) {
430        f_pInitArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute);
431        f_pInitArrayStart->setValue(0x0);
432      }
433    }
434  
435    if (NULL != f_pInitArrayEnd) {
436      if (f_pInitArrayEnd->hasFragRef()) {
437        f_pInitArrayEnd->setValue(f_pInitArrayEnd->value() +
438                                  file_format->getInitArray().size());
439      }
440      else {
441        f_pInitArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute);
442        f_pInitArrayEnd->setValue(0x0);
443      }
444    }
445  
446    if (NULL != f_pFiniArrayStart) {
447      if (!f_pFiniArrayStart->hasFragRef()) {
448        f_pFiniArrayStart->resolveInfo()->setBinding(ResolveInfo::Absolute);
449        f_pFiniArrayStart->setValue(0x0);
450      }
451    }
452  
453    if (NULL != f_pFiniArrayEnd) {
454      if (f_pFiniArrayEnd->hasFragRef()) {
455        f_pFiniArrayEnd->setValue(f_pFiniArrayEnd->value() +
456                                  file_format->getFiniArray().size());
457      }
458      else {
459        f_pFiniArrayEnd->resolveInfo()->setBinding(ResolveInfo::Absolute);
460        f_pFiniArrayEnd->setValue(0x0);
461      }
462    }
463  
464    if (NULL != f_pStack) {
465      if (!f_pStack->hasFragRef()) {
466        f_pStack->resolveInfo()->setBinding(ResolveInfo::Absolute);
467        f_pStack->setValue(0x0);
468      }
469    }
470  
471    // -----  segment symbols  ----- //
472    if (NULL != f_pExecutableStart) {
473      ELFSegment* exec_start = m_ELFSegmentTable.find(llvm::ELF::PT_LOAD, 0x0, 0x0);
474      if (NULL != exec_start) {
475        if (ResolveInfo::ThreadLocal != f_pExecutableStart->type()) {
476          f_pExecutableStart->setValue(f_pExecutableStart->value() +
477                                       exec_start->vaddr());
478        }
479      }
480      else
481        f_pExecutableStart->setValue(0x0);
482    }
483  
484    if (NULL != f_pEText || NULL != f_p_EText || NULL !=f_p__EText) {
485      ELFSegment* etext = m_ELFSegmentTable.find(llvm::ELF::PT_LOAD,
486                                                 llvm::ELF::PF_X,
487                                                 llvm::ELF::PF_W);
488      if (NULL != etext) {
489        if (NULL != f_pEText && ResolveInfo::ThreadLocal != f_pEText->type()) {
490          f_pEText->setValue(f_pEText->value() +
491                             etext->vaddr() +
492                             etext->memsz());
493        }
494        if (NULL != f_p_EText && ResolveInfo::ThreadLocal != f_p_EText->type()) {
495          f_p_EText->setValue(f_p_EText->value() +
496                              etext->vaddr() +
497                              etext->memsz());
498        }
499        if (NULL != f_p__EText && ResolveInfo::ThreadLocal != f_p__EText->type()) {
500          f_p__EText->setValue(f_p__EText->value() +
501                              etext->vaddr() +
502                              etext->memsz());
503        }
504      }
505      else {
506        if (NULL != f_pEText)
507          f_pEText->setValue(0x0);
508        if (NULL != f_p_EText)
509          f_p_EText->setValue(0x0);
510        if (NULL != f_p__EText)
511          f_p__EText->setValue(0x0);
512      }
513    }
514  
515    if (NULL != f_pEData || NULL != f_p_EData || NULL != f_pBSSStart ||
516        NULL != f_pEnd || NULL != f_p_End) {
517      ELFSegment* edata = m_ELFSegmentTable.find(llvm::ELF::PT_LOAD,
518                                                 llvm::ELF::PF_W,
519                                                 0x0);
520      if (NULL != edata) {
521        if (NULL != f_pEData && ResolveInfo::ThreadLocal != f_pEData->type()) {
522          f_pEData->setValue(f_pEData->value() +
523                              edata->vaddr() +
524                              edata->filesz());
525        }
526        if (NULL != f_p_EData && ResolveInfo::ThreadLocal != f_p_EData->type()) {
527          f_p_EData->setValue(f_p_EData->value() +
528                              edata->vaddr() +
529                              edata->filesz());
530        }
531        if (NULL != f_pBSSStart && ResolveInfo::ThreadLocal != f_pBSSStart->type()) {
532          f_pBSSStart->setValue(f_pBSSStart->value() +
533                                edata->vaddr() +
534                                edata->filesz());
535        }
536  
537        if (NULL != f_pEnd && ResolveInfo::ThreadLocal != f_pEnd->type()) {
538          f_pEnd->setValue(f_pEnd->value() +
539                           edata->vaddr() +
540                           edata->memsz());
541        }
542        if (NULL != f_p_End && ResolveInfo::ThreadLocal != f_p_End->type()) {
543          f_p_End->setValue(f_p_End->value() +
544                            edata->vaddr() +
545                            edata->memsz());
546        }
547      }
548      else {
549        if (NULL != f_pEData)
550          f_pEData->setValue(0x0);
551        if (NULL != f_p_EData)
552          f_p_EData->setValue(0x0);
553        if (NULL != f_pBSSStart)
554          f_pBSSStart->setValue(0x0);
555  
556        if (NULL != f_pEnd)
557          f_pEnd->setValue(0x0);
558        if (NULL != f_p_End)
559          f_p_End->setValue(0x0);
560      }
561    }
562  
563    return true;
564  }
565  
getArchiveReader()566  GNUArchiveReader *GNULDBackend::getArchiveReader()
567  {
568    assert(NULL != m_pArchiveReader);
569    return m_pArchiveReader;
570  }
571  
getArchiveReader() const572  const GNUArchiveReader *GNULDBackend::getArchiveReader() const
573  {
574    assert(NULL != m_pArchiveReader);
575    return m_pArchiveReader;
576  }
577  
getObjectReader()578  ELFObjectReader *GNULDBackend::getObjectReader()
579  {
580    assert(NULL != m_pObjectReader);
581    return m_pObjectReader;
582  }
583  
getObjectReader() const584  const ELFObjectReader *GNULDBackend::getObjectReader() const
585  {
586    assert(NULL != m_pObjectReader);
587    return m_pObjectReader;
588  }
589  
getDynObjReader()590  ELFDynObjReader *GNULDBackend::getDynObjReader()
591  {
592    assert(NULL != m_pDynObjReader);
593    return m_pDynObjReader;
594  }
595  
getDynObjReader() const596  const ELFDynObjReader *GNULDBackend::getDynObjReader() const
597  {
598    assert(NULL != m_pDynObjReader);
599    return m_pDynObjReader;
600  }
601  
getObjectWriter()602  ELFObjectWriter *GNULDBackend::getObjectWriter()
603  {
604    // TODO
605    return NULL;
606  }
607  
getObjectWriter() const608  const ELFObjectWriter *GNULDBackend::getObjectWriter() const
609  {
610    // TODO
611    return NULL;
612  }
613  
getDynObjWriter()614  ELFDynObjWriter *GNULDBackend::getDynObjWriter()
615  {
616    assert(NULL != m_pDynObjWriter);
617    return m_pDynObjWriter;
618  }
619  
getDynObjWriter() const620  const ELFDynObjWriter *GNULDBackend::getDynObjWriter() const
621  {
622    assert(NULL != m_pDynObjWriter);
623    return m_pDynObjWriter;
624  }
625  
getExecWriter()626  ELFExecWriter *GNULDBackend::getExecWriter()
627  {
628    assert(NULL != m_pExecWriter);
629    return m_pExecWriter;
630  }
631  
getExecWriter() const632  const ELFExecWriter *GNULDBackend::getExecWriter() const
633  {
634    assert(NULL != m_pExecWriter);
635    return m_pExecWriter;
636  }
637  
getOutputFormat(const Output & pOutput)638  ELFFileFormat* GNULDBackend::getOutputFormat(const Output& pOutput)
639  {
640    switch (pOutput.type()) {
641      case Output::DynObj:
642        return getDynObjFileFormat();
643      case Output::Exec:
644        return getExecFileFormat();
645      // FIXME: We do not support building .o now
646      case Output::Object:
647      default:
648        fatal(diag::unrecognized_output_file) << pOutput.type();
649        return NULL;
650    }
651  }
652  
getOutputFormat(const Output & pOutput) const653  const ELFFileFormat* GNULDBackend::getOutputFormat(const Output& pOutput) const
654  {
655    switch (pOutput.type()) {
656      case Output::DynObj:
657        return getDynObjFileFormat();
658      case Output::Exec:
659        return getExecFileFormat();
660      // FIXME: We do not support building .o now
661      case Output::Object:
662      default:
663        fatal(diag::unrecognized_output_file) << pOutput.type();
664        return NULL;
665    }
666  }
667  
getDynObjFileFormat()668  ELFDynObjFileFormat* GNULDBackend::getDynObjFileFormat()
669  {
670    assert(NULL != m_pDynObjFileFormat);
671    return m_pDynObjFileFormat;
672  }
673  
getDynObjFileFormat() const674  const ELFDynObjFileFormat* GNULDBackend::getDynObjFileFormat() const
675  {
676    assert(NULL != m_pDynObjFileFormat);
677    return m_pDynObjFileFormat;
678  }
679  
getExecFileFormat()680  ELFExecFileFormat* GNULDBackend::getExecFileFormat()
681  {
682    assert(NULL != m_pExecFileFormat);
683    return m_pExecFileFormat;
684  }
685  
getExecFileFormat() const686  const ELFExecFileFormat* GNULDBackend::getExecFileFormat() const
687  {
688    assert(NULL != m_pExecFileFormat);
689    return m_pExecFileFormat;
690  }
691  
692  /// sizeNamePools - compute the size of regular name pools
693  /// In ELF executable files, regular name pools are .symtab, .strtab,
694  /// .dynsym, .dynstr, and .hash
695  void
sizeNamePools(const Output & pOutput,const SymbolCategory & pSymbols,const MCLDInfo & pLDInfo)696  GNULDBackend::sizeNamePools(const Output& pOutput,
697                              const SymbolCategory& pSymbols,
698                              const MCLDInfo& pLDInfo)
699  {
700    // size of string tables starts from 1 to hold the null character in their
701    // first byte
702    size_t symtab = 1;
703    size_t dynsym = 1;
704    // number of entries in symbol tables starts from 1 to hold the special entry
705    // at index 0 (STN_UNDEF). See ELF Spec Book I, p1-21.
706    size_t strtab = 1;
707    size_t dynstr = 1;
708    size_t hash   = 0;
709  
710    // compute size of .symtab, .dynsym and .strtab
711    SymbolCategory::const_iterator symbol;
712    SymbolCategory::const_iterator symEnd = pSymbols.end();
713    for (symbol = pSymbols.begin(); symbol != symEnd; ++symbol) {
714      size_t str_size = (*symbol)->nameSize() + 1;
715      if (isDynamicSymbol(**symbol, pOutput)) {
716        ++dynsym;
717        dynstr += str_size;
718      }
719      ++symtab;
720      strtab += str_size;
721    }
722  
723    ELFFileFormat* file_format = getOutputFormat(pOutput);
724  
725    switch(pOutput.type()) {
726      // compute size of .dynstr and .hash
727      case Output::DynObj:
728      case Output::Exec: {
729        // add DT_NEED strings into .dynstr and .dynamic
730        // Rules:
731        //   1. ignore --no-add-needed
732        //   2. force count in --no-as-needed
733        //   3. judge --as-needed
734        InputTree::const_bfs_iterator input, inputEnd = pLDInfo.inputs().bfs_end();
735        for (input = pLDInfo.inputs().bfs_begin(); input != inputEnd; ++input) {
736          if (Input::DynObj == (*input)->type()) {
737            // --add-needed
738            if ((*input)->attribute()->isAddNeeded()) {
739              // --no-as-needed
740              if (!(*input)->attribute()->isAsNeeded()) {
741                dynstr += (*input)->name().size() + 1;
742                dynamic().reserveNeedEntry();
743              }
744              // --as-needed
745              else if ((*input)->isNeeded()) {
746                dynstr += (*input)->name().size() + 1;
747                dynamic().reserveNeedEntry();
748              }
749            }
750          }
751        } // for
752  
753        // compute .hash
754        // Both Elf32_Word and Elf64_Word are 4 bytes
755        hash = (2 + getHashBucketCount(dynsym, false) + dynsym) *
756               sizeof(llvm::ELF::Elf32_Word);
757  
758        // set size
759        dynstr += pOutput.name().size() + 1;
760        if (32 == bitclass())
761          file_format->getDynSymTab().setSize(dynsym*sizeof(llvm::ELF::Elf32_Sym));
762        else
763          file_format->getDynSymTab().setSize(dynsym*sizeof(llvm::ELF::Elf64_Sym));
764        file_format->getDynStrTab().setSize(dynstr);
765        file_format->getHashTab().setSize(hash);
766  
767      }
768      /* fall through */
769      case Output::Object: {
770        if (32 == bitclass())
771          file_format->getSymTab().setSize(symtab*sizeof(llvm::ELF::Elf32_Sym));
772        else
773          file_format->getSymTab().setSize(symtab*sizeof(llvm::ELF::Elf64_Sym));
774        file_format->getStrTab().setSize(strtab);
775        break;
776      }
777    } // end of switch
778  
779    // reserve fixed entries in the .dynamic section.
780    if (Output::DynObj == pOutput.type() || Output::Exec == pOutput.type()) {
781      // Because some entries in .dynamic section need information of .dynsym,
782      // .dynstr, .symtab, .strtab and .hash, we can not reserve non-DT_NEEDED
783      // entries until we get the size of the sections mentioned above
784      dynamic().reserveEntries(pLDInfo, *file_format);
785      file_format->getDynamic().setSize(dynamic().numOfBytes());
786    }
787  }
788  
789  /// emitRegNamePools - emit regular name pools - .symtab, .strtab
790  ///
791  /// the size of these tables should be computed before layout
792  /// layout should computes the start offset of these tables
emitRegNamePools(Output & pOutput,SymbolCategory & pSymbols,const Layout & pLayout,const MCLDInfo & pLDInfo)793  void GNULDBackend::emitRegNamePools(Output& pOutput,
794                                      SymbolCategory& pSymbols,
795                                      const Layout& pLayout,
796                                      const MCLDInfo& pLDInfo)
797  {
798  
799    assert(pOutput.hasMemArea());
800  
801    bool sym_exist = false;
802    HashTableType::entry_type* entry = 0;
803  
804    ELFFileFormat* file_format = getOutputFormat(pOutput);
805    if (pOutput.type() == Output::Object) {
806      // add first symbol into m_pSymIndexMap
807      entry = m_pSymIndexMap->insert(NULL, sym_exist);
808      entry->setValue(0);
809  
810      // TODO: not support yet
811      return;
812    }
813  
814    LDSection& symtab_sect = file_format->getSymTab();
815    LDSection& strtab_sect = file_format->getStrTab();
816  
817    MemoryRegion* symtab_region = pOutput.memArea()->request(symtab_sect.offset(),
818                                                             symtab_sect.size());
819    MemoryRegion* strtab_region = pOutput.memArea()->request(strtab_sect.offset(),
820                                                             strtab_sect.size());
821  
822    // set up symtab_region
823    llvm::ELF::Elf32_Sym* symtab32 = NULL;
824    llvm::ELF::Elf64_Sym* symtab64 = NULL;
825    if (32 == bitclass())
826      symtab32 = (llvm::ELF::Elf32_Sym*)symtab_region->start();
827    else if (64 == bitclass())
828      symtab64 = (llvm::ELF::Elf64_Sym*)symtab_region->start();
829    else
830      llvm::report_fatal_error(llvm::Twine("unsupported bitclass ") +
831                               llvm::Twine(bitclass()) +
832                               llvm::Twine(".\n"));
833    // set up strtab_region
834    char* strtab = (char*)strtab_region->start();
835    strtab[0] = '\0';
836  
837    // initialize the first ELF symbol
838    if (32 == bitclass()) {
839      symtab32[0].st_name  = 0;
840      symtab32[0].st_value = 0;
841      symtab32[0].st_size  = 0;
842      symtab32[0].st_info  = 0;
843      symtab32[0].st_other = 0;
844      symtab32[0].st_shndx = 0;
845    }
846    else { // must 64
847      symtab64[0].st_name  = 0;
848      symtab64[0].st_value = 0;
849      symtab64[0].st_size  = 0;
850      symtab64[0].st_info  = 0;
851      symtab64[0].st_other = 0;
852      symtab64[0].st_shndx = 0;
853    }
854  
855    size_t symtabIdx = 1;
856    size_t strtabsize = 1;
857    // compute size of .symtab, .dynsym and .strtab
858    SymbolCategory::iterator symbol;
859    SymbolCategory::iterator symEnd = pSymbols.end();
860    for (symbol = pSymbols.begin(); symbol != symEnd; ++symbol) {
861  
862       // maintain output's symbol and index map if building .o file
863      if (Output::Object == pOutput.type()) {
864        entry = m_pSymIndexMap->insert(NULL, sym_exist);
865        entry->setValue(symtabIdx);
866      }
867  
868      // FIXME: check the endian between host and target
869      // write out symbol
870      if (32 == bitclass()) {
871        symtab32[symtabIdx].st_name  = strtabsize;
872        symtab32[symtabIdx].st_value = getSymbolValue(**symbol);
873        symtab32[symtabIdx].st_size  = getSymbolSize(**symbol);
874        symtab32[symtabIdx].st_info  = getSymbolInfo(**symbol);
875        symtab32[symtabIdx].st_other = (*symbol)->visibility();
876        symtab32[symtabIdx].st_shndx = getSymbolShndx(**symbol, pLayout);
877      }
878      else { // must 64
879        symtab64[symtabIdx].st_name  = strtabsize;
880        symtab64[symtabIdx].st_value = getSymbolValue(**symbol);
881        symtab64[symtabIdx].st_size  = getSymbolSize(**symbol);
882        symtab64[symtabIdx].st_info  = getSymbolInfo(**symbol);
883        symtab64[symtabIdx].st_other = (*symbol)->visibility();
884        symtab64[symtabIdx].st_shndx = getSymbolShndx(**symbol, pLayout);
885      }
886      // write out string
887      strcpy((strtab + strtabsize), (*symbol)->name());
888  
889      // write out
890      // sum up counters
891      ++symtabIdx;
892      strtabsize += (*symbol)->nameSize() + 1;
893    }
894  }
895  
896  /// emitNamePools - emit dynamic name pools - .dyntab, .dynstr, .hash
897  ///
898  /// the size of these tables should be computed before layout
899  /// layout should computes the start offset of these tables
emitDynNamePools(Output & pOutput,SymbolCategory & pSymbols,const Layout & pLayout,const MCLDInfo & pLDInfo)900  void GNULDBackend::emitDynNamePools(Output& pOutput,
901                                      SymbolCategory& pSymbols,
902                                      const Layout& pLayout,
903                                      const MCLDInfo& pLDInfo)
904  {
905    assert(pOutput.hasMemArea());
906    ELFFileFormat* file_format = getOutputFormat(pOutput);
907  
908    bool sym_exist = false;
909    HashTableType::entry_type* entry = 0;
910  
911    LDSection& symtab_sect = file_format->getDynSymTab();
912    LDSection& strtab_sect = file_format->getDynStrTab();
913    LDSection& hash_sect   = file_format->getHashTab();
914    LDSection& dyn_sect    = file_format->getDynamic();
915  
916    MemoryRegion* symtab_region = pOutput.memArea()->request(symtab_sect.offset(),
917                                                             symtab_sect.size());
918    MemoryRegion* strtab_region = pOutput.memArea()->request(strtab_sect.offset(),
919                                                             strtab_sect.size());
920    MemoryRegion* hash_region = pOutput.memArea()->request(hash_sect.offset(),
921                                                           hash_sect.size());
922    MemoryRegion* dyn_region = pOutput.memArea()->request(dyn_sect.offset(),
923                                                          dyn_sect.size());
924    // set up symtab_region
925    llvm::ELF::Elf32_Sym* symtab32 = NULL;
926    llvm::ELF::Elf64_Sym* symtab64 = NULL;
927    if (32 == bitclass())
928      symtab32 = (llvm::ELF::Elf32_Sym*)symtab_region->start();
929    else if (64 == bitclass())
930      symtab64 = (llvm::ELF::Elf64_Sym*)symtab_region->start();
931    else
932      llvm::report_fatal_error(llvm::Twine("unsupported bitclass ") +
933                               llvm::Twine(bitclass()) +
934                               llvm::Twine(".\n"));
935  
936    // initialize the first ELF symbol
937    if (32 == bitclass()) {
938      symtab32[0].st_name  = 0;
939      symtab32[0].st_value = 0;
940      symtab32[0].st_size  = 0;
941      symtab32[0].st_info  = 0;
942      symtab32[0].st_other = 0;
943      symtab32[0].st_shndx = 0;
944    }
945    else { // must 64
946      symtab64[0].st_name  = 0;
947      symtab64[0].st_value = 0;
948      symtab64[0].st_size  = 0;
949      symtab64[0].st_info  = 0;
950      symtab64[0].st_other = 0;
951      symtab64[0].st_shndx = 0;
952    }
953    // set up strtab_region
954    char* strtab = (char*)strtab_region->start();
955    strtab[0] = '\0';
956  
957    // add the first symbol into m_pSymIndexMap
958    entry = m_pSymIndexMap->insert(NULL, sym_exist);
959    entry->setValue(0);
960  
961    size_t symtabIdx = 1;
962    size_t strtabsize = 1;
963  
964    // emit of .dynsym, and .dynstr
965    SymbolCategory::iterator symbol;
966    SymbolCategory::iterator symEnd = pSymbols.end();
967    for (symbol = pSymbols.begin(); symbol != symEnd; ++symbol) {
968      if (!isDynamicSymbol(**symbol, pOutput))
969        continue;
970  
971      // maintain output's symbol and index map
972      entry = m_pSymIndexMap->insert(*symbol, sym_exist);
973      entry->setValue(symtabIdx);
974  
975      // FIXME: check the endian between host and target
976      // write out symbol
977      if (32 == bitclass()) {
978        symtab32[symtabIdx].st_name  = strtabsize;
979        symtab32[symtabIdx].st_value = (*symbol)->value();
980        symtab32[symtabIdx].st_size  = getSymbolSize(**symbol);
981        symtab32[symtabIdx].st_info  = getSymbolInfo(**symbol);
982        symtab32[symtabIdx].st_other = (*symbol)->visibility();
983        symtab32[symtabIdx].st_shndx = getSymbolShndx(**symbol, pLayout);
984      }
985      else { // must 64
986        symtab64[symtabIdx].st_name  = strtabsize;
987        symtab64[symtabIdx].st_value = (*symbol)->value();
988        symtab64[symtabIdx].st_size  = getSymbolSize(**symbol);
989        symtab64[symtabIdx].st_info  = getSymbolInfo(**symbol);
990        symtab64[symtabIdx].st_other = (*symbol)->visibility();
991        symtab64[symtabIdx].st_shndx = getSymbolShndx(**symbol, pLayout);
992      }
993      // write out string
994      strcpy((strtab + strtabsize), (*symbol)->name());
995  
996      // sum up counters
997      ++symtabIdx;
998      strtabsize += (*symbol)->nameSize() + 1;
999    }
1000  
1001    // emit DT_NEED
1002    // add DT_NEED strings into .dynstr
1003    // Rules:
1004    //   1. ignore --no-add-needed
1005    //   2. force count in --no-as-needed
1006    //   3. judge --as-needed
1007    ELFDynamic::iterator dt_need = dynamic().needBegin();
1008    InputTree::const_bfs_iterator input, inputEnd = pLDInfo.inputs().bfs_end();
1009    for (input = pLDInfo.inputs().bfs_begin(); input != inputEnd; ++input) {
1010      if (Input::DynObj == (*input)->type()) {
1011        // --add-needed
1012        if ((*input)->attribute()->isAddNeeded()) {
1013          // --no-as-needed
1014          if (!(*input)->attribute()->isAsNeeded()) {
1015            strcpy((strtab + strtabsize), (*input)->name().c_str());
1016            (*dt_need)->setValue(llvm::ELF::DT_NEEDED, strtabsize);
1017            strtabsize += (*input)->name().size() + 1;
1018            ++dt_need;
1019          }
1020          // --as-needed
1021          else if ((*input)->isNeeded()) {
1022            strcpy((strtab + strtabsize), (*input)->name().c_str());
1023            (*dt_need)->setValue(llvm::ELF::DT_NEEDED, strtabsize);
1024            strtabsize += (*input)->name().size() + 1;
1025            ++dt_need;
1026          }
1027        }
1028      }
1029    } // for
1030  
1031    // emit soname
1032    // initialize value of ELF .dynamic section
1033    if (Output::DynObj == pOutput.type())
1034      dynamic().applySoname(strtabsize);
1035    dynamic().applyEntries(pLDInfo, *file_format);
1036    dynamic().emit(dyn_sect, *dyn_region);
1037  
1038    strcpy((strtab + strtabsize), pOutput.name().c_str());
1039    strtabsize += pOutput.name().size() + 1;
1040  
1041    // emit hash table
1042    // FIXME: this verion only emit SVR4 hash section.
1043    //        Please add GNU new hash section
1044  
1045    // both 32 and 64 bits hash table use 32-bit entry
1046    // set up hash_region
1047    uint32_t* word_array = (uint32_t*)hash_region->start();
1048    uint32_t& nbucket = word_array[0];
1049    uint32_t& nchain  = word_array[1];
1050  
1051    nbucket = getHashBucketCount(symtabIdx, false);
1052    nchain  = symtabIdx;
1053  
1054    uint32_t* bucket = (word_array + 2);
1055    uint32_t* chain  = (bucket + nbucket);
1056  
1057    // initialize bucket
1058    bzero((void*)bucket, nbucket);
1059  
1060    StringHash<ELF> hash_func;
1061  
1062    if (32 == bitclass()) {
1063      for (size_t sym_idx=0; sym_idx < symtabIdx; ++sym_idx) {
1064        llvm::StringRef name(strtab + symtab32[sym_idx].st_name);
1065        size_t bucket_pos = hash_func(name) % nbucket;
1066        chain[sym_idx] = bucket[bucket_pos];
1067        bucket[bucket_pos] = sym_idx;
1068      }
1069    }
1070    else if (64 == bitclass()) {
1071      for (size_t sym_idx=0; sym_idx < symtabIdx; ++sym_idx) {
1072        llvm::StringRef name(strtab + symtab64[sym_idx].st_name);
1073        size_t bucket_pos = hash_func(name) % nbucket;
1074        chain[sym_idx] = bucket[bucket_pos];
1075        bucket[bucket_pos] = sym_idx;
1076      }
1077    }
1078  }
1079  
1080  /// sizeInterp - compute the size of the .interp section
sizeInterp(const Output & pOutput,const MCLDInfo & pLDInfo)1081  void GNULDBackend::sizeInterp(const Output& pOutput, const MCLDInfo& pLDInfo)
1082  {
1083    assert(pOutput.type() == Output::Exec);
1084  
1085    const char* dyld_name;
1086    if (pLDInfo.options().hasDyld())
1087      dyld_name = pLDInfo.options().dyld().c_str();
1088    else
1089      dyld_name = dyld();
1090  
1091    LDSection& interp = getExecFileFormat()->getInterp();
1092    interp.setSize(std::strlen(dyld_name) + 1);
1093  }
1094  
1095  /// emitInterp - emit the .interp
emitInterp(Output & pOutput,const MCLDInfo & pLDInfo)1096  void GNULDBackend::emitInterp(Output& pOutput, const MCLDInfo& pLDInfo)
1097  {
1098    assert(pOutput.type() == Output::Exec &&
1099           getExecFileFormat()->hasInterp() &&
1100           pOutput.hasMemArea());
1101  
1102    const LDSection& interp = getExecFileFormat()->getInterp();
1103    MemoryRegion *region = pOutput.memArea()->request(
1104                                                interp.offset(), interp.size());
1105    const char* dyld_name;
1106    if (pLDInfo.options().hasDyld())
1107      dyld_name = pLDInfo.options().dyld().c_str();
1108    else
1109      dyld_name = dyld();
1110  
1111    std::memcpy(region->start(), dyld_name, interp.size());
1112  }
1113  
1114  /// getSectionOrder
getSectionOrder(const Output & pOutput,const LDSection & pSectHdr,const MCLDInfo & pInfo) const1115  unsigned int GNULDBackend::getSectionOrder(const Output& pOutput,
1116                                             const LDSection& pSectHdr,
1117                                             const MCLDInfo& pInfo) const
1118  {
1119    // NULL section should be the "1st" section
1120    if (LDFileFormat::Null == pSectHdr.kind())
1121      return 0;
1122  
1123    // if the section is not ALLOC, lay it out until the last possible moment
1124    if (0 == (pSectHdr.flag() & llvm::ELF::SHF_ALLOC))
1125      return SHO_UNDEFINED;
1126  
1127    bool is_write = (pSectHdr.flag() & llvm::ELF::SHF_WRITE) != 0;
1128    bool is_exec = (pSectHdr.flag() & llvm::ELF::SHF_EXECINSTR) != 0;
1129    const ELFFileFormat* file_format = getOutputFormat(pOutput);
1130  
1131    // TODO: need to take care other possible output sections
1132    switch (pSectHdr.kind()) {
1133      case LDFileFormat::Regular:
1134        if (is_exec) {
1135          if (&pSectHdr == &file_format->getInit())
1136            return SHO_INIT;
1137          if (&pSectHdr == &file_format->getFini())
1138            return SHO_FINI;
1139          return SHO_TEXT;
1140        } else if (!is_write) {
1141          return SHO_RO;
1142        } else {
1143          if (pInfo.options().hasRelro()) {
1144            if (pSectHdr.type() == llvm::ELF::SHT_PREINIT_ARRAY ||
1145                pSectHdr.type() == llvm::ELF::SHT_INIT_ARRAY ||
1146                pSectHdr.type() == llvm::ELF::SHT_FINI_ARRAY ||
1147                &pSectHdr == &file_format->getCtors() ||
1148                &pSectHdr == &file_format->getDtors() ||
1149                &pSectHdr == &file_format->getJCR() ||
1150                0 == pSectHdr.name().compare(".data.rel.ro"))
1151              return SHO_RELRO;
1152            if (0 == pSectHdr.name().compare(".data.rel.ro.local"))
1153              return SHO_RELRO_LOCAL;
1154          }
1155          return SHO_DATA;
1156        }
1157  
1158      case LDFileFormat::BSS:
1159        return SHO_BSS;
1160  
1161      case LDFileFormat::NamePool:
1162        if (&pSectHdr == &file_format->getDynamic())
1163          return SHO_RELRO;
1164        return SHO_NAMEPOOL;
1165  
1166      case LDFileFormat::Relocation:
1167        if (&pSectHdr == &file_format->getRelPlt() ||
1168            &pSectHdr == &file_format->getRelaPlt())
1169          return SHO_REL_PLT;
1170        return SHO_RELOCATION;
1171  
1172      // get the order from target for target specific sections
1173      case LDFileFormat::Target:
1174        return getTargetSectionOrder(pOutput, pSectHdr, pInfo);
1175  
1176      // handle .interp
1177      case LDFileFormat::Note:
1178        return SHO_INTERP;
1179  
1180      case LDFileFormat::EhFrame:
1181      case LDFileFormat::EhFrameHdr:
1182      case LDFileFormat::GCCExceptTable:
1183        return SHO_EXCEPTION;
1184  
1185      case LDFileFormat::MetaData:
1186      case LDFileFormat::Debug:
1187      default:
1188        return SHO_UNDEFINED;
1189    }
1190  }
1191  
1192  /// getSymbolSize
getSymbolSize(const LDSymbol & pSymbol) const1193  uint64_t GNULDBackend::getSymbolSize(const LDSymbol& pSymbol) const
1194  {
1195    // @ref Google gold linker: symtab.cc: 2780
1196    // undefined and dynamic symbols should have zero size.
1197    if (pSymbol.isDyn() || pSymbol.desc() == ResolveInfo::Undefined)
1198      return 0x0;
1199    return pSymbol.resolveInfo()->size();
1200  }
1201  
1202  /// getSymbolInfo
getSymbolInfo(const LDSymbol & pSymbol) const1203  uint64_t GNULDBackend::getSymbolInfo(const LDSymbol& pSymbol) const
1204  {
1205    // set binding
1206    uint8_t bind = 0x0;
1207    if (pSymbol.resolveInfo()->isLocal())
1208      bind = llvm::ELF::STB_LOCAL;
1209    else if (pSymbol.resolveInfo()->isGlobal())
1210      bind = llvm::ELF::STB_GLOBAL;
1211    else if (pSymbol.resolveInfo()->isWeak())
1212      bind = llvm::ELF::STB_WEAK;
1213    else if (pSymbol.resolveInfo()->isAbsolute()) {
1214      // (Luba) Is a absolute but not global (weak or local) symbol meaningful?
1215      bind = llvm::ELF::STB_GLOBAL;
1216    }
1217  
1218    if (pSymbol.visibility() == llvm::ELF::STV_INTERNAL ||
1219        pSymbol.visibility() == llvm::ELF::STV_HIDDEN)
1220      bind = llvm::ELF::STB_LOCAL;
1221  
1222    uint32_t type = pSymbol.resolveInfo()->type();
1223    // if the IndirectFunc symbol (i.e., STT_GNU_IFUNC) is from dynobj, change
1224    // its type to Function
1225    if (type == ResolveInfo::IndirectFunc && pSymbol.isDyn())
1226      type = ResolveInfo::Function;
1227    return (type | (bind << 4));
1228  }
1229  
1230  /// getSymbolValue - this function is called after layout()
getSymbolValue(const LDSymbol & pSymbol) const1231  uint64_t GNULDBackend::getSymbolValue(const LDSymbol& pSymbol) const
1232  {
1233    if (pSymbol.isDyn())
1234      return 0x0;
1235  
1236    return pSymbol.value();
1237  }
1238  
1239  /// getSymbolShndx - this function is called after layout()
1240  uint64_t
getSymbolShndx(const LDSymbol & pSymbol,const Layout & pLayout) const1241  GNULDBackend::getSymbolShndx(const LDSymbol& pSymbol, const Layout& pLayout) const
1242  {
1243    if (pSymbol.resolveInfo()->isAbsolute())
1244      return llvm::ELF::SHN_ABS;
1245    if (pSymbol.resolveInfo()->isCommon())
1246      return llvm::ELF::SHN_COMMON;
1247    if (pSymbol.resolveInfo()->isUndef() || pSymbol.isDyn())
1248      return llvm::ELF::SHN_UNDEF;
1249  
1250    if (pSymbol.resolveInfo()->isLocal()) {
1251      switch (pSymbol.type()) {
1252        case ResolveInfo::NoType:
1253        case ResolveInfo::File:
1254          return llvm::ELF::SHN_ABS;
1255      }
1256    }
1257  
1258    assert(pSymbol.hasFragRef() && "symbols must have fragment reference to get its index");
1259    return pLayout.getOutputLDSection(*pSymbol.fragRef()->frag())->index();
1260  }
1261  
1262  /// getSymbolIdx - called by emitRelocation to get the ouput symbol table index
getSymbolIdx(LDSymbol * pSymbol) const1263  size_t GNULDBackend::getSymbolIdx(LDSymbol* pSymbol) const
1264  {
1265     HashTableType::iterator entry = m_pSymIndexMap->find(pSymbol);
1266     return entry.getEntry()->value();
1267  }
1268  
1269  /// allocateCommonSymbols - allocate common symbols in the corresponding
1270  /// sections.
1271  /// @refer Google gold linker: common.cc: 214
1272  bool
allocateCommonSymbols(const MCLDInfo & pInfo,MCLinker & pLinker) const1273  GNULDBackend::allocateCommonSymbols(const MCLDInfo& pInfo, MCLinker& pLinker) const
1274  {
1275    SymbolCategory& symbol_list = pLinker.getOutputSymbols();
1276  
1277    if (symbol_list.emptyCommons() && symbol_list.emptyLocals())
1278      return true;
1279  
1280    SymbolCategory::iterator com_sym, com_end;
1281  
1282    // FIXME: If the order of common symbols is defined, then sort common symbols
1283    // std::sort(com_sym, com_end, some kind of order);
1284  
1285    // get or create corresponding BSS LDSection
1286    LDSection* bss_sect = &pLinker.getOrCreateOutputSectHdr(".bss",
1287                                     LDFileFormat::BSS,
1288                                     llvm::ELF::SHT_NOBITS,
1289                                     llvm::ELF::SHF_WRITE | llvm::ELF::SHF_ALLOC);
1290  
1291    LDSection* tbss_sect = &pLinker.getOrCreateOutputSectHdr(
1292                                     ".tbss",
1293                                     LDFileFormat::BSS,
1294                                     llvm::ELF::SHT_NOBITS,
1295                                     llvm::ELF::SHF_WRITE | llvm::ELF::SHF_ALLOC);
1296  
1297    assert(NULL != bss_sect && NULL !=tbss_sect);
1298  
1299    // get or create corresponding BSS SectionData
1300    SectionData& bss_sect_data = pLinker.getOrCreateSectData(*bss_sect);
1301    SectionData& tbss_sect_data = pLinker.getOrCreateSectData(*tbss_sect);
1302  
1303    // remember original BSS size
1304    uint64_t bss_offset  = bss_sect->size();
1305    uint64_t tbss_offset = tbss_sect->size();
1306  
1307    // allocate all local common symbols
1308    com_end = symbol_list.localEnd();
1309  
1310    for (com_sym = symbol_list.localBegin(); com_sym != com_end; ++com_sym) {
1311      if (ResolveInfo::Common == (*com_sym)->desc()) {
1312        // We have to reset the description of the symbol here. When doing
1313        // incremental linking, the output relocatable object may have common
1314        // symbols. Therefore, we can not treat common symbols as normal symbols
1315        // when emitting the regular name pools. We must change the symbols'
1316        // description here.
1317        (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define);
1318        Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size());
1319        (*com_sym)->setFragmentRef(new FragmentRef(*frag, 0));
1320  
1321        if (ResolveInfo::ThreadLocal == (*com_sym)->type()) {
1322          // allocate TLS common symbol in tbss section
1323          tbss_offset += pLinker.getLayout().appendFragment(*frag,
1324                                                            tbss_sect_data,
1325                                                            (*com_sym)->value());
1326        }
1327        else {
1328          bss_offset += pLinker.getLayout().appendFragment(*frag,
1329                                                           bss_sect_data,
1330                                                           (*com_sym)->value());
1331        }
1332      }
1333    }
1334  
1335    // allocate all global common symbols
1336    com_end = symbol_list.commonEnd();
1337    for (com_sym = symbol_list.commonBegin(); com_sym != com_end; ++com_sym) {
1338      // We have to reset the description of the symbol here. When doing
1339      // incremental linking, the output relocatable object may have common
1340      // symbols. Therefore, we can not treat common symbols as normal symbols
1341      // when emitting the regular name pools. We must change the symbols'
1342      // description here.
1343      (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define);
1344      Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size());
1345      (*com_sym)->setFragmentRef(new FragmentRef(*frag, 0));
1346  
1347      if (ResolveInfo::ThreadLocal == (*com_sym)->type()) {
1348        // allocate TLS common symbol in tbss section
1349        tbss_offset += pLinker.getLayout().appendFragment(*frag,
1350                                                          tbss_sect_data,
1351                                                          (*com_sym)->value());
1352      }
1353      else {
1354        bss_offset += pLinker.getLayout().appendFragment(*frag,
1355                                                         bss_sect_data,
1356                                                         (*com_sym)->value());
1357      }
1358    }
1359  
1360    bss_sect->setSize(bss_offset);
1361    tbss_sect->setSize(tbss_offset);
1362    symbol_list.changeCommonsToGlobal();
1363    return true;
1364  }
1365  
1366  
1367  /// createProgramHdrs - base on output sections to create the program headers
createProgramHdrs(Output & pOutput,const MCLDInfo & pInfo)1368  void GNULDBackend::createProgramHdrs(Output& pOutput, const MCLDInfo& pInfo)
1369  {
1370    assert(pOutput.hasContext());
1371    ELFFileFormat *file_format = getOutputFormat(pOutput);
1372  
1373    // make PT_PHDR
1374    m_ELFSegmentTable.produce(llvm::ELF::PT_PHDR);
1375  
1376    // make PT_INTERP
1377    if (file_format->hasInterp()) {
1378      ELFSegment* interp_seg = m_ELFSegmentTable.produce(llvm::ELF::PT_INTERP);
1379      interp_seg->addSection(&file_format->getInterp());
1380    }
1381  
1382    // FIXME: Should we consider -z relro here?
1383    if (pInfo.options().hasRelro()) {
1384      // if -z relro is given, we need to adjust sections' offset again, and let
1385      // PT_GNU_RELRO end on a common page boundary
1386      LDContext::SectionTable& sect_table = pOutput.context()->getSectionTable();
1387  
1388      size_t idx;
1389      for (idx = 0; idx < pOutput.context()->numOfSections(); ++idx) {
1390        // find the first non-relro section
1391        if (getSectionOrder(pOutput, *sect_table[idx], pInfo) > SHO_RELRO_LAST) {
1392          break;
1393        }
1394      }
1395  
1396      // align the first non-relro section to page boundary
1397      uint64_t offset = sect_table[idx]->offset();
1398      alignAddress(offset, commonPageSize(pInfo));
1399      sect_table[idx]->setOffset(offset);
1400  
1401      // set up remaining section's offset
1402      for (++idx; idx < pOutput.context()->numOfSections(); ++idx) {
1403        uint64_t offset;
1404        size_t prev_idx = idx - 1;
1405        if (LDFileFormat::BSS == sect_table[prev_idx]->kind())
1406          offset = sect_table[prev_idx]->offset();
1407        else
1408          offset = sect_table[prev_idx]->offset() + sect_table[prev_idx]->size();
1409  
1410        alignAddress(offset, sect_table[idx]->align());
1411        sect_table[idx]->setOffset(offset);
1412      }
1413    } // relro
1414  
1415    uint32_t cur_seg_flag, prev_seg_flag = getSegmentFlag(0);
1416    uint64_t padding = 0;
1417    ELFSegment* load_seg = NULL;
1418    // make possible PT_LOAD segments
1419    LDContext::sect_iterator sect, sect_end = pOutput.context()->sectEnd();
1420    for (sect = pOutput.context()->sectBegin(); sect != sect_end; ++sect) {
1421  
1422      if (0 == ((*sect)->flag() & llvm::ELF::SHF_ALLOC) &&
1423          LDFileFormat::Null != (*sect)->kind())
1424        continue;
1425  
1426      // FIXME: Now only separate writable and non-writable PT_LOAD
1427      cur_seg_flag = getSegmentFlag((*sect)->flag());
1428      if ((prev_seg_flag & llvm::ELF::PF_W) ^ (cur_seg_flag & llvm::ELF::PF_W) ||
1429           LDFileFormat::Null == (*sect)->kind()) {
1430        // create new PT_LOAD segment
1431        load_seg = m_ELFSegmentTable.produce(llvm::ELF::PT_LOAD);
1432        load_seg->setAlign(abiPageSize(pInfo));
1433  
1434        // check if this segment needs padding
1435        padding = 0;
1436        if (((*sect)->offset() & (abiPageSize(pInfo) - 1)) != 0)
1437          padding = abiPageSize(pInfo);
1438      }
1439  
1440      assert(NULL != load_seg);
1441      load_seg->addSection((*sect));
1442      if (cur_seg_flag != prev_seg_flag)
1443        load_seg->updateFlag(cur_seg_flag);
1444  
1445      if (LDFileFormat::Null != (*sect)->kind())
1446        (*sect)->setAddr(segmentStartAddr(pOutput, pInfo) +
1447                         (*sect)->offset() +
1448                         padding);
1449  
1450      prev_seg_flag = cur_seg_flag;
1451    }
1452  
1453    // make PT_DYNAMIC
1454    if (file_format->hasDynamic()) {
1455      ELFSegment* dyn_seg = m_ELFSegmentTable.produce(llvm::ELF::PT_DYNAMIC,
1456                                                      llvm::ELF::PF_R |
1457                                                      llvm::ELF::PF_W);
1458      dyn_seg->addSection(&file_format->getDynamic());
1459    }
1460  
1461    if (pInfo.options().hasRelro()) {
1462      // make PT_GNU_RELRO
1463      ELFSegment* relro_seg = m_ELFSegmentTable.produce(llvm::ELF::PT_GNU_RELRO);
1464      for (LDContext::sect_iterator sect = pOutput.context()->sectBegin();
1465           sect != pOutput.context()->sectEnd(); ++sect) {
1466        unsigned int order = getSectionOrder(pOutput, **sect, pInfo);
1467        if (SHO_RELRO_LOCAL == order ||
1468            SHO_RELRO == order ||
1469            SHO_RELRO_LAST == order) {
1470          relro_seg->addSection(*sect);
1471        }
1472      }
1473    }
1474  
1475    // make PT_GNU_EH_FRAME
1476    if (file_format->hasEhFrameHdr()) {
1477      ELFSegment* eh_seg = m_ELFSegmentTable.produce(llvm::ELF::PT_GNU_EH_FRAME);
1478      eh_seg->addSection(&file_format->getEhFrameHdr());
1479    }
1480  }
1481  
1482  /// setupProgramHdrs - set up the attributes of segments
setupProgramHdrs(const Output & pOutput,const MCLDInfo & pInfo)1483  void GNULDBackend:: setupProgramHdrs(const Output& pOutput, const MCLDInfo& pInfo)
1484  {
1485    // update segment info
1486    ELFSegmentFactory::iterator seg, seg_end = m_ELFSegmentTable.end();
1487    for (seg = m_ELFSegmentTable.begin(); seg != seg_end; ++seg) {
1488      ELFSegment& segment = *seg;
1489  
1490      // update PT_PHDR
1491      if (llvm::ELF::PT_PHDR == segment.type()) {
1492        uint64_t offset, phdr_size;
1493        if (32 == bitclass()) {
1494          offset = sizeof(llvm::ELF::Elf32_Ehdr);
1495          phdr_size = sizeof(llvm::ELF::Elf32_Phdr);
1496        }
1497        else {
1498          offset = sizeof(llvm::ELF::Elf64_Ehdr);
1499          phdr_size = sizeof(llvm::ELF::Elf64_Phdr);
1500        }
1501        segment.setOffset(offset);
1502        segment.setVaddr(segmentStartAddr(pOutput, pInfo) + offset);
1503        segment.setPaddr(segment.vaddr());
1504        segment.setFilesz(numOfSegments() * phdr_size);
1505        segment.setMemsz(numOfSegments() * phdr_size);
1506        segment.setAlign(bitclass() / 8);
1507        continue;
1508      }
1509  
1510      // bypass if there is no section in this segment (e.g., PT_GNU_STACK)
1511      if (segment.numOfSections() == 0)
1512        continue;
1513  
1514      segment.setOffset(segment.getFirstSection()->offset());
1515      if (llvm::ELF::PT_LOAD == segment.type() &&
1516          LDFileFormat::Null == segment.getFirstSection()->kind())
1517        segment.setVaddr(segmentStartAddr(pOutput, pInfo));
1518      else
1519        segment.setVaddr(segment.getFirstSection()->addr());
1520      segment.setPaddr(segment.vaddr());
1521  
1522      const LDSection* last_sect = segment.getLastSection();
1523      assert(NULL != last_sect);
1524      uint64_t file_size = last_sect->offset() - segment.offset();
1525      if (LDFileFormat::BSS != last_sect->kind())
1526        file_size += last_sect->size();
1527      segment.setFilesz(file_size);
1528  
1529      segment.setMemsz(last_sect->addr() - segment.vaddr() + last_sect->size());
1530    }
1531  }
1532  
1533  /// createGNUStackInfo - create an output GNU stack section or segment if needed
1534  /// @ref gold linker: layout.cc:2608
createGNUStackInfo(const Output & pOutput,const MCLDInfo & pInfo,MCLinker & pLinker)1535  void GNULDBackend::createGNUStackInfo(const Output& pOutput,
1536                                        const MCLDInfo& pInfo,
1537                                        MCLinker& pLinker)
1538  {
1539    uint32_t flag = 0x0;
1540    if (pInfo.options().hasStackSet()) {
1541      // 1. check the command line option (-z execstack or -z noexecstack)
1542      if (pInfo.options().hasExecStack())
1543        flag = llvm::ELF::SHF_EXECINSTR;
1544    } else {
1545      // 2. check the stack info from the input objects
1546      size_t object_count = 0, stack_note_count = 0;
1547      mcld::InputTree::const_bfs_iterator input, inEnd = pInfo.inputs().bfs_end();
1548      for (input=pInfo.inputs().bfs_begin(); input!=inEnd; ++input) {
1549        if ((*input)->type() == Input::Object) {
1550          ++object_count;
1551          const LDSection* sect = (*input)->context()->getSection(
1552                                                               ".note.GNU-stack");
1553          if (NULL != sect) {
1554            ++stack_note_count;
1555            // 2.1 found a stack note that is set as executable
1556            if (0 != (llvm::ELF::SHF_EXECINSTR & sect->flag())) {
1557              flag = llvm::ELF::SHF_EXECINSTR;
1558              break;
1559            }
1560          }
1561        }
1562      }
1563  
1564      // 2.2 there are no stack note sections in all input objects
1565      if (0 == stack_note_count)
1566        return;
1567  
1568      // 2.3 a special case. Use the target default to decide if the stack should
1569      //     be executable
1570      if (llvm::ELF::SHF_EXECINSTR != flag && object_count != stack_note_count)
1571        if (isDefaultExecStack())
1572          flag = llvm::ELF::SHF_EXECINSTR;
1573    }
1574  
1575    if (pOutput.type() != Output::Object)
1576      m_ELFSegmentTable.produce(llvm::ELF::PT_GNU_STACK,
1577                                llvm::ELF::PF_R |
1578                                llvm::ELF::PF_W |
1579                                getSegmentFlag(flag));
1580    else
1581      pLinker.getOrCreateOutputSectHdr(".note.GNU-stack",
1582                                       LDFileFormat::Note,
1583                                       llvm::ELF::SHT_PROGBITS,
1584                                       flag);
1585  }
1586  
1587  /// preLayout - Backend can do any needed modification before layout
preLayout(const Output & pOutput,const MCLDInfo & pLDInfo,MCLinker & pLinker)1588  void GNULDBackend::preLayout(const Output& pOutput,
1589                               const MCLDInfo& pLDInfo,
1590                               MCLinker& pLinker)
1591  {
1592    // prelayout target first
1593    doPreLayout(pOutput, pLDInfo, pLinker);
1594  
1595    if (pLDInfo.options().hasEhFrameHdr()) {
1596      // init EhFrameHdr and size the output section
1597      ELFFileFormat* format = getOutputFormat(pOutput);
1598      assert(NULL != getEhFrame());
1599      m_pEhFrameHdr = new EhFrameHdr(*getEhFrame(),
1600                                     format->getEhFrame(),
1601                                     format->getEhFrameHdr());
1602      m_pEhFrameHdr->sizeOutput();
1603    }
1604  }
1605  
1606  /// postLayout - Backend can do any needed modification after layout
postLayout(const Output & pOutput,const MCLDInfo & pInfo,MCLinker & pLinker)1607  void GNULDBackend::postLayout(const Output& pOutput,
1608                                const MCLDInfo& pInfo,
1609                                MCLinker& pLinker)
1610  {
1611    // 1. emit program headers
1612    if (pOutput.type() != Output::Object) {
1613      // 1.1 create program headers
1614      createProgramHdrs(pLinker.getLDInfo().output(), pInfo);
1615    }
1616  
1617    // 1.2 create special GNU Stack note section or segment
1618    createGNUStackInfo(pOutput, pInfo, pLinker);
1619  
1620    if (pOutput.type() != Output::Object) {
1621      // 1.3 set up the attributes of program headers
1622      setupProgramHdrs(pOutput, pInfo);
1623    }
1624  
1625    // 2. target specific post layout
1626    doPostLayout(pOutput, pInfo, pLinker);
1627  }
1628  
postProcessing(const Output & pOutput,const MCLDInfo & pInfo,MCLinker & pLinker)1629  void GNULDBackend::postProcessing(const Output& pOutput,
1630                                    const MCLDInfo& pInfo,
1631                                    MCLinker& pLinker)
1632  {
1633    if (pInfo.options().hasEhFrameHdr()) {
1634      // emit eh_frame_hdr
1635      if (bitclass() == 32)
1636        m_pEhFrameHdr->emitOutput<32>(pLinker.getLDInfo().output(),
1637                                      pLinker);
1638    }
1639  }
1640  
1641  /// getHashBucketCount - calculate hash bucket count.
1642  /// @ref Google gold linker, dynobj.cc:791
getHashBucketCount(unsigned pNumOfSymbols,bool pIsGNUStyle)1643  unsigned GNULDBackend::getHashBucketCount(unsigned pNumOfSymbols,
1644                                            bool pIsGNUStyle)
1645  {
1646    // @ref Google gold, dynobj.cc:loc 791
1647    static const unsigned int buckets[] =
1648    {
1649      1, 3, 17, 37, 67, 97, 131, 197, 263, 521, 1031, 2053, 4099, 8209,
1650      16411, 32771, 65537, 131101, 262147
1651    };
1652    const unsigned buckets_count = sizeof buckets / sizeof buckets[0];
1653  
1654    unsigned int result = 1;
1655    for (unsigned i = 0; i < buckets_count; ++i) {
1656      if (pNumOfSymbols < buckets[i])
1657        break;
1658      result = buckets[i];
1659    }
1660  
1661    if (pIsGNUStyle && result < 2)
1662      result = 2;
1663  
1664    return result;
1665  }
1666  
1667  /// isDynamicSymbol
1668  /// @ref Google gold linker: symtab.cc:311
isDynamicSymbol(const LDSymbol & pSymbol,const Output & pOutput)1669  bool GNULDBackend::isDynamicSymbol(const LDSymbol& pSymbol,
1670                                     const Output& pOutput)
1671  {
1672    // If a local symbol is in the LDContext's symbol table, it's a real local
1673    // symbol. We should not add it
1674    if (pSymbol.binding() == ResolveInfo::Local)
1675      return false;
1676  
1677    // If we are building shared object, and the visibility is external, we
1678    // need to add it.
1679    if (Output::DynObj == pOutput.type() || Output::Exec == pOutput.type())
1680      if (pSymbol.resolveInfo()->visibility() == ResolveInfo::Default ||
1681          pSymbol.resolveInfo()->visibility() == ResolveInfo::Protected)
1682        return true;
1683    return false;
1684  }
1685  
1686  /// commonPageSize - the common page size of the target machine.
1687  /// @ref gold linker: target.h:135
commonPageSize(const MCLDInfo & pInfo) const1688  uint64_t GNULDBackend::commonPageSize(const MCLDInfo& pInfo) const
1689  {
1690    if (pInfo.options().commPageSize() > 0)
1691      return std::min(pInfo.options().commPageSize(), abiPageSize(pInfo));
1692    else
1693      return std::min(static_cast<uint64_t>(0x1000), abiPageSize(pInfo));
1694  }
1695  
1696  /// abiPageSize - the abi page size of the target machine.
1697  /// @ref gold linker: target.h:125
abiPageSize(const MCLDInfo & pInfo) const1698  uint64_t GNULDBackend::abiPageSize(const MCLDInfo& pInfo) const
1699  {
1700    if (pInfo.options().maxPageSize() > 0)
1701      return pInfo.options().maxPageSize();
1702    else
1703      return static_cast<uint64_t>(0x1000);
1704  }
1705  
1706  /// isOutputPIC - return whether the output is position-independent
isOutputPIC(const Output & pOutput,const MCLDInfo & pInfo) const1707  bool GNULDBackend::isOutputPIC(const Output& pOutput,
1708                                 const MCLDInfo& pInfo) const
1709  {
1710    if (Output::DynObj == pOutput.type() || pInfo.options().isPIE())
1711      return true;
1712    return false;
1713  }
1714  
1715  /// isStaticLink - return whether we're doing static link
isStaticLink(const Output & pOutput,const MCLDInfo & pInfo) const1716  bool GNULDBackend::isStaticLink(const Output& pOutput,
1717                                  const MCLDInfo& pInfo) const
1718  {
1719    InputTree::const_iterator it = pInfo.inputs().begin();
1720    if (!isOutputPIC(pOutput, pInfo) && (*it)->attribute()->isStatic())
1721      return true;
1722    return false;
1723  }
1724  
1725  /// isSymbolPreemtible - whether the symbol can be preemted by other
1726  /// link unit
1727  /// @ref Google gold linker, symtab.h:551
isSymbolPreemptible(const ResolveInfo & pSym,const MCLDInfo & pLDInfo,const Output & pOutput) const1728  bool GNULDBackend::isSymbolPreemptible(const ResolveInfo& pSym,
1729                                         const MCLDInfo& pLDInfo,
1730                                         const Output& pOutput) const
1731  {
1732    if (pSym.other() != ResolveInfo::Default)
1733      return false;
1734  
1735    if (Output::DynObj != pOutput.type())
1736      return false;
1737  
1738    if (pLDInfo.options().Bsymbolic())
1739      return false;
1740  
1741    return true;
1742  }
1743  
1744  /// symbolNeedsPLT - return whether the symbol needs a PLT entry
1745  /// @ref Google gold linker, symtab.h:596
symbolNeedsPLT(const ResolveInfo & pSym,const MCLDInfo & pLDInfo,const Output & pOutput) const1746  bool GNULDBackend::symbolNeedsPLT(const ResolveInfo& pSym,
1747                                    const MCLDInfo& pLDInfo,
1748                                    const Output& pOutput) const
1749  {
1750    if (pSym.isUndef() && !pSym.isDyn() && pOutput.type() != Output::DynObj)
1751      return false;
1752  
1753    // An IndirectFunc symbol (i.e., STT_GNU_IFUNC) always needs a plt entry
1754    if (pSym.type() == ResolveInfo::IndirectFunc)
1755      return true;
1756  
1757    if (pSym.type() != ResolveInfo::Function)
1758      return false;
1759  
1760    if (isStaticLink(pOutput, pLDInfo) || pLDInfo.options().isPIE())
1761      return false;
1762  
1763    return (pSym.isDyn() ||
1764            pSym.isUndef() ||
1765            isSymbolPreemptible(pSym, pLDInfo, pOutput));
1766  }
1767  
1768  /// symbolNeedsDynRel - return whether the symbol needs a dynamic relocation
1769  /// @ref Google gold linker, symtab.h:645
symbolNeedsDynRel(const ResolveInfo & pSym,bool pSymHasPLT,const MCLDInfo & pLDInfo,const Output & pOutput,bool isAbsReloc) const1770  bool GNULDBackend::symbolNeedsDynRel(const ResolveInfo& pSym,
1771                                       bool pSymHasPLT,
1772                                       const MCLDInfo& pLDInfo,
1773                                       const Output& pOutput,
1774                                       bool isAbsReloc) const
1775  {
1776    // an undefined reference in the executables should be statically
1777    // resolved to 0 and no need a dynamic relocation
1778    if (pSym.isUndef() && !pSym.isDyn() && (Output::Exec == pOutput.type()))
1779      return false;
1780    if (pSym.isAbsolute())
1781      return false;
1782    if (isOutputPIC(pOutput, pLDInfo) && isAbsReloc)
1783      return true;
1784    if (pSymHasPLT && ResolveInfo::Function == pSym.type())
1785      return false;
1786    if (!isOutputPIC(pOutput, pLDInfo) && pSymHasPLT)
1787      return false;
1788    if (pSym.isDyn() || pSym.isUndef() ||
1789        isSymbolPreemptible(pSym, pLDInfo, pOutput))
1790      return true;
1791  
1792    return false;
1793  }
1794  
1795  /// symbolNeedsCopyReloc - return whether the symbol needs a copy relocation
symbolNeedsCopyReloc(const Layout & pLayout,const Relocation & pReloc,const ResolveInfo & pSym,const MCLDInfo & pLDInfo,const Output & pOutput) const1796  bool GNULDBackend::symbolNeedsCopyReloc(const Layout& pLayout,
1797                                          const Relocation& pReloc,
1798                                          const ResolveInfo& pSym,
1799                                          const MCLDInfo& pLDInfo,
1800                                          const Output& pOutput) const
1801  {
1802    // only the reference from dynamic executable to non-function symbol in
1803    // the dynamic objects may need copy relocation
1804    if (isOutputPIC(pOutput, pLDInfo) ||
1805        !pSym.isDyn() ||
1806        pSym.type() == ResolveInfo::Function ||
1807        pSym.size() == 0)
1808      return false;
1809  
1810    // check if the option -z nocopyreloc is given
1811    if (pLDInfo.options().hasNoCopyReloc())
1812      return false;
1813  
1814    // TODO: Is this check necessary?
1815    // if relocation target place is readonly, a copy relocation is needed
1816    if ((pLayout.getOutputLDSection(*pReloc.targetRef().frag())->flag() &
1817        llvm::ELF::SHF_WRITE) == 0)
1818      return true;
1819  
1820    return false;
1821  }
1822  
1823