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