1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- EhFrameHdr.cpp -----------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/EhFrameHdr.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 11affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//========================== 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// EhFrameHdr 15affc150dc44fab1911775a49636d0ce85333b634Zonr ChangEhFrameHdr::EhFrameHdr(const EhFrame& pEhFrameData, 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const LDSection& pEhFrameSect, 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& pEhFrameHdrSect) 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : m_EhFrameData(pEhFrameData), 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_EhFrameSect(pEhFrameSect), 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_EhFrameHdrSect(pEhFrameHdrSect) 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 24affc150dc44fab1911775a49636d0ce85333b634Zonr ChangEhFrameHdr::~EhFrameHdr() 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// @ref lsb core generic 4.1 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// .eh_frame_hdr section format 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint8_t : version 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint8_t : eh_frame_ptr_enc 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint8_t : fde_count_enc 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint8_t : table_enc 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint32_t : eh_frame_ptr 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// uint32_t : fde_count 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// __________________________ when fde_count > 0 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// <uint32_t, uint32_t>+ : binary search table 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/// sizeOutput - base on the fde count to size output 40affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid EhFrameHdr::sizeOutput() 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size_t size = 12; 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (m_EhFrameData.canRecognizeAllEhFrame()) { 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size_t fde_count = m_EhFrameData.getFDECount(); 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size += 8 * fde_count; 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_EhFrameHdrSect.setSize(size); 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50