714 lines · cpp
1//===- llvm/BinaryFormat/ELF.cpp - The ELF format ---------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/BinaryFormat/ELF.h"10#include "llvm/ADT/StringSwitch.h"11 12using namespace llvm;13using namespace ELF;14 15/// Convert an architecture name into ELF's e_machine value.16uint16_t ELF::convertArchNameToEMachine(StringRef Arch) {17 std::string LowerArch = Arch.lower();18 return StringSwitch<uint16_t>(LowerArch)19 .Case("none", EM_NONE)20 .Case("m32", EM_M32)21 .Case("sparc", EM_SPARC)22 .Case("386", EM_386)23 .Case("68k", EM_68K)24 .Case("88k", EM_88K)25 .Case("iamcu", EM_IAMCU)26 .Case("860", EM_860)27 .Case("mips", EM_MIPS)28 .Case("s370", EM_S370)29 .Case("mips_rs3_le", EM_MIPS_RS3_LE)30 .Case("parisc", EM_PARISC)31 .Case("vpp500", EM_VPP500)32 .Case("sparc32plus", EM_SPARC32PLUS)33 .Case("960", EM_960)34 .Case("ppc", EM_PPC)35 .Case("ppc64", EM_PPC64)36 .Case("s390", EM_S390)37 .Case("spu", EM_SPU)38 .Case("v800", EM_V800)39 .Case("fr20", EM_FR20)40 .Case("rh32", EM_RH32)41 .Case("rce", EM_RCE)42 .Case("arm", EM_ARM)43 .Case("alpha", EM_ALPHA)44 .Case("sh", EM_SH)45 .Case("sparcv9", EM_SPARCV9)46 .Case("tricore", EM_TRICORE)47 .Case("arc", EM_ARC)48 .Case("h8_300", EM_H8_300)49 .Case("h8_300h", EM_H8_300H)50 .Case("h8s", EM_H8S)51 .Case("h8_500", EM_H8_500)52 .Case("ia_64", EM_IA_64)53 .Case("mips_x", EM_MIPS_X)54 .Case("coldfire", EM_COLDFIRE)55 .Case("68hc12", EM_68HC12)56 .Case("mma", EM_MMA)57 .Case("pcp", EM_PCP)58 .Case("ncpu", EM_NCPU)59 .Case("ndr1", EM_NDR1)60 .Case("starcore", EM_STARCORE)61 .Case("me16", EM_ME16)62 .Case("st100", EM_ST100)63 .Case("tinyj", EM_TINYJ)64 .Case("x86_64", EM_X86_64)65 .Case("pdsp", EM_PDSP)66 .Case("pdp10", EM_PDP10)67 .Case("pdp11", EM_PDP11)68 .Case("fx66", EM_FX66)69 .Case("st9plus", EM_ST9PLUS)70 .Case("st7", EM_ST7)71 .Case("68hc16", EM_68HC16)72 .Case("68hc11", EM_68HC11)73 .Case("68hc08", EM_68HC08)74 .Case("68hc05", EM_68HC05)75 .Case("svx", EM_SVX)76 .Case("st19", EM_ST19)77 .Case("vax", EM_VAX)78 .Case("cris", EM_CRIS)79 .Case("javelin", EM_JAVELIN)80 .Case("firepath", EM_FIREPATH)81 .Case("zsp", EM_ZSP)82 .Case("mmix", EM_MMIX)83 .Case("huany", EM_HUANY)84 .Case("prism", EM_PRISM)85 .Case("avr", EM_AVR)86 .Case("fr30", EM_FR30)87 .Case("d10v", EM_D10V)88 .Case("d30v", EM_D30V)89 .Case("v850", EM_V850)90 .Case("m32r", EM_M32R)91 .Case("mn10300", EM_MN10300)92 .Case("mn10200", EM_MN10200)93 .Case("pj", EM_PJ)94 .Case("openrisc", EM_OPENRISC)95 .Case("arc_compact", EM_ARC_COMPACT)96 .Case("xtensa", EM_XTENSA)97 .Case("videocore", EM_VIDEOCORE)98 .Case("tmm_gpp", EM_TMM_GPP)99 .Case("ns32k", EM_NS32K)100 .Case("tpc", EM_TPC)101 .Case("snp1k", EM_SNP1K)102 .Case("st200", EM_ST200)103 .Case("ip2k", EM_IP2K)104 .Case("max", EM_MAX)105 .Case("cr", EM_CR)106 .Case("f2mc16", EM_F2MC16)107 .Case("msp430", EM_MSP430)108 .Case("blackfin", EM_BLACKFIN)109 .Case("se_c33", EM_SE_C33)110 .Case("sep", EM_SEP)111 .Case("arca", EM_ARCA)112 .Case("unicore", EM_UNICORE)113 .Case("excess", EM_EXCESS)114 .Case("dxp", EM_DXP)115 .Case("altera_nios2", EM_ALTERA_NIOS2)116 .Case("crx", EM_CRX)117 .Case("xgate", EM_XGATE)118 .Case("c166", EM_C166)119 .Case("m16c", EM_M16C)120 .Case("dspic30f", EM_DSPIC30F)121 .Case("ce", EM_CE)122 .Case("m32c", EM_M32C)123 .Case("tsk3000", EM_TSK3000)124 .Case("rs08", EM_RS08)125 .Case("sharc", EM_SHARC)126 .Case("ecog2", EM_ECOG2)127 .Case("score7", EM_SCORE7)128 .Case("dsp24", EM_DSP24)129 .Case("videocore3", EM_VIDEOCORE3)130 .Case("latticemico32", EM_LATTICEMICO32)131 .Case("se_c17", EM_SE_C17)132 .Case("ti_c6000", EM_TI_C6000)133 .Case("ti_c2000", EM_TI_C2000)134 .Case("ti_c5500", EM_TI_C5500)135 .Case("mmdsp_plus", EM_MMDSP_PLUS)136 .Case("cypress_m8c", EM_CYPRESS_M8C)137 .Case("r32c", EM_R32C)138 .Case("trimedia", EM_TRIMEDIA)139 .Case("hexagon", EM_HEXAGON)140 .Case("8051", EM_8051)141 .Case("stxp7x", EM_STXP7X)142 .Case("nds32", EM_NDS32)143 .Case("ecog1", EM_ECOG1)144 .Case("ecog1x", EM_ECOG1X)145 .Case("maxq30", EM_MAXQ30)146 .Case("ximo16", EM_XIMO16)147 .Case("manik", EM_MANIK)148 .Case("craynv2", EM_CRAYNV2)149 .Case("rx", EM_RX)150 .Case("metag", EM_METAG)151 .Case("mcst_elbrus", EM_MCST_ELBRUS)152 .Case("ecog16", EM_ECOG16)153 .Case("cr16", EM_CR16)154 .Case("etpu", EM_ETPU)155 .Case("sle9x", EM_SLE9X)156 .Case("l10m", EM_L10M)157 .Case("k10m", EM_K10M)158 .Case("aarch64", EM_AARCH64)159 .Case("avr32", EM_AVR32)160 .Case("stm8", EM_STM8)161 .Case("tile64", EM_TILE64)162 .Case("tilepro", EM_TILEPRO)163 .Case("cuda", EM_CUDA)164 .Case("tilegx", EM_TILEGX)165 .Case("cloudshield", EM_CLOUDSHIELD)166 .Case("corea_1st", EM_COREA_1ST)167 .Case("corea_2nd", EM_COREA_2ND)168 .Case("arc_compact2", EM_ARC_COMPACT2)169 .Case("open8", EM_OPEN8)170 .Case("rl78", EM_RL78)171 .Case("videocore5", EM_VIDEOCORE5)172 .Case("78kor", EM_78KOR)173 .Case("56800ex", EM_56800EX)174 .Case("ba1", EM_BA1)175 .Case("ba2", EM_BA2)176 .Case("xcore", EM_XCORE)177 .Case("mchp_pic", EM_MCHP_PIC)178 .Case("intelgt", EM_INTELGT)179 .Case("intel206", EM_INTEL206)180 .Case("intel207", EM_INTEL207)181 .Case("intel208", EM_INTEL208)182 .Case("intel209", EM_INTEL209)183 .Case("km32", EM_KM32)184 .Case("kmx32", EM_KMX32)185 .Case("kmx16", EM_KMX16)186 .Case("kmx8", EM_KMX8)187 .Case("kvarc", EM_KVARC)188 .Case("cdp", EM_CDP)189 .Case("coge", EM_COGE)190 .Case("cool", EM_COOL)191 .Case("norc", EM_NORC)192 .Case("csr_kalimba", EM_CSR_KALIMBA)193 .Case("amdgpu", EM_AMDGPU)194 .Case("riscv", EM_RISCV)195 .Case("lanai", EM_LANAI)196 .Case("bpf", EM_BPF)197 .Case("ve", EM_VE)198 .Case("csky", EM_CSKY)199 .Case("loongarch", EM_LOONGARCH)200 .Default(EM_NONE);201}202 203uint16_t ELF::convertTripleArchTypeToEMachine(Triple::ArchType ArchType) {204 switch (ArchType) {205 case Triple::UnknownArch:206 default:207 return EM_NONE;208 209 case Triple::arm:210 case Triple::armeb:211 case Triple::thumb:212 case Triple::thumbeb:213 return EM_ARM;214 case Triple::aarch64:215 case Triple::aarch64_be:216 case Triple::aarch64_32:217 return EM_AARCH64;218 case Triple::arc:219 return EM_ARC;220 case Triple::avr:221 return EM_AVR;222 case Triple::bpfel:223 case Triple::bpfeb:224 return EM_BPF;225 case Triple::csky:226 return EM_CSKY;227 case Triple::hexagon:228 return EM_HEXAGON;229 case Triple::loongarch32:230 case Triple::loongarch64:231 return EM_LOONGARCH;232 case Triple::m68k:233 return EM_68K;234 case Triple::mips:235 case Triple::mipsel:236 case Triple::mips64:237 case Triple::mips64el:238 return EM_MIPS;239 case Triple::msp430:240 return EM_MSP430;241 case Triple::ppc:242 case Triple::ppcle:243 return EM_PPC;244 case Triple::ppc64:245 case Triple::ppc64le:246 return EM_PPC;247 case Triple::riscv32:248 case Triple::riscv64:249 return EM_RISCV;250 case Triple::sparc:251 case Triple::sparcel:252 return EM_SPARC;253 case Triple::sparcv9:254 return EM_SPARCV9;255 case Triple::systemz:256 return EM_S390;257 case Triple::x86:258 return EM_386;259 case Triple::x86_64:260 return EM_X86_64;261 case Triple::xcore:262 return EM_XCORE;263 case Triple::xtensa:264 return EM_XTENSA;265 }266}267 268/// Convert an ELF's e_machine value into an architecture name.269StringRef ELF::convertEMachineToArchName(uint16_t EMachine) {270 switch (EMachine) {271 case EM_NONE:272 return "None";273 case EM_M32:274 return "m32";275 case EM_SPARC:276 return "sparc";277 case EM_386:278 return "386";279 case EM_68K:280 return "68k";281 case EM_88K:282 return "88k";283 case EM_IAMCU:284 return "iamcu";285 case EM_860:286 return "860";287 case EM_MIPS:288 return "mips";289 case EM_S370:290 return "s370";291 case EM_MIPS_RS3_LE:292 return "mips_rs3_le";293 case EM_PARISC:294 return "parisc";295 case EM_VPP500:296 return "vpp500";297 case EM_SPARC32PLUS:298 return "sparc32plus";299 case EM_960:300 return "960";301 case EM_PPC:302 return "ppc";303 case EM_PPC64:304 return "ppc64";305 case EM_S390:306 return "s390";307 case EM_SPU:308 return "spu";309 case EM_V800:310 return "v800";311 case EM_FR20:312 return "fr20";313 case EM_RH32:314 return "rh32";315 case EM_RCE:316 return "rce";317 case EM_ARM:318 return "arm";319 case EM_ALPHA:320 return "alpha";321 case EM_SH:322 return "sh";323 case EM_SPARCV9:324 return "sparcv9";325 case EM_TRICORE:326 return "tricore";327 case EM_ARC:328 return "arc";329 case EM_H8_300:330 return "h8_300";331 case EM_H8_300H:332 return "h8_300h";333 case EM_H8S:334 return "h8s";335 case EM_H8_500:336 return "h8_500";337 case EM_IA_64:338 return "ia_64";339 case EM_MIPS_X:340 return "mips_x";341 case EM_COLDFIRE:342 return "coldfire";343 case EM_68HC12:344 return "68hc12";345 case EM_MMA:346 return "mma";347 case EM_PCP:348 return "pcp";349 case EM_NCPU:350 return "ncpu";351 case EM_NDR1:352 return "ndr1";353 case EM_STARCORE:354 return "starcore";355 case EM_ME16:356 return "me16";357 case EM_ST100:358 return "st100";359 case EM_TINYJ:360 return "tinyj";361 case EM_X86_64:362 return "x86_64";363 case EM_PDSP:364 return "pdsp";365 case EM_PDP10:366 return "pdp10";367 case EM_PDP11:368 return "pdp11";369 case EM_FX66:370 return "fx66";371 case EM_ST9PLUS:372 return "st9plus";373 case EM_ST7:374 return "st7";375 case EM_68HC16:376 return "68hc16";377 case EM_68HC11:378 return "68hc11";379 case EM_68HC08:380 return "68hc08";381 case EM_68HC05:382 return "68hc05";383 case EM_SVX:384 return "svx";385 case EM_ST19:386 return "st19";387 case EM_VAX:388 return "vax";389 case EM_CRIS:390 return "cris";391 case EM_JAVELIN:392 return "javelin";393 case EM_FIREPATH:394 return "firepath";395 case EM_ZSP:396 return "zsp";397 case EM_MMIX:398 return "mmix";399 case EM_HUANY:400 return "huany";401 case EM_PRISM:402 return "prism";403 case EM_AVR:404 return "avr";405 case EM_FR30:406 return "fr30";407 case EM_D10V:408 return "d10v";409 case EM_D30V:410 return "d30v";411 case EM_V850:412 return "v850";413 case EM_M32R:414 return "m32r";415 case EM_MN10300:416 return "mn10300";417 case EM_MN10200:418 return "mn10200";419 case EM_PJ:420 return "pj";421 case EM_OPENRISC:422 return "openrisc";423 case EM_ARC_COMPACT:424 return "arc_compact";425 case EM_XTENSA:426 return "xtensa";427 case EM_VIDEOCORE:428 return "videocore";429 case EM_TMM_GPP:430 return "tmm_gpp";431 case EM_NS32K:432 return "ns32k";433 case EM_TPC:434 return "tpc";435 case EM_SNP1K:436 return "snp1k";437 case EM_ST200:438 return "st200";439 case EM_IP2K:440 return "ip2k";441 case EM_MAX:442 return "max";443 case EM_CR:444 return "cr";445 case EM_F2MC16:446 return "f2mc16";447 case EM_MSP430:448 return "msp430";449 case EM_BLACKFIN:450 return "blackfin";451 case EM_SE_C33:452 return "se_c33";453 case EM_SEP:454 return "sep";455 case EM_ARCA:456 return "arca";457 case EM_UNICORE:458 return "unicore";459 case EM_EXCESS:460 return "excess";461 case EM_DXP:462 return "dxp";463 case EM_ALTERA_NIOS2:464 return "altera_nios2";465 case EM_CRX:466 return "crx";467 case EM_XGATE:468 return "xgate";469 case EM_C166:470 return "c166";471 case EM_M16C:472 return "m16c";473 case EM_DSPIC30F:474 return "dspic30f";475 case EM_CE:476 return "ce";477 case EM_M32C:478 return "m32c";479 case EM_TSK3000:480 return "tsk3000";481 case EM_RS08:482 return "rs08";483 case EM_SHARC:484 return "sharc";485 case EM_ECOG2:486 return "ecog2";487 case EM_SCORE7:488 return "score7";489 case EM_DSP24:490 return "dsp24";491 case EM_VIDEOCORE3:492 return "videocore3";493 case EM_LATTICEMICO32:494 return "latticemico32";495 case EM_SE_C17:496 return "se_c17";497 case EM_TI_C6000:498 return "ti_c6000";499 case EM_TI_C2000:500 return "ti_c2000";501 case EM_TI_C5500:502 return "ti_c5500";503 case EM_MMDSP_PLUS:504 return "mmdsp_plus";505 case EM_CYPRESS_M8C:506 return "cypress_m8c";507 case EM_R32C:508 return "r32c";509 case EM_TRIMEDIA:510 return "trimedia";511 case EM_HEXAGON:512 return "hexagon";513 case EM_8051:514 return "8051";515 case EM_STXP7X:516 return "stxp7x";517 case EM_NDS32:518 return "nds32";519 case EM_ECOG1:520 return "ecog1";521 case EM_MAXQ30:522 return "maxq30";523 case EM_XIMO16:524 return "ximo16";525 case EM_MANIK:526 return "manik";527 case EM_CRAYNV2:528 return "craynv2";529 case EM_RX:530 return "rx";531 case EM_METAG:532 return "metag";533 case EM_MCST_ELBRUS:534 return "mcst_elbrus";535 case EM_ECOG16:536 return "ecog16";537 case EM_CR16:538 return "cr16";539 case EM_ETPU:540 return "etpu";541 case EM_SLE9X:542 return "sle9x";543 case EM_L10M:544 return "l10m";545 case EM_K10M:546 return "k10m";547 case EM_AARCH64:548 return "AArch64";549 case EM_AVR32:550 return "avr32";551 case EM_STM8:552 return "stm8";553 case EM_TILE64:554 return "tile64";555 case EM_TILEPRO:556 return "tilepro";557 case EM_CUDA:558 return "cuda";559 case EM_TILEGX:560 return "tilegx";561 case EM_CLOUDSHIELD:562 return "cloudshield";563 case EM_COREA_1ST:564 return "corea_1st";565 case EM_COREA_2ND:566 return "corea_2nd";567 case EM_ARC_COMPACT2:568 return "arc_compact2";569 case EM_OPEN8:570 return "open8";571 case EM_RL78:572 return "rl78";573 case EM_VIDEOCORE5:574 return "videocore5";575 case EM_78KOR:576 return "78kor";577 case EM_56800EX:578 return "56800ex";579 case EM_BA1:580 return "ba1";581 case EM_BA2:582 return "ba2";583 case EM_XCORE:584 return "xcore";585 case EM_MCHP_PIC:586 return "mchp_pic";587 case EM_INTELGT:588 return "intelgt";589 case EM_INTEL206:590 return "intel206";591 case EM_INTEL207:592 return "intel207";593 case EM_INTEL208:594 return "intel208";595 case EM_INTEL209:596 return "intel209";597 case EM_KM32:598 return "km32";599 case EM_KMX32:600 return "kmx32";601 case EM_KMX16:602 return "kmx16";603 case EM_KMX8:604 return "kmx8";605 case EM_KVARC:606 return "kvarc";607 case EM_CDP:608 return "cdp";609 case EM_COGE:610 return "coge";611 case EM_COOL:612 return "cool";613 case EM_NORC:614 return "norc";615 case EM_CSR_KALIMBA:616 return "csr_kalimba";617 case EM_AMDGPU:618 return "amdgpu";619 case EM_RISCV:620 return "riscv";621 case EM_LANAI:622 return "lanai";623 case EM_BPF:624 return "bpf";625 case EM_VE:626 return "ve";627 case EM_CSKY:628 return "csky";629 case EM_LOONGARCH:630 return "loongarch";631 default:632 return "None";633 }634}635 636uint8_t ELF::convertNameToOSABI(StringRef Name) {637 return StringSwitch<uint16_t>(Name)638 .StartsWith("hpux", ELFOSABI_HPUX)639 .StartsWith("netbsd", ELFOSABI_NETBSD)640 .StartsWith("gnu", ELFOSABI_GNU)641 .StartsWith("hurd", ELFOSABI_HURD)642 .StartsWith("solaris", ELFOSABI_SOLARIS)643 .StartsWith("aix", ELFOSABI_AIX)644 .StartsWith("irix", ELFOSABI_IRIX)645 .StartsWith("freebsd", ELFOSABI_FREEBSD)646 .StartsWith("tru64", ELFOSABI_TRU64)647 .StartsWith("modesto", ELFOSABI_MODESTO)648 .StartsWith("openbsd", ELFOSABI_OPENBSD)649 .StartsWith("openvms", ELFOSABI_OPENVMS)650 .StartsWith("nsk", ELFOSABI_NSK)651 .StartsWith("aros", ELFOSABI_AROS)652 .StartsWith("fenixos", ELFOSABI_FENIXOS)653 .StartsWith("cloudabi", ELFOSABI_CLOUDABI)654 .StartsWith("cuda", ELFOSABI_CUDA)655 .StartsWith("amdhsa", ELFOSABI_AMDGPU_HSA)656 .StartsWith("amdpal", ELFOSABI_AMDGPU_PAL)657 .StartsWith("mesa3d", ELFOSABI_AMDGPU_MESA3D)658 .StartsWith("arm", ELFOSABI_ARM)659 .StartsWith("standalone", ELFOSABI_STANDALONE)660 .StartsWith("none", ELFOSABI_NONE)661 .Default(ELFOSABI_NONE);662}663 664StringRef ELF::convertOSABIToName(uint8_t OSABI) {665 switch (OSABI) {666 case ELFOSABI_HPUX:667 return "hpux";668 case ELFOSABI_NETBSD:669 return "netbsd";670 case ELFOSABI_GNU:671 return "gnu";672 case ELFOSABI_HURD:673 return "hurd";674 case ELFOSABI_SOLARIS:675 return "solaris";676 case ELFOSABI_AIX:677 return "aix";678 case ELFOSABI_IRIX:679 return "irix";680 case ELFOSABI_FREEBSD:681 return "freebsd";682 case ELFOSABI_TRU64:683 return "tru64";684 case ELFOSABI_MODESTO:685 return "modesto";686 case ELFOSABI_OPENBSD:687 return "openbsd";688 case ELFOSABI_OPENVMS:689 return "openvms";690 case ELFOSABI_NSK:691 return "nsk";692 case ELFOSABI_AROS:693 return "aros";694 case ELFOSABI_FENIXOS:695 return "fenixos";696 case ELFOSABI_CLOUDABI:697 return "cloudabi";698 case ELFOSABI_CUDA:699 return "cuda";700 case ELFOSABI_AMDGPU_HSA:701 return "amdhsa";702 case ELFOSABI_AMDGPU_PAL:703 return "amdpal";704 case ELFOSABI_AMDGPU_MESA3D:705 return "mesa3d";706 case ELFOSABI_ARM:707 return "arm";708 case ELFOSABI_STANDALONE:709 return "standalone";710 default:711 return "none";712 }713}714