LDFileFormat.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===- LDFileFormat.h -----------------------------------------------------===// 223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// 323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// The MCLinker Project 423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// 523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This file is distributed under the University of Illinois Open Source 623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// License. See LICENSE.TXT for details. 723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// 823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===----------------------------------------------------------------------===// 923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifndef MCLD_LDFILE_FORMAT_H 1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define MCLD_LDFILE_FORMAT_H 1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifdef ENABLE_UNITTEST 1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <gtest.h> 1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif 1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cstdio> 1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cassert> 1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1823b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace mcld { 1923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 20998a6d81896df8b662cc10ddeb35087b78b38d72John Reckclass LDSection; 21998a6d81896df8b662cc10ddeb35087b78b38d72John Reckclass ObjectBuilder; 2223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 2323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/** \class LDFileFormat 2419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck * \brief LDFileFormat describes the common file formats. 254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck */ 2619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass LDFileFormat 274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck{ 28e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic: 29fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck enum Kind { 30119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck Null, 31860d155f866cc15a725e7ce03763280987f24901John Reck Regular, 324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck BSS, 33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck NamePool, 344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck Relocation, 354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck Debug, 3623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck Target, 3723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck EhFrame, 3823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck EhFrameHdr, 394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck GCCExceptTable, 40119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck Version, 4119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck Note, 424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck MetaData, 434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck Group, 441949e7928eeec22cd3f74b5f763a4eb433238453John Reck StackNote, 454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck Ignore 4623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck }; 4723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 483b20251a355c88193c439f928a84ae69483fb488John Reckprotected: 494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck LDFileFormat(); 5023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 5123b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic: 52119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual ~LDFileFormat(); 53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 5423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck /// initStdSections - initialize all standard section headers. 55119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck /// @param [in] pBuilder The ObjectBuilder to create section headers 56119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck /// @param [in] pBitClass The bitclass of target backend. 57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void initStdSections(ObjectBuilder& pBuilder, 5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck unsigned int pBitClass) = 0; 59a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 60a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // ----- access functions ----- // 61a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck LDSection& getText() { 62058fc640017c90120c599d378a4cbc55668b05b7Chris Craik assert(NULL != f_pTextSection); 63058fc640017c90120c599d378a4cbc55668b05b7Chris Craik return *f_pTextSection; 6463a06673253914510bbeebd500655008682dade1John Reck } 65860d155f866cc15a725e7ce03763280987f24901John Reck 6668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck const LDSection& getText() const { 67d72e0a339b54af0c4e731513bbad120dff694723John Reck assert(NULL != f_pTextSection); 68e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck return *f_pTextSection; 69fae904d63947fe1687d1d44be29234cc3d538f24John Reck } 7023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LDSection& getData() { 7218f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck assert(NULL != f_pDataSection); 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return *f_pDataSection; 743e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck } 7519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 76998a6d81896df8b662cc10ddeb35087b78b38d72John Reck const LDSection& getData() const { 7719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck assert(NULL != f_pDataSection); 78f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck return *f_pDataSection; 79f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck } 80e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 813b20251a355c88193c439f928a84ae69483fb488John Reck LDSection& getBSS() { 8223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck assert(NULL != f_pBSSSection); 83fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck return *f_pBSSSection; 84fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck } 851949e7928eeec22cd3f74b5f763a4eb433238453John Reck 861949e7928eeec22cd3f74b5f763a4eb433238453John Reck const LDSection& getBSS() const { 871949e7928eeec22cd3f74b5f763a4eb433238453John Reck assert(NULL != f_pBSSSection); 883b20251a355c88193c439f928a84ae69483fb488John Reck return *f_pBSSSection; 893b20251a355c88193c439f928a84ae69483fb488John Reck } 9066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 91f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck LDSection& getReadOnly() { 92a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck assert(NULL != f_pReadOnlySection); 93a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck return *f_pReadOnlySection; 94fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 95fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 9623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck const LDSection& getReadOnly() const { 97a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck assert(NULL != f_pReadOnlySection); 98a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck return *f_pReadOnlySection; 99a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprotected: 101f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck // variable name : ELF MachO 1024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck LDSection* f_pTextSection; // .text __text 10319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck LDSection* f_pDataSection; // .data __data 10419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck LDSection* f_pBSSSection; // .bss __bss 105998a6d81896df8b662cc10ddeb35087b78b38d72John Reck LDSection* f_pReadOnlySection; // .rodata __const 106998a6d81896df8b662cc10ddeb35087b78b38d72John Reck}; 1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1083b20251a355c88193c439f928a84ae69483fb488John Reck} // namespace of mcld 109a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 11023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif 11123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck