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