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