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