15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFReader.cpp ------------------------------------------------------===// 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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/Twine.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/ELF.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/Host.h> 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCLinker.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFReader.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/GNULDBackend.h> 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryArea.h> 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryRegion.h> 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MsgHandling.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstring> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ELFReaderIF 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getLDSectionKind 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDFileFormat::Kind 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFReaderIF::getLDSectionKind(uint32_t pType, const char* pName) const 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // name rules 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef name(pName); 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (name.startswith(".debug") || 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang name.startswith(".zdebug") || 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang name.startswith(".gnu.linkonce.wi.") || 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang name.startswith(".line") || 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang name.startswith(".stab")) 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Debug; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (name.startswith(".comment")) 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::MetaData; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (name.startswith(".interp") || name.startswith(".dynamic")) 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Note; 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (name.startswith(".eh_frame")) 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return LDFileFormat::EhFrame; 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (name.startswith(".eh_frame_hdr")) 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return LDFileFormat::EhFrameHdr; 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (name.startswith(".gcc_except_table")) 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return LDFileFormat::GCCExceptTable; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // type rules 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch(pType) { 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_NULL: 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Null; 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_INIT_ARRAY: 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_FINI_ARRAY: 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_PREINIT_ARRAY: 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_PROGBITS: 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Regular; 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_SYMTAB: 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_DYNSYM: 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_STRTAB: 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::NamePool; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_RELA: 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_REL: 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Relocation; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_NOBITS: 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::BSS; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_DYNAMIC: 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_NOTE: 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Note; 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_HASH: 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_SHLIB: 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::MetaData; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_GROUP: 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Group; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_GNU_versym: 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_GNU_verdef: 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::SHT_GNU_verneed: 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Version; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao default: 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if ((pType >= llvm::ELF::SHT_LOPROC && pType <= llvm::ELF::SHT_HIPROC) || 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao (pType >= llvm::ELF::SHT_LOOS && pType <= llvm::ELF::SHT_HIOS) || 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao (pType >= llvm::ELF::SHT_LOUSER && pType <= llvm::ELF::SHT_HIUSER)) 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::Target; 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang fatal(diag::err_unsupported_section) << pName << pType; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return LDFileFormat::MetaData; 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymType 91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoResolveInfo::Type ELFReaderIF::getSymType(uint8_t pInfo, uint16_t pShndx) const 92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{ 93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao ResolveInfo::Type result = static_cast<ResolveInfo::Type>(pInfo & 0xF); 94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao if (llvm::ELF::SHN_ABS == pShndx && ResolveInfo::Section == result) { 95cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // In Mips, __gp_disp is a special section symbol. Its name comes from 96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // .strtab, not .shstrtab. However, it is unique. Only it is also a ABS 97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // symbol. So here is a tricky to identify __gp_disp and convert it to 98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // Object symbol. 99cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao return ResolveInfo::Object; 100cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao } 101cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 102cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao return result; 103cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao} 104cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getSymDesc 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::Desc ELFReaderIF::getSymDesc(uint16_t pShndx, const Input& pInput) const 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_UNDEF) 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Undefined; 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx < llvm::ELF::SHN_LORESERVE) { 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // an ELF symbol defined in a section which we are not including 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // must be treated as an Undefined. 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // @ref Google gold linker: symtab.cc: 1086 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (NULL == pInput.context()->getSection(pShndx)) 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Undefined; 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Define; 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_ABS) 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Define; 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_COMMON) 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Common; 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // FIXME: ELF weak alias should be ResolveInfo::Indirect 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::NoneDesc; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getSymBinding 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::Binding 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFReaderIF::getSymBinding(uint8_t pBinding, uint16_t pShndx, uint8_t pVis) const 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // TODO: 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // if --just-symbols option is enabled, the symbol must covert to Absolute 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch(pBinding) { 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::STB_LOCAL: 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Local; 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::STB_GLOBAL: 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Global; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ELF::STB_WEAK: 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Weak; 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_ABS) 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::Absolute; 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ResolveInfo::NoneBinding; 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getSymFragmentRef 154cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoFragmentRef* 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFReaderIF::getSymFragmentRef(Input& pInput, 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLinker& pLinker, 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint16_t pShndx, 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t pOffset) const 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 16067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_UNDEF || pShndx >= llvm::ELF::SHN_LORESERVE) 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSection* sect_hdr = pInput.context()->getSection(pShndx); 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == sect_hdr) 167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unreachable(diag::unreachable_invalid_section_idx) << pShndx 168affc150dc44fab1911775a49636d0ce85333b634Zonr Chang << pInput.path().native(); 16967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 170cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef* result = pLinker.getLayout().getFragmentRef(*sect_hdr, pOffset); 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result; 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getSymVisibility 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoResolveInfo::Visibility 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFReaderIF::getSymVisibility(uint8_t pVis) const 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return static_cast<ResolveInfo::Visibility>(pVis); 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// getSymValue - get the section offset of the symbol. 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaouint64_t ELFReaderIF::getSymValue(uint64_t pValue, 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint16_t pShndx, 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Input& pInput) const 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (Input::Object == pInput.type()) { 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // In relocatable files, st_value holds alignment constraints for a symbol 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // whose section index is SHN_COMMON 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pShndx == llvm::ELF::SHN_COMMON || pShndx == llvm::ELF::SHN_ABS) { 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pValue; 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // In relocatable files, st_value holds a section offset for a defined symbol. 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // TODO: 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // if --just-symbols option are enabled, convert the value from section offset 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // to virtual address by adding input section's virtual address. 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The section's virtual address in relocatable files is normally zero, but 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // people can use link script to change it. 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pValue; 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // In executable and shared object files, st_value holds a virtual address. 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // the virtual address is useless during linking. 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return 0x0; 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 207affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool ELFReaderIF::readEhFrame(Input& pInput, 208affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MCLinker& pLinker, 209affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& pInputSectHdr) const 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& out_sect = pLinker.getOrCreateOutputSectHdr(pInputSectHdr.name(), 212affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pInputSectHdr.kind(), 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pInputSectHdr.type(), 214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pInputSectHdr.flag()); 215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao size_t size = pLinker.addEhFrame(pInput, pInputSectHdr, *pInput.memArea()); 217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang out_sect.setSize(out_sect.size() + size); 219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 221