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 // ----- access functions ----- // 175 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 176 LDSection& getNULLSection() { 177 assert(NULL != f_pNULLSection); 178 return *f_pNULLSection; 179 } 180 181 const LDSection& getNULLSection() const { 182 assert(NULL != f_pNULLSection); 183 return *f_pNULLSection; 184 } 185 186 LDSection& getGOT() { 187 assert(NULL != f_pGOT); 188 return *f_pGOT; 189 } 190 191 const LDSection& getGOT() const { 192 assert(NULL != f_pGOT); 193 return *f_pGOT; 194 } 195 196 LDSection& getPLT() { 197 assert(NULL != f_pPLT); 198 return *f_pPLT; 199 } 200 201 const LDSection& getPLT() const { 202 assert(NULL != f_pPLT); 203 return *f_pPLT; 204 } 205 206 LDSection& getRelDyn() { 207 assert(NULL != f_pRelDyn); 208 return *f_pRelDyn; 209 } 210 211 const LDSection& getRelDyn() const { 212 assert(NULL != f_pRelDyn); 213 return *f_pRelDyn; 214 } 215 216 LDSection& getRelPlt() { 217 assert(NULL != f_pRelPlt); 218 return *f_pRelPlt; 219 } 220 221 const LDSection& getRelPlt() const { 222 assert(NULL != f_pRelPlt); 223 return *f_pRelPlt; 224 } 225 226 LDSection& getRelaDyn() { 227 assert(NULL != f_pRelaDyn); 228 return *f_pRelaDyn; 229 } 230 231 const LDSection& getRelaDyn() const { 232 assert(NULL != f_pRelaDyn); 233 return *f_pRelaDyn; 234 } 235 236 LDSection& getRelaPlt() { 237 assert(NULL != f_pRelaPlt); 238 return *f_pRelaPlt; 239 } 240 241 const LDSection& getRelaPlt() const { 242 assert(NULL != f_pRelaPlt); 243 return *f_pRelaPlt; 244 } 245 246 LDSection& getComment() { 247 assert(NULL != f_pComment); 248 return *f_pComment; 249 } 250 251 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 252 const LDSection& getComment() const { 253 assert(NULL != f_pComment); 254 return *f_pComment; 255 } 256 257 LDSection& getData1() { 258 assert(NULL != f_pData1); 259 return *f_pData1; 260 } 261 262 const LDSection& getData1() const { 263 assert(NULL != f_pData1); 264 return *f_pData1; 265 } 266 267 LDSection& getDebug() { 268 assert(NULL != f_pDebug); 269 return *f_pDebug; 270 } 271 272 const LDSection& getDebug() const { 273 assert(NULL != f_pDebug); 274 return *f_pDebug; 275 } 276 277 LDSection& getDynamic() { 278 assert(NULL != f_pDynamic); 279 return *f_pDynamic; 280 } 281 282 const LDSection& getDynamic() const { 283 assert(NULL != f_pDynamic); 284 return *f_pDynamic; 285 } 286 287 LDSection& getDynStrTab() { 288 assert(NULL != f_pDynStrTab); 289 return *f_pDynStrTab; 290 } 291 292 const LDSection& getDynStrTab() const { 293 assert(NULL != f_pDynStrTab); 294 return *f_pDynStrTab; 295 } 296 297 LDSection& getDynSymTab() { 298 assert(NULL != f_pDynSymTab); 299 return *f_pDynSymTab; 300 } 301 302 const LDSection& getDynSymTab() const { 303 assert(NULL != f_pDynSymTab); 304 return *f_pDynSymTab; 305 } 306 307 LDSection& getFini() { 308 assert(NULL != f_pFini); 309 return *f_pFini; 310 } 311 312 const LDSection& getFini() const { 313 assert(NULL != f_pFini); 314 return *f_pFini; 315 } 316 317 LDSection& getFiniArray() { 318 assert(NULL != f_pFiniArray); 319 return *f_pFiniArray; 320 } 321 322 const LDSection& getFiniArray() const { 323 assert(NULL != f_pFiniArray); 324 return *f_pFiniArray; 325 } 326 327 LDSection& getHashTab() { 328 assert(NULL != f_pHashTab); 329 return *f_pHashTab; 330 } 331 332 const LDSection& getHashTab() const { 333 assert(NULL != f_pHashTab); 334 return *f_pHashTab; 335 } 336 337 LDSection& getInit() { 338 assert(NULL != f_pInit); 339 return *f_pInit; 340 } 341 342 const LDSection& getInit() const { 343 assert(NULL != f_pInit); 344 return *f_pInit; 345 } 346 347 LDSection& getInitArray() { 348 assert(NULL != f_pInitArray); 349 return *f_pInitArray; 350 } 351 352 const LDSection& getInitArray() const { 353 assert(NULL != f_pInitArray); 354 return *f_pInitArray; 355 } 356 357 LDSection& getInterp() { 358 assert(NULL != f_pInterp); 359 return *f_pInterp; 360 } 361 362 const LDSection& getInterp() const { 363 assert(NULL != f_pInterp); 364 return *f_pInterp; 365 } 366 367 LDSection& getLine() { 368 assert(NULL != f_pLine); 369 return *f_pLine; 370 } 371 372 const LDSection& getLine() const { 373 assert(NULL != f_pLine); 374 return *f_pLine; 375 } 376 377 LDSection& getNote() { 378 assert(NULL != f_pNote); 379 return *f_pNote; 380 } 381 382 const LDSection& getNote() const { 383 assert(NULL != f_pNote); 384 return *f_pNote; 385 } 386 387 LDSection& getPreInitArray() { 388 assert(NULL != f_pPreInitArray); 389 return *f_pPreInitArray; 390 } 391 392 const LDSection& getPreInitArray() const { 393 assert(NULL != f_pPreInitArray); 394 return *f_pPreInitArray; 395 } 396 397 LDSection& getROData1() { 398 assert(NULL != f_pROData1); 399 return *f_pROData1; 400 } 401 402 const LDSection& getROData1() const { 403 assert(NULL != f_pROData1); 404 return *f_pROData1; 405 } 406 407 LDSection& getShStrTab() { 408 assert(NULL != f_pShStrTab); 409 return *f_pShStrTab; 410 } 411 412 const LDSection& getShStrTab() const { 413 assert(NULL != f_pShStrTab); 414 return *f_pShStrTab; 415 } 416 417 LDSection& getStrTab() { 418 assert(NULL != f_pStrTab); 419 return *f_pStrTab; 420 } 421 422 const LDSection& getStrTab() const { 423 assert(NULL != f_pStrTab); 424 return *f_pStrTab; 425 } 426 427 LDSection& getSymTab() { 428 assert(NULL != f_pSymTab); 429 return *f_pSymTab; 430 } 431 432 const LDSection& getSymTab() const { 433 assert(NULL != f_pSymTab); 434 return *f_pSymTab; 435 } 436 437 LDSection& getTBSS() { 438 assert(NULL != f_pTBSS); 439 return *f_pTBSS; 440 } 441 442 const LDSection& getTBSS() const { 443 assert(NULL != f_pTBSS); 444 return *f_pTBSS; 445 } 446 447 LDSection& getTData() { 448 assert(NULL != f_pTData); 449 return *f_pTData; 450 } 451 452 const LDSection& getTData() const { 453 assert(NULL != f_pTData); 454 return *f_pTData; 455 } 456 457 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 458 LDSection& getCtors() { 459 assert(NULL != f_pCtors); 460 return *f_pCtors; 461 } 462 463 const LDSection& getCtors() const { 464 assert(NULL != f_pCtors); 465 return *f_pCtors; 466 } 467 468 LDSection& getDataRelRo() { 469 assert(NULL != f_pDataRelRo); 470 return *f_pDataRelRo; 471 } 472 473 const LDSection& getDataRelRo() const { 474 assert(NULL != f_pDataRelRo); 475 return *f_pDataRelRo; 476 } 477 478 LDSection& getDtors() { 479 assert(NULL != f_pDtors); 480 return *f_pDtors; 481 } 482 483 const LDSection& getDtors() const { 484 assert(NULL != f_pDtors); 485 return *f_pDtors; 486 } 487 488 LDSection& getEhFrame() { 489 assert(NULL != f_pEhFrame); 490 return *f_pEhFrame; 491 } 492 493 const LDSection& getEhFrame() const { 494 assert(NULL != f_pEhFrame); 495 return *f_pEhFrame; 496 } 497 498 LDSection& getEhFrameHdr() { 499 assert(NULL != f_pEhFrameHdr); 500 return *f_pEhFrameHdr; 501 } 502 503 const LDSection& getEhFrameHdr() const { 504 assert(NULL != f_pEhFrameHdr); 505 return *f_pEhFrameHdr; 506 } 507 508 LDSection& getGCCExceptTable() { 509 assert(NULL != f_pGCCExceptTable); 510 return *f_pGCCExceptTable; 511 } 512 513 const LDSection& getGCCExceptTable() const { 514 assert(NULL != f_pGCCExceptTable); 515 return *f_pGCCExceptTable; 516 } 517 518 LDSection& getGNUVersion() { 519 assert(NULL != f_pGNUVersion); 520 return *f_pGNUVersion; 521 } 522 523 const LDSection& getGNUVersion() const { 524 assert(NULL != f_pGNUVersion); 525 return *f_pGNUVersion; 526 } 527 528 LDSection& getGNUVersionD() { 529 assert(NULL != f_pGNUVersionD); 530 return *f_pGNUVersionD; 531 } 532 533 const LDSection& getGNUVersionD() const { 534 assert(NULL != f_pGNUVersionD); 535 return *f_pGNUVersionD; 536 } 537 538 LDSection& getGNUVersionR() { 539 assert(NULL != f_pGNUVersionR); 540 return *f_pGNUVersionR; 541 } 542 543 const LDSection& getGNUVersionR() const { 544 assert(NULL != f_pGNUVersionR); 545 return *f_pGNUVersionR; 546 } 547 548 LDSection& getGOTPLT() { 549 assert(NULL != f_pGOTPLT); 550 return *f_pGOTPLT; 551 } 552 553 const LDSection& getGOTPLT() const { 554 assert(NULL != f_pGOTPLT); 555 return *f_pGOTPLT; 556 } 557 558 LDSection& getJCR() { 559 assert(NULL != f_pJCR); 560 return *f_pJCR; 561 } 562 563 const LDSection& getJCR() const { 564 assert(NULL != f_pJCR); 565 return *f_pJCR; 566 } 567 568 LDSection& getNoteABITag() { 569 assert(NULL != f_pNoteABITag); 570 return *f_pNoteABITag; 571 } 572 573 const LDSection& getNoteABITag() const { 574 assert(NULL != f_pNoteABITag); 575 return *f_pNoteABITag; 576 } 577 578 LDSection& getStab() { 579 assert(NULL != f_pStab); 580 return *f_pStab; 581 } 582 583 const LDSection& getStab() const { 584 assert(NULL != f_pStab); 585 return *f_pStab; 586 } 587 588 LDSection& getStabStr() { 589 assert(NULL != f_pStabStr); 590 return *f_pStabStr; 591 } 592 593 const LDSection& getStabStr() const { 594 assert(NULL != f_pStabStr); 595 return *f_pStabStr; 596 } 597 598 protected: 599 GNULDBackend& f_Backend; 600 601 // variable name : ELF 602 /// @ref Special Sections, Ch. 4.17, System V ABI, 4th edition. 603 LDSection* f_pNULLSection; 604 LDSection* f_pGOT; // .got 605 LDSection* f_pPLT; // .plt 606 LDSection* f_pRelDyn; // .rel.dyn 607 LDSection* f_pRelPlt; // .rel.plt 608 LDSection* f_pRelaDyn; // .rela.dyn 609 LDSection* f_pRelaPlt; // .rela.plt 610 611 /// @ref 10.3.1.1, ISO/IEC 23360, Part 1:2010(E), p. 21. 612 LDSection* f_pComment; // .comment 613 LDSection* f_pData1; // .data1 614 LDSection* f_pDebug; // .debug 615 LDSection* f_pDynamic; // .dynamic 616 LDSection* f_pDynStrTab; // .dynstr 617 LDSection* f_pDynSymTab; // .dynsym 618 LDSection* f_pFini; // .fini 619 LDSection* f_pFiniArray; // .fini_array 620 LDSection* f_pHashTab; // .hash 621 LDSection* f_pInit; // .init 622 LDSection* f_pInitArray; // .init_array 623 LDSection* f_pInterp; // .interp 624 LDSection* f_pLine; // .line 625 LDSection* f_pNote; // .note 626 LDSection* f_pPreInitArray; // .preinit_array 627 LDSection* f_pROData1; // .rodata1 628 LDSection* f_pShStrTab; // .shstrtab 629 LDSection* f_pStrTab; // .strtab 630 LDSection* f_pSymTab; // .symtab 631 LDSection* f_pTBSS; // .tbss 632 LDSection* f_pTData; // .tdata 633 634 /// @ref 10.3.1.2, ISO/IEC 23360, Part 1:2010(E), p. 24. 635 LDSection* f_pCtors; // .ctors 636 LDSection* f_pDataRelRo; // .data.rel.ro 637 LDSection* f_pDtors; // .dtors 638 LDSection* f_pEhFrame; // .eh_frame 639 LDSection* f_pEhFrameHdr; // .eh_frame_hdr 640 LDSection* f_pGCCExceptTable; // .gcc_except_table 641 LDSection* f_pGNUVersion; // .gnu.version 642 LDSection* f_pGNUVersionD; // .gnu.version_d 643 LDSection* f_pGNUVersionR; // .gnu.version_r 644 LDSection* f_pGOTPLT; // .got.plt 645 LDSection* f_pJCR; // .jcr 646 LDSection* f_pNoteABITag; // .note.ABI-tag 647 LDSection* f_pStab; // .stab 648 LDSection* f_pStabStr; // .stabstr 649 }; 650 651 } // namespace of mcld 652 653 #endif 654