399 lines · cpp
1//===- ELFTest.cpp - Tests for ELF.cpp ------------------------------------===//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/Object/ELF.h"10#include "llvm/Object/ELFObjectFile.h"11#include "llvm/ObjectYAML/yaml2obj.h"12#include "llvm/Support/Error.h"13#include "llvm/Support/YAMLTraits.h"14#include "llvm/Testing/Support/Error.h"15#include "gtest/gtest.h"16 17using namespace llvm;18using namespace llvm::object;19using namespace llvm::ELF;20 21TEST(ELFTest, getELFRelocationTypeNameForVE) {22 EXPECT_EQ("R_VE_NONE", getELFRelocationTypeName(EM_VE, R_VE_NONE));23 EXPECT_EQ("R_VE_REFLONG", getELFRelocationTypeName(EM_VE, R_VE_REFLONG));24 EXPECT_EQ("R_VE_REFQUAD", getELFRelocationTypeName(EM_VE, R_VE_REFQUAD));25 EXPECT_EQ("R_VE_SREL32", getELFRelocationTypeName(EM_VE, R_VE_SREL32));26 EXPECT_EQ("R_VE_HI32", getELFRelocationTypeName(EM_VE, R_VE_HI32));27 EXPECT_EQ("R_VE_LO32", getELFRelocationTypeName(EM_VE, R_VE_LO32));28 EXPECT_EQ("R_VE_PC_HI32", getELFRelocationTypeName(EM_VE, R_VE_PC_HI32));29 EXPECT_EQ("R_VE_PC_LO32", getELFRelocationTypeName(EM_VE, R_VE_PC_LO32));30 EXPECT_EQ("R_VE_GOT32", getELFRelocationTypeName(EM_VE, R_VE_GOT32));31 EXPECT_EQ("R_VE_GOT_HI32", getELFRelocationTypeName(EM_VE, R_VE_GOT_HI32));32 EXPECT_EQ("R_VE_GOT_LO32", getELFRelocationTypeName(EM_VE, R_VE_GOT_LO32));33 EXPECT_EQ("R_VE_GOTOFF32", getELFRelocationTypeName(EM_VE, R_VE_GOTOFF32));34 EXPECT_EQ("R_VE_GOTOFF_HI32",35 getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_HI32));36 EXPECT_EQ("R_VE_GOTOFF_LO32",37 getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_LO32));38 EXPECT_EQ("R_VE_PLT32", getELFRelocationTypeName(EM_VE, R_VE_PLT32));39 EXPECT_EQ("R_VE_PLT_HI32", getELFRelocationTypeName(EM_VE, R_VE_PLT_HI32));40 EXPECT_EQ("R_VE_PLT_LO32", getELFRelocationTypeName(EM_VE, R_VE_PLT_LO32));41 EXPECT_EQ("R_VE_RELATIVE", getELFRelocationTypeName(EM_VE, R_VE_RELATIVE));42 EXPECT_EQ("R_VE_GLOB_DAT", getELFRelocationTypeName(EM_VE, R_VE_GLOB_DAT));43 EXPECT_EQ("R_VE_JUMP_SLOT", getELFRelocationTypeName(EM_VE, R_VE_JUMP_SLOT));44 EXPECT_EQ("R_VE_COPY", getELFRelocationTypeName(EM_VE, R_VE_COPY));45 EXPECT_EQ("R_VE_DTPMOD64", getELFRelocationTypeName(EM_VE, R_VE_DTPMOD64));46 EXPECT_EQ("R_VE_DTPOFF64", getELFRelocationTypeName(EM_VE, R_VE_DTPOFF64));47 EXPECT_EQ("R_VE_TLS_GD_HI32",48 getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_HI32));49 EXPECT_EQ("R_VE_TLS_GD_LO32",50 getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_LO32));51 EXPECT_EQ("R_VE_TPOFF_HI32",52 getELFRelocationTypeName(EM_VE, R_VE_TPOFF_HI32));53 EXPECT_EQ("R_VE_TPOFF_LO32",54 getELFRelocationTypeName(EM_VE, R_VE_TPOFF_LO32));55 EXPECT_EQ("R_VE_CALL_HI32", getELFRelocationTypeName(EM_VE, R_VE_CALL_HI32));56 EXPECT_EQ("R_VE_CALL_LO32", getELFRelocationTypeName(EM_VE, R_VE_CALL_LO32));57}58 59TEST(ELFTest, getELFRelocationTypeNameForLoongArch) {60 EXPECT_EQ("R_LARCH_NONE",61 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_NONE));62 EXPECT_EQ("R_LARCH_32", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32));63 EXPECT_EQ("R_LARCH_64", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64));64 EXPECT_EQ("R_LARCH_RELATIVE",65 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELATIVE));66 EXPECT_EQ("R_LARCH_COPY",67 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_COPY));68 EXPECT_EQ("R_LARCH_JUMP_SLOT",69 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_JUMP_SLOT));70 EXPECT_EQ("R_LARCH_TLS_DTPMOD32",71 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD32));72 EXPECT_EQ("R_LARCH_TLS_DTPMOD64",73 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD64));74 EXPECT_EQ("R_LARCH_TLS_DTPREL32",75 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL32));76 EXPECT_EQ("R_LARCH_TLS_DTPREL64",77 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL64));78 EXPECT_EQ("R_LARCH_TLS_TPREL32",79 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL32));80 EXPECT_EQ("R_LARCH_TLS_TPREL64",81 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL64));82 EXPECT_EQ("R_LARCH_IRELATIVE",83 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_IRELATIVE));84 85 EXPECT_EQ("R_LARCH_MARK_LA",86 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_LA));87 EXPECT_EQ("R_LARCH_MARK_PCREL",88 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_PCREL));89 EXPECT_EQ("R_LARCH_SOP_PUSH_PCREL",90 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PCREL));91 EXPECT_EQ("R_LARCH_SOP_PUSH_ABSOLUTE",92 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_ABSOLUTE));93 EXPECT_EQ("R_LARCH_SOP_PUSH_DUP",94 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_DUP));95 EXPECT_EQ("R_LARCH_SOP_PUSH_GPREL",96 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_GPREL));97 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_TPREL",98 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_TPREL));99 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GOT",100 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GOT));101 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GD",102 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GD));103 EXPECT_EQ("R_LARCH_SOP_PUSH_PLT_PCREL",104 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PLT_PCREL));105 EXPECT_EQ("R_LARCH_SOP_ASSERT",106 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ASSERT));107 EXPECT_EQ("R_LARCH_SOP_NOT",108 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_NOT));109 EXPECT_EQ("R_LARCH_SOP_SUB",110 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SUB));111 EXPECT_EQ("R_LARCH_SOP_SL",112 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SL));113 EXPECT_EQ("R_LARCH_SOP_SR",114 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SR));115 EXPECT_EQ("R_LARCH_SOP_ADD",116 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ADD));117 EXPECT_EQ("R_LARCH_SOP_AND",118 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_AND));119 EXPECT_EQ("R_LARCH_SOP_IF_ELSE",120 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_IF_ELSE));121 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_5",122 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_5));123 EXPECT_EQ("R_LARCH_SOP_POP_32_U_10_12",124 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U_10_12));125 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_12",126 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_12));127 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_16",128 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16));129 EXPECT_EQ(130 "R_LARCH_SOP_POP_32_S_10_16_S2",131 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16_S2));132 EXPECT_EQ("R_LARCH_SOP_POP_32_S_5_20",133 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_5_20));134 EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_5_10_16_S2",135 getELFRelocationTypeName(EM_LOONGARCH,136 R_LARCH_SOP_POP_32_S_0_5_10_16_S2));137 EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_10_10_16_S2",138 getELFRelocationTypeName(EM_LOONGARCH,139 R_LARCH_SOP_POP_32_S_0_10_10_16_S2));140 EXPECT_EQ("R_LARCH_SOP_POP_32_U",141 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U));142 EXPECT_EQ("R_LARCH_ADD8",143 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD8));144 EXPECT_EQ("R_LARCH_ADD16",145 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD16));146 EXPECT_EQ("R_LARCH_ADD24",147 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD24));148 EXPECT_EQ("R_LARCH_ADD32",149 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD32));150 EXPECT_EQ("R_LARCH_ADD64",151 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD64));152 EXPECT_EQ("R_LARCH_SUB8",153 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB8));154 EXPECT_EQ("R_LARCH_SUB16",155 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB16));156 EXPECT_EQ("R_LARCH_SUB24",157 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB24));158 EXPECT_EQ("R_LARCH_SUB32",159 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB32));160 EXPECT_EQ("R_LARCH_SUB64",161 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB64));162 EXPECT_EQ("R_LARCH_GNU_VTINHERIT",163 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTINHERIT));164 EXPECT_EQ("R_LARCH_GNU_VTENTRY",165 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTENTRY));166 EXPECT_EQ("R_LARCH_B16",167 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B16));168 EXPECT_EQ("R_LARCH_B21",169 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B21));170 EXPECT_EQ("R_LARCH_B26",171 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B26));172 EXPECT_EQ("R_LARCH_ABS_HI20",173 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_HI20));174 EXPECT_EQ("R_LARCH_ABS_LO12",175 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_LO12));176 EXPECT_EQ("R_LARCH_ABS64_LO20",177 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_LO20));178 EXPECT_EQ("R_LARCH_ABS64_HI12",179 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_HI12));180 EXPECT_EQ("R_LARCH_PCALA_HI20",181 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_HI20));182 EXPECT_EQ("R_LARCH_PCALA_LO12",183 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_LO12));184 EXPECT_EQ("R_LARCH_PCALA64_LO20",185 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_LO20));186 EXPECT_EQ("R_LARCH_PCALA64_HI12",187 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_HI12));188 EXPECT_EQ("R_LARCH_GOT_PC_HI20",189 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_HI20));190 EXPECT_EQ("R_LARCH_GOT_PC_LO12",191 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_LO12));192 EXPECT_EQ("R_LARCH_GOT64_PC_LO20",193 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_LO20));194 EXPECT_EQ("R_LARCH_GOT64_PC_HI12",195 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_HI12));196 EXPECT_EQ("R_LARCH_GOT_HI20",197 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_HI20));198 EXPECT_EQ("R_LARCH_GOT_LO12",199 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_LO12));200 EXPECT_EQ("R_LARCH_GOT64_LO20",201 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_LO20));202 EXPECT_EQ("R_LARCH_GOT64_HI12",203 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_HI12));204 EXPECT_EQ("R_LARCH_TLS_LE_HI20",205 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_HI20));206 EXPECT_EQ("R_LARCH_TLS_LE_LO12",207 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_LO12));208 EXPECT_EQ("R_LARCH_TLS_LE64_LO20",209 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_LO20));210 EXPECT_EQ("R_LARCH_TLS_LE64_HI12",211 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_HI12));212 EXPECT_EQ("R_LARCH_TLS_IE_PC_HI20",213 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_HI20));214 EXPECT_EQ("R_LARCH_TLS_IE_PC_LO12",215 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_LO12));216 EXPECT_EQ("R_LARCH_TLS_IE64_PC_LO20",217 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_LO20));218 EXPECT_EQ("R_LARCH_TLS_IE64_PC_HI12",219 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_HI12));220 EXPECT_EQ("R_LARCH_TLS_IE_HI20",221 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_HI20));222 EXPECT_EQ("R_LARCH_TLS_IE_LO12",223 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_LO12));224 EXPECT_EQ("R_LARCH_TLS_IE64_LO20",225 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_LO20));226 EXPECT_EQ("R_LARCH_TLS_IE64_HI12",227 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_HI12));228 EXPECT_EQ("R_LARCH_TLS_LD_PC_HI20",229 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_PC_HI20));230 EXPECT_EQ("R_LARCH_TLS_LD_HI20",231 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_HI20));232 EXPECT_EQ("R_LARCH_TLS_GD_PC_HI20",233 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_PC_HI20));234 EXPECT_EQ("R_LARCH_TLS_GD_HI20",235 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_HI20));236 EXPECT_EQ("R_LARCH_32_PCREL",237 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32_PCREL));238 EXPECT_EQ("R_LARCH_RELAX",239 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELAX));240 EXPECT_EQ("R_LARCH_ALIGN",241 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ALIGN));242 EXPECT_EQ("R_LARCH_PCREL20_S2",243 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCREL20_S2));244 EXPECT_EQ("R_LARCH_ADD6",245 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD6));246 EXPECT_EQ("R_LARCH_SUB6",247 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB6));248 EXPECT_EQ("R_LARCH_ADD_ULEB128",249 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD_ULEB128));250 EXPECT_EQ("R_LARCH_SUB_ULEB128",251 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB_ULEB128));252 EXPECT_EQ("R_LARCH_64_PCREL",253 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64_PCREL));254 EXPECT_EQ("R_LARCH_CALL36",255 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_CALL36));256}257 258TEST(ELFTest, getRISCVVendorRelocationTypeName) {259 EXPECT_EQ("R_RISCV_QC_ABS20_U",260 getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM192, "QUALCOMM"));261 EXPECT_EQ("R_RISCV_QC_E_BRANCH",262 getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM193, "QUALCOMM"));263 EXPECT_EQ("R_RISCV_QC_E_32",264 getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM194, "QUALCOMM"));265 EXPECT_EQ("R_RISCV_QC_E_CALL_PLT",266 getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM195, "QUALCOMM"));267 268 EXPECT_EQ("R_RISCV_NDS_BRANCH_10",269 getRISCVVendorRelocationTypeName(R_RISCV_CUSTOM241, "ANDES"));270}271 272TEST(ELFTest, getELFRelativeRelocationType) {273 EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE));274 EXPECT_EQ(ELF::R_LARCH_RELATIVE, getELFRelativeRelocationType(EM_LOONGARCH));275}276 277// This is a test for the DataRegion helper struct, defined in ELF.h header.278TEST(ELFTest, DataRegionTest) {279 std::vector<uint8_t> Data = {0, 1, 2};280 281 // Used to check that the operator[] works properly.282 auto CheckOperator = [&](DataRegion<uint8_t> &R) {283 for (size_t I = 0, E = Data.size(); I != E; ++I) {284 Expected<uint8_t> ValOrErr = R[I];285 ASSERT_THAT_EXPECTED(ValOrErr, Succeeded());286 EXPECT_EQ(*ValOrErr, I);287 }288 };289 290 // Check we can use the constructor that takes an ArrayRef<T>.291 DataRegion<uint8_t> Region(Data);292 293 CheckOperator(Region);294 const char *ErrMsg1 =295 "the index is greater than or equal to the number of entries (3)";296 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg1));297 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg1));298 299 // Check we can use the constructor that takes the data begin and the300 // data end pointers.301 Region = {Data.data(), Data.data() + Data.size()};302 303 CheckOperator(Region);304 const char *ErrMsg2 = "can't read past the end of the file";305 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg2));306 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg2));307}308 309// Test the sysV and the gnu hash functions, particularly with UTF-8 unicode.310// Use names long enough for the hash's recycling of the high bits to kick in.311// Explicitly encode the UTF-8 to avoid encoding transliterations.312TEST(ELFTest, Hash) {313 EXPECT_EQ(hashSysV("FooBarBazToto"), 0x5ec3e8fU);314 EXPECT_EQ(hashGnu("FooBarBazToto"), 0x5478be61U);315 316 // boom💥pants317 EXPECT_EQ(hashSysV("boom\xf0\x9f\x92\xa5pants"), 0x5a0cf53U);318 EXPECT_EQ(hashGnu("boom\xf0\x9f\x92\xa5pants"), 0xf5dda2deU);319 320 // woot!🧙 💑 🌈321 EXPECT_EQ(hashSysV("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "322 "\xf0\x9f\x8c\x88"), 0x3522e38U);323 EXPECT_EQ(hashGnu("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "324 "\xf0\x9f\x8c\x88"), 0xf7603f3U);325 326 // This string hashes to 0x100000000 in the originally formulated function,327 // when long is 64 bits -- but that was never the intent. The code was328 // presuming 32-bit long. Thus make sure that extra bit doesn't appear. 329 EXPECT_EQ(hashSysV("ZZZZZW9p"), 0U);330}331 332template <class ELFT>333static Expected<ELFObjectFile<ELFT>> toBinary(SmallVectorImpl<char> &Storage,334 StringRef Yaml) {335 raw_svector_ostream OS(Storage);336 yaml::Input YIn(Yaml);337 if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {}))338 return createStringError(std::errc::invalid_argument,339 "unable to convert YAML");340 return ELFObjectFile<ELFT>::create(MemoryBufferRef(OS.str(), "dummyELF"));341}342 343TEST(ELFObjectFileTest, ELFNoteIteratorOverflow) {344 using Elf_Shdr_Range = ELFFile<ELF64LE>::Elf_Shdr_Range;345 using Elf_Phdr_Range = ELFFile<ELF64LE>::Elf_Phdr_Range;346 347 SmallString<0> Storage;348 Expected<ELFObjectFile<ELF64LE>> ElfOrErr = toBinary<ELF64LE>(Storage, R"(349--- !ELF350FileHeader:351 Class: ELFCLASS64352 Data: ELFDATA2LSB353 Type: ET_EXEC354 Machine: EM_X86_64355ProgramHeaders:356 - Type: PT_NOTE357 FileSize: 0xffffffffffffff88358 FirstSec: .note.gnu.build-id359 LastSec: .note.gnu.build-id360Sections:361 - Name: .note.gnu.build-id362 Type: SHT_NOTE363 AddressAlign: 0x04364 ShOffset: 0xffffffffffffff88365 Notes:366 - Name: "GNU"367 Desc: "abb50d82b6bdc861"368 Type: 3369)");370 ASSERT_THAT_EXPECTED(ElfOrErr, Succeeded());371 ELFFile<ELF64LE> Obj = ElfOrErr.get().getELFFile();372 373 auto CheckOverflow = [&](auto &&PhdrOrShdr, uint64_t Offset, uint64_t Size) {374 Error Err = Error::success();375 Obj.notes(PhdrOrShdr, Err);376 377 std::string ErrMessage;378 handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) {379 ErrMessage = EI.message();380 });381 382 EXPECT_EQ(ErrMessage, ("invalid offset (0x" + Twine::utohexstr(Offset) +383 ") or size (0x" + Twine::utohexstr(Size) + ")")384 .str());385 };386 387 Expected<Elf_Phdr_Range> PhdrsOrErr = Obj.program_headers();388 EXPECT_FALSE(!PhdrsOrErr);389 for (Elf_Phdr_Impl<ELF64LE> P : *PhdrsOrErr)390 if (P.p_type == ELF::PT_NOTE)391 CheckOverflow(P, P.p_offset, P.p_filesz);392 393 Expected<Elf_Shdr_Range> ShdrsOrErr = Obj.sections();394 EXPECT_FALSE(!ShdrsOrErr);395 for (Elf_Shdr_Impl<ELF64LE> S : *ShdrsOrErr)396 if (S.sh_type == ELF::SHT_NOTE)397 CheckOverflow(S, S.sh_offset, S.sh_size);398}399