1 //===- LDFileFormat.h -----------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_ELF_FILE_FORMAT_H 10 #define MCLD_ELF_FILE_FORMAT_H 11 #include <mcld/LD/LDFileFormat.h> 12 #include <mcld/LD/LDSection.h> 13 14 namespace mcld { 15 16 class ObjectBuilder; 17 18 /** \class ELFFileFormat 19 * \brief ELFFileFormat describes the common file formats in ELF. 20 * LDFileFormats control the formats of the output file. 21 * 22 * @ref "Object Files," Ch. 4, in System V Application Binary Interface, 23 * Fourth Edition. 24 * 25 * @ref "Object Format," Ch. 10, in ISO/IEC 23360 Part 1:2010(E), Linux 26 * Standard Base Core Specification 4.1. 27 */ 28 class ELFFileFormat : public LDFileFormat 29 { 30 private: 31 /// initObjectFormat - initialize sections that are dependent on object 32 /// formats. (executable, shared objects or relocatable objects). 33 virtual void 34 initObjectFormat(ObjectBuilder& pBuilder, unsigned int pBitClass) = 0; 35 36 public: 37 ELFFileFormat(); 38 39 void initStdSections(ObjectBuilder& pBuilder, unsigned int pBitClass); 40 41 // ----- capacity ----- // 42 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. hasNULLSection()43 bool hasNULLSection() const 44 { return (NULL != f_pNULLSection) && (0 != f_pNULLSection->size()); } 45 hasGOT()46 bool hasGOT() const 47 { return (NULL != f_pGOT) && (0 != f_pGOT->size()); } 48 hasPLT()49 bool hasPLT() const 50 { return (NULL != f_pPLT) && (0 != f_pPLT->size()); } 51 hasRelDyn()52 bool hasRelDyn() const 53 { return (NULL != f_pRelDyn) && (0 != f_pRelDyn->size()); } 54 hasRelPlt()55 bool hasRelPlt() const 56 { return (NULL != f_pRelPlt) && (0 != f_pRelPlt->size()); } 57 hasRelaDyn()58 bool hasRelaDyn() const 59 { return (NULL != f_pRelaDyn) && (0 != f_pRelaDyn->size()); } 60 hasRelaPlt()61 bool hasRelaPlt() const 62 { return (NULL != f_pRelaPlt) && (0 != f_pRelaPlt->size()); } 63 64 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. hasComment()65 bool hasComment() const 66 { return (NULL != f_pComment) && (0 != f_pComment->size()); } 67 hasData1()68 bool hasData1() const 69 { return (NULL != f_pData1) && (0 != f_pData1->size()); } 70 hasDebug()71 bool hasDebug() const 72 { return (NULL != f_pDebug) && (0 != f_pDebug->size()); } 73 hasDynamic()74 bool hasDynamic() const 75 { return (NULL != f_pDynamic) && (0 != f_pDynamic->size()); } 76 hasDynStrTab()77 bool hasDynStrTab() const 78 { return (NULL != f_pDynStrTab) && (0 != f_pDynStrTab->size()); } 79 hasDynSymTab()80 bool hasDynSymTab() const 81 { return (NULL != f_pDynSymTab) && (0 != f_pDynSymTab->size()); } 82 hasFini()83 bool hasFini() const 84 { return (NULL != f_pFini) && (0 != f_pFini->size()); } 85 hasFiniArray()86 bool hasFiniArray() const 87 { return (NULL != f_pFiniArray) && (0 != f_pFiniArray->size()); } 88 hasHashTab()89 bool hasHashTab() const 90 { return (NULL != f_pHashTab) && (0 != f_pHashTab->size()); } 91 hasInit()92 bool hasInit() const 93 { return (NULL != f_pInit) && (0 != f_pInit->size()); } 94 hasInitArray()95 bool hasInitArray() const 96 { return (NULL != f_pInitArray) && (0 != f_pInitArray->size()); } 97 hasInterp()98 bool hasInterp() const 99 { return (NULL != f_pInterp) && (0 != f_pInterp->size()); } 100 hasLine()101 bool hasLine() const 102 { return (NULL != f_pLine) && (0 != f_pLine->size()); } 103 hasNote()104 bool hasNote() const 105 { return (NULL != f_pNote) && (0 != f_pNote->size()); } 106 hasPreInitArray()107 bool hasPreInitArray() const 108 { return (NULL != f_pPreInitArray) && (0 != f_pPreInitArray->size()); } 109 hasROData1()110 bool hasROData1() const 111 { return (NULL != f_pROData1) && (0 != f_pROData1->size()); } 112 hasShStrTab()113 bool hasShStrTab() const 114 { return (NULL != f_pShStrTab) && (0 != f_pShStrTab->size()); } 115 hasStrTab()116 bool hasStrTab() const 117 { return (NULL != f_pStrTab) && (0 != f_pStrTab->size()); } 118 hasSymTab()119 bool hasSymTab() const 120 { return (NULL != f_pSymTab) && (0 != f_pSymTab->size()); } 121 hasTBSS()122 bool hasTBSS() const 123 { return (NULL != f_pTBSS) && (0 != f_pTBSS->size()); } 124 hasTData()125 bool hasTData() const 126 { return (NULL != f_pTData) && (0 != f_pTData->size()); } 127 128 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. hasCtors()129 bool hasCtors() const 130 { return (NULL != f_pCtors) && (0 != f_pCtors->size()); } 131 hasDataRelRo()132 bool hasDataRelRo() const 133 { return (NULL != f_pDataRelRo) && (0 != f_pDataRelRo->size()); } 134 hasDtors()135 bool hasDtors() const 136 { return (NULL != f_pDtors) && (0 != f_pDtors->size()); } 137 hasEhFrame()138 bool hasEhFrame() const 139 { return (NULL != f_pEhFrame) && (0 != f_pEhFrame->size()); } 140 hasEhFrameHdr()141 bool hasEhFrameHdr() const 142 { return (NULL != f_pEhFrameHdr) && (0 != f_pEhFrameHdr->size()); } 143 hasGCCExceptTable()144 bool hasGCCExceptTable() const 145 { return (NULL != f_pGCCExceptTable) && (0 != f_pGCCExceptTable->size()); } 146 hasGNUVersion()147 bool hasGNUVersion() const 148 { return (NULL != f_pGNUVersion) && (0 != f_pGNUVersion->size()); } 149 hasGNUVersionD()150 bool hasGNUVersionD() const 151 { return (NULL != f_pGNUVersionD) && (0 != f_pGNUVersionD->size()); } 152 hasGNUVersionR()153 bool hasGNUVersionR() const 154 { return (NULL != f_pGNUVersionR) && (0 != f_pGNUVersionR->size()); } 155 hasGOTPLT()156 bool hasGOTPLT() const 157 { return (NULL != f_pGOTPLT) && (0 != f_pGOTPLT->size()); } 158 hasJCR()159 bool hasJCR() const 160 { return (NULL != f_pJCR) && (0 != f_pJCR->size()); } 161 hasNoteABITag()162 bool hasNoteABITag() const 163 { return (NULL != f_pNoteABITag) && (0 != f_pNoteABITag->size()); } 164 hasStab()165 bool hasStab() const 166 { return (NULL != f_pStab) && (0 != f_pStab->size()); } 167 hasStabStr()168 bool hasStabStr() const 169 { return (NULL != f_pStabStr) && (0 != f_pStabStr->size()); } 170 hasStack()171 bool hasStack() const 172 { return (NULL != f_pStack) && (0 != f_pStack->size()); } 173 hasStackNote()174 bool hasStackNote() const 175 { return (NULL != f_pStackNote); } 176 hasDataRelRoLocal()177 bool hasDataRelRoLocal() const 178 { return (NULL != f_pDataRelRoLocal) && (0 != f_pDataRelRoLocal->size()); } 179 hasGNUHashTab()180 bool hasGNUHashTab() const 181 { return (NULL != f_pGNUHashTab) && (0 != f_pGNUHashTab->size()); } 182 183 // ----- access functions ----- // 184 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. getNULLSection()185 LDSection& getNULLSection() { 186 assert(NULL != f_pNULLSection); 187 return *f_pNULLSection; 188 } 189 getNULLSection()190 const LDSection& getNULLSection() const { 191 assert(NULL != f_pNULLSection); 192 return *f_pNULLSection; 193 } 194 getGOT()195 LDSection& getGOT() { 196 assert(NULL != f_pGOT); 197 return *f_pGOT; 198 } 199 getGOT()200 const LDSection& getGOT() const { 201 assert(NULL != f_pGOT); 202 return *f_pGOT; 203 } 204 getPLT()205 LDSection& getPLT() { 206 assert(NULL != f_pPLT); 207 return *f_pPLT; 208 } 209 getPLT()210 const LDSection& getPLT() const { 211 assert(NULL != f_pPLT); 212 return *f_pPLT; 213 } 214 getRelDyn()215 LDSection& getRelDyn() { 216 assert(NULL != f_pRelDyn); 217 return *f_pRelDyn; 218 } 219 getRelDyn()220 const LDSection& getRelDyn() const { 221 assert(NULL != f_pRelDyn); 222 return *f_pRelDyn; 223 } 224 getRelPlt()225 LDSection& getRelPlt() { 226 assert(NULL != f_pRelPlt); 227 return *f_pRelPlt; 228 } 229 getRelPlt()230 const LDSection& getRelPlt() const { 231 assert(NULL != f_pRelPlt); 232 return *f_pRelPlt; 233 } 234 getRelaDyn()235 LDSection& getRelaDyn() { 236 assert(NULL != f_pRelaDyn); 237 return *f_pRelaDyn; 238 } 239 getRelaDyn()240 const LDSection& getRelaDyn() const { 241 assert(NULL != f_pRelaDyn); 242 return *f_pRelaDyn; 243 } 244 getRelaPlt()245 LDSection& getRelaPlt() { 246 assert(NULL != f_pRelaPlt); 247 return *f_pRelaPlt; 248 } 249 getRelaPlt()250 const LDSection& getRelaPlt() const { 251 assert(NULL != f_pRelaPlt); 252 return *f_pRelaPlt; 253 } 254 getComment()255 LDSection& getComment() { 256 assert(NULL != f_pComment); 257 return *f_pComment; 258 } 259 260 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. getComment()261 const LDSection& getComment() const { 262 assert(NULL != f_pComment); 263 return *f_pComment; 264 } 265 getData1()266 LDSection& getData1() { 267 assert(NULL != f_pData1); 268 return *f_pData1; 269 } 270 getData1()271 const LDSection& getData1() const { 272 assert(NULL != f_pData1); 273 return *f_pData1; 274 } 275 getDebug()276 LDSection& getDebug() { 277 assert(NULL != f_pDebug); 278 return *f_pDebug; 279 } 280 getDebug()281 const LDSection& getDebug() const { 282 assert(NULL != f_pDebug); 283 return *f_pDebug; 284 } 285 getDynamic()286 LDSection& getDynamic() { 287 assert(NULL != f_pDynamic); 288 return *f_pDynamic; 289 } 290 getDynamic()291 const LDSection& getDynamic() const { 292 assert(NULL != f_pDynamic); 293 return *f_pDynamic; 294 } 295 getDynStrTab()296 LDSection& getDynStrTab() { 297 assert(NULL != f_pDynStrTab); 298 return *f_pDynStrTab; 299 } 300 getDynStrTab()301 const LDSection& getDynStrTab() const { 302 assert(NULL != f_pDynStrTab); 303 return *f_pDynStrTab; 304 } 305 getDynSymTab()306 LDSection& getDynSymTab() { 307 assert(NULL != f_pDynSymTab); 308 return *f_pDynSymTab; 309 } 310 getDynSymTab()311 const LDSection& getDynSymTab() const { 312 assert(NULL != f_pDynSymTab); 313 return *f_pDynSymTab; 314 } 315 getFini()316 LDSection& getFini() { 317 assert(NULL != f_pFini); 318 return *f_pFini; 319 } 320 getFini()321 const LDSection& getFini() const { 322 assert(NULL != f_pFini); 323 return *f_pFini; 324 } 325 getFiniArray()326 LDSection& getFiniArray() { 327 assert(NULL != f_pFiniArray); 328 return *f_pFiniArray; 329 } 330 getFiniArray()331 const LDSection& getFiniArray() const { 332 assert(NULL != f_pFiniArray); 333 return *f_pFiniArray; 334 } 335 getHashTab()336 LDSection& getHashTab() { 337 assert(NULL != f_pHashTab); 338 return *f_pHashTab; 339 } 340 getHashTab()341 const LDSection& getHashTab() const { 342 assert(NULL != f_pHashTab); 343 return *f_pHashTab; 344 } 345 getInit()346 LDSection& getInit() { 347 assert(NULL != f_pInit); 348 return *f_pInit; 349 } 350 getInit()351 const LDSection& getInit() const { 352 assert(NULL != f_pInit); 353 return *f_pInit; 354 } 355 getInitArray()356 LDSection& getInitArray() { 357 assert(NULL != f_pInitArray); 358 return *f_pInitArray; 359 } 360 getInitArray()361 const LDSection& getInitArray() const { 362 assert(NULL != f_pInitArray); 363 return *f_pInitArray; 364 } 365 getInterp()366 LDSection& getInterp() { 367 assert(NULL != f_pInterp); 368 return *f_pInterp; 369 } 370 getInterp()371 const LDSection& getInterp() const { 372 assert(NULL != f_pInterp); 373 return *f_pInterp; 374 } 375 getLine()376 LDSection& getLine() { 377 assert(NULL != f_pLine); 378 return *f_pLine; 379 } 380 getLine()381 const LDSection& getLine() const { 382 assert(NULL != f_pLine); 383 return *f_pLine; 384 } 385 getNote()386 LDSection& getNote() { 387 assert(NULL != f_pNote); 388 return *f_pNote; 389 } 390 getNote()391 const LDSection& getNote() const { 392 assert(NULL != f_pNote); 393 return *f_pNote; 394 } 395 getPreInitArray()396 LDSection& getPreInitArray() { 397 assert(NULL != f_pPreInitArray); 398 return *f_pPreInitArray; 399 } 400 getPreInitArray()401 const LDSection& getPreInitArray() const { 402 assert(NULL != f_pPreInitArray); 403 return *f_pPreInitArray; 404 } 405 getROData1()406 LDSection& getROData1() { 407 assert(NULL != f_pROData1); 408 return *f_pROData1; 409 } 410 getROData1()411 const LDSection& getROData1() const { 412 assert(NULL != f_pROData1); 413 return *f_pROData1; 414 } 415 getShStrTab()416 LDSection& getShStrTab() { 417 assert(NULL != f_pShStrTab); 418 return *f_pShStrTab; 419 } 420 getShStrTab()421 const LDSection& getShStrTab() const { 422 assert(NULL != f_pShStrTab); 423 return *f_pShStrTab; 424 } 425 getStrTab()426 LDSection& getStrTab() { 427 assert(NULL != f_pStrTab); 428 return *f_pStrTab; 429 } 430 getStrTab()431 const LDSection& getStrTab() const { 432 assert(NULL != f_pStrTab); 433 return *f_pStrTab; 434 } 435 getSymTab()436 LDSection& getSymTab() { 437 assert(NULL != f_pSymTab); 438 return *f_pSymTab; 439 } 440 getSymTab()441 const LDSection& getSymTab() const { 442 assert(NULL != f_pSymTab); 443 return *f_pSymTab; 444 } 445 getTBSS()446 LDSection& getTBSS() { 447 assert(NULL != f_pTBSS); 448 return *f_pTBSS; 449 } 450 getTBSS()451 const LDSection& getTBSS() const { 452 assert(NULL != f_pTBSS); 453 return *f_pTBSS; 454 } 455 getTData()456 LDSection& getTData() { 457 assert(NULL != f_pTData); 458 return *f_pTData; 459 } 460 getTData()461 const LDSection& getTData() const { 462 assert(NULL != f_pTData); 463 return *f_pTData; 464 } 465 466 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. getCtors()467 LDSection& getCtors() { 468 assert(NULL != f_pCtors); 469 return *f_pCtors; 470 } 471 getCtors()472 const LDSection& getCtors() const { 473 assert(NULL != f_pCtors); 474 return *f_pCtors; 475 } 476 getDataRelRo()477 LDSection& getDataRelRo() { 478 assert(NULL != f_pDataRelRo); 479 return *f_pDataRelRo; 480 } 481 getDataRelRo()482 const LDSection& getDataRelRo() const { 483 assert(NULL != f_pDataRelRo); 484 return *f_pDataRelRo; 485 } 486 getDtors()487 LDSection& getDtors() { 488 assert(NULL != f_pDtors); 489 return *f_pDtors; 490 } 491 getDtors()492 const LDSection& getDtors() const { 493 assert(NULL != f_pDtors); 494 return *f_pDtors; 495 } 496 getEhFrame()497 LDSection& getEhFrame() { 498 assert(NULL != f_pEhFrame); 499 return *f_pEhFrame; 500 } 501 getEhFrame()502 const LDSection& getEhFrame() const { 503 assert(NULL != f_pEhFrame); 504 return *f_pEhFrame; 505 } 506 getEhFrameHdr()507 LDSection& getEhFrameHdr() { 508 assert(NULL != f_pEhFrameHdr); 509 return *f_pEhFrameHdr; 510 } 511 getEhFrameHdr()512 const LDSection& getEhFrameHdr() const { 513 assert(NULL != f_pEhFrameHdr); 514 return *f_pEhFrameHdr; 515 } 516 getGCCExceptTable()517 LDSection& getGCCExceptTable() { 518 assert(NULL != f_pGCCExceptTable); 519 return *f_pGCCExceptTable; 520 } 521 getGCCExceptTable()522 const LDSection& getGCCExceptTable() const { 523 assert(NULL != f_pGCCExceptTable); 524 return *f_pGCCExceptTable; 525 } 526 getGNUVersion()527 LDSection& getGNUVersion() { 528 assert(NULL != f_pGNUVersion); 529 return *f_pGNUVersion; 530 } 531 getGNUVersion()532 const LDSection& getGNUVersion() const { 533 assert(NULL != f_pGNUVersion); 534 return *f_pGNUVersion; 535 } 536 getGNUVersionD()537 LDSection& getGNUVersionD() { 538 assert(NULL != f_pGNUVersionD); 539 return *f_pGNUVersionD; 540 } 541 getGNUVersionD()542 const LDSection& getGNUVersionD() const { 543 assert(NULL != f_pGNUVersionD); 544 return *f_pGNUVersionD; 545 } 546 getGNUVersionR()547 LDSection& getGNUVersionR() { 548 assert(NULL != f_pGNUVersionR); 549 return *f_pGNUVersionR; 550 } 551 getGNUVersionR()552 const LDSection& getGNUVersionR() const { 553 assert(NULL != f_pGNUVersionR); 554 return *f_pGNUVersionR; 555 } 556 getGOTPLT()557 LDSection& getGOTPLT() { 558 assert(NULL != f_pGOTPLT); 559 return *f_pGOTPLT; 560 } 561 getGOTPLT()562 const LDSection& getGOTPLT() const { 563 assert(NULL != f_pGOTPLT); 564 return *f_pGOTPLT; 565 } 566 getJCR()567 LDSection& getJCR() { 568 assert(NULL != f_pJCR); 569 return *f_pJCR; 570 } 571 getJCR()572 const LDSection& getJCR() const { 573 assert(NULL != f_pJCR); 574 return *f_pJCR; 575 } 576 getNoteABITag()577 LDSection& getNoteABITag() { 578 assert(NULL != f_pNoteABITag); 579 return *f_pNoteABITag; 580 } 581 getNoteABITag()582 const LDSection& getNoteABITag() const { 583 assert(NULL != f_pNoteABITag); 584 return *f_pNoteABITag; 585 } 586 getStab()587 LDSection& getStab() { 588 assert(NULL != f_pStab); 589 return *f_pStab; 590 } 591 getStab()592 const LDSection& getStab() const { 593 assert(NULL != f_pStab); 594 return *f_pStab; 595 } 596 getStabStr()597 LDSection& getStabStr() { 598 assert(NULL != f_pStabStr); 599 return *f_pStabStr; 600 } 601 getStabStr()602 const LDSection& getStabStr() const { 603 assert(NULL != f_pStabStr); 604 return *f_pStabStr; 605 } 606 getStack()607 LDSection& getStack() { 608 assert(NULL != f_pStack); 609 return *f_pStack; 610 } 611 getStack()612 const LDSection& getStack() const { 613 assert(NULL != f_pStack); 614 return *f_pStack; 615 } 616 getStackNote()617 LDSection& getStackNote() { 618 assert(NULL != f_pStackNote); 619 return *f_pStackNote; 620 } 621 getStackNote()622 const LDSection& getStackNote() const { 623 assert(NULL != f_pStackNote); 624 return *f_pStackNote; 625 } 626 getDataRelRoLocal()627 LDSection& getDataRelRoLocal() { 628 assert(NULL != f_pDataRelRoLocal); 629 return *f_pDataRelRoLocal; 630 } 631 getDataRelRoLocal()632 const LDSection& getDataRelRoLocal() const { 633 assert(NULL != f_pDataRelRoLocal); 634 return *f_pDataRelRoLocal; 635 } 636 getGNUHashTab()637 LDSection& getGNUHashTab() { 638 assert(NULL != f_pGNUHashTab); 639 return *f_pGNUHashTab; 640 } 641 getGNUHashTab()642 const LDSection& getGNUHashTab() const { 643 assert(NULL != f_pGNUHashTab); 644 return *f_pGNUHashTab; 645 } 646 647 protected: 648 // variable name : ELF 649 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 650 LDSection* f_pNULLSection; 651 LDSection* f_pGOT; // .got 652 LDSection* f_pPLT; // .plt 653 LDSection* f_pRelDyn; // .rel.dyn 654 LDSection* f_pRelPlt; // .rel.plt 655 LDSection* f_pRelaDyn; // .rela.dyn 656 LDSection* f_pRelaPlt; // .rela.plt 657 658 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 659 LDSection* f_pComment; // .comment 660 LDSection* f_pData1; // .data1 661 LDSection* f_pDebug; // .debug 662 LDSection* f_pDynamic; // .dynamic 663 LDSection* f_pDynStrTab; // .dynstr 664 LDSection* f_pDynSymTab; // .dynsym 665 LDSection* f_pFini; // .fini 666 LDSection* f_pFiniArray; // .fini_array 667 LDSection* f_pHashTab; // .hash 668 LDSection* f_pInit; // .init 669 LDSection* f_pInitArray; // .init_array 670 LDSection* f_pInterp; // .interp 671 LDSection* f_pLine; // .line 672 LDSection* f_pNote; // .note 673 LDSection* f_pPreInitArray; // .preinit_array 674 LDSection* f_pROData1; // .rodata1 675 LDSection* f_pShStrTab; // .shstrtab 676 LDSection* f_pStrTab; // .strtab 677 LDSection* f_pSymTab; // .symtab 678 LDSection* f_pTBSS; // .tbss 679 LDSection* f_pTData; // .tdata 680 681 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 682 LDSection* f_pCtors; // .ctors 683 LDSection* f_pDataRelRo; // .data.rel.ro 684 LDSection* f_pDtors; // .dtors 685 LDSection* f_pEhFrame; // .eh_frame 686 LDSection* f_pEhFrameHdr; // .eh_frame_hdr 687 LDSection* f_pGCCExceptTable; // .gcc_except_table 688 LDSection* f_pGNUVersion; // .gnu.version 689 LDSection* f_pGNUVersionD; // .gnu.version_d 690 LDSection* f_pGNUVersionR; // .gnu.version_r 691 LDSection* f_pGOTPLT; // .got.plt 692 LDSection* f_pJCR; // .jcr 693 LDSection* f_pNoteABITag; // .note.ABI-tag 694 LDSection* f_pStab; // .stab 695 LDSection* f_pStabStr; // .stabstr 696 697 /// practical 698 LDSection* f_pStack; // .stack 699 LDSection* f_pStackNote; // .note.GNU-stack 700 LDSection* f_pDataRelRoLocal; // .data.rel.ro.local 701 LDSection* f_pGNUHashTab; // .gnu.hash 702 }; 703 704 } // namespace of mcld 705 706 #endif 707 708