15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFReader.h --------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef MCLD_ELF_READER_H
106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define MCLD_ELF_READER_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ELF.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/Host.h>
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/ELFReaderIf.h>
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h>
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/LDSymbol.h>
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/MemoryRegion.h>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryArea.h>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//class Module;
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass IRBuilder;
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionData;
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class ELFReader
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief ELFReader is a template scaffolding for partial specification.
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<size_t BIT, bool LITTLEENDIAN>
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFReader
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ };
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class ELFReader<32, true>
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief ELFReader<32, true> is a 32-bit, little endian ELFReader.
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinestemplate<>
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFReader<32, true> : public ELFReaderIF
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Ehdr ELFHeader;
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Shdr SectionHeader;
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Sym  Symbol;
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Rel  Rel;
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf32_Rela Rela;
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ELFReader(GNULDBackend& pBackend);
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~ELFReader();
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// ELFHeaderSize - return the size of the ELFHeader
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  size_t getELFHeaderSize() const
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { return sizeof(ELFHeader); }
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isELF - is this a ELF file
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isELF(void* pELFHeader) const;
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isMyEndian - is this ELF file in the same endian to me?
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isMyEndian(void* pELFHeader) const;
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isMyMachine - is this ELF file generated for the same machine.
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isMyMachine(void* pELFHeader) const;
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// fileType - the file type of this file
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Input::Type fileType(void* pELFHeader) const;
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSectionHeaders - read ELF section header table and create LDSections
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readSectionHeaders(Input& pInput, void* pELFHeader) const;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRegularSection - read a regular section and create fragments.
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readRegularSection(Input& pInput, SectionData& pSD) const;
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSymbols - read ELF symbols and create LDSymbol
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readSymbols(Input& pInput,
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                   IRBuilder& pBuilder,
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                   const MemoryRegion& pRegion,
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                   const char* StrTab) const;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// readSignature - read a symbol from the given Input and index in symtab
8767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  /// This is used to get the signature of a group section.
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo* readSignature(Input& pInput,
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                    LDSection& pSymTab,
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                    uint32_t pSymIdx) const;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRela - read ELF rela and create Relocation
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readRela(Input& pInput,
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                LDSection& pSection,
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                const MemoryRegion& pRegion) const;
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRel - read ELF rel and create Relocation
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readRel(Input& pInput,
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines               LDSection& pSection,
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines               const MemoryRegion& pRegion) const;
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// readDynamic - read ELF .dynamic in input dynobj
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool readDynamic(Input& pInput) const;
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  struct AliasInfo {
107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    LDSymbol* pt_alias; ///potential alias
108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    uint64_t ld_value;
109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ResolveInfo::Binding ld_binding;
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// comparison function to sort symbols for analyzing weak alias.
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// sort symbols by symbol value and then weak before strong.
114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// ref. to gold symtabl.cc 1595
115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  static bool less(AliasInfo p1, AliasInfo p2) {
116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (p1.ld_value != p2.ld_value)
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      return (p1.ld_value < p2.ld_value);
118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (p1.ld_binding != p2.ld_binding) {
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      if (ResolveInfo::Weak==p1.ld_binding)
120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return true;
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      else if (ResolveInfo::Weak==p2.ld_binding)
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return false;
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    return p1.pt_alias->str() < p2.pt_alias->str();
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class ELFReader<64, true>
1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief ELFReader<64, true> is a 64-bit, little endian ELFReader.
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFReader<64, true> : public ELFReaderIF
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
1376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Ehdr ELFHeader;
1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Shdr SectionHeader;
1396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Sym  Symbol;
1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Rel  Rel;
1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef llvm::ELF::Elf64_Rela Rela;
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ELFReader(GNULDBackend& pBackend);
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~ELFReader();
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// ELFHeaderSize - return the size of the ELFHeader
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t getELFHeaderSize() const
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return sizeof(ELFHeader); }
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isELF - is this a ELF file
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool isELF(void* pELFHeader) const;
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isMyEndian - is this ELF file in the same endian to me?
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool isMyEndian(void* pELFHeader) const;
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// isMyMachine - is this ELF file generated for the same machine.
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool isMyMachine(void* pELFHeader) const;
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// fileType - the file type of this file
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input::Type fileType(void* pELFHeader) const;
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSectionHeaders - read ELF section header table and create LDSections
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readSectionHeaders(Input& pInput, void* pELFHeader) const;
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRegularSection - read a regular section and create fragments.
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readRegularSection(Input& pInput, SectionData& pSD) const;
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readSymbols - read ELF symbols and create LDSymbol
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readSymbols(Input& pInput,
172d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                   IRBuilder& pBuilder,
173d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                   const MemoryRegion& pRegion,
174d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                   const char* StrTab) const;
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// readSignature - read a symbol from the given Input and index in symtab
17767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  /// This is used to get the signature of a group section.
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ResolveInfo* readSignature(Input& pInput,
17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                    LDSection& pSymTab,
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                    uint32_t pSymIdx) const;
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRela - read ELF rela and create Relocation
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readRela(Input& pInput,
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                LDSection& pSection,
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                const MemoryRegion& pRegion) const;
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// readRel - read ELF rel and create Relocation
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readRel(Input& pInput,
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               LDSection& pSection,
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               const MemoryRegion& pRegion) const;
191affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// readDynamic - read ELF .dynamic in input dynobj
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readDynamic(Input& pInput) const;
194f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
195f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate:
196f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  struct AliasInfo {
197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    LDSymbol* pt_alias; ///potential alias
198f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    uint64_t ld_value;
199f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    ResolveInfo::Binding ld_binding;
200f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  };
201f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
202f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// comparison function to sort symbols for analyzing weak alias.
203f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// sort symbols by symbol value and then weak before strong.
204f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// ref. to gold symtabl.cc 1595
205f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  static bool less(AliasInfo p1, AliasInfo p2) {
206f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (p1.ld_value != p2.ld_value)
207f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      return (p1.ld_value < p2.ld_value);
208f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (p1.ld_binding != p2.ld_binding) {
209f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      if (ResolveInfo::Weak==p1.ld_binding)
210f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return true;
211f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      else if (ResolveInfo::Weak==p2.ld_binding)
212f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return false;
213f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
214f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    return p1.pt_alias->str() < p2.pt_alias->str();
215f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
216f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
222affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
223