| Index: src/IceELFObjectWriter.cpp | 
| diff --git a/src/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp | 
| index 611121ad094c144cf7c4baba4c828d97a860c6b0..b5c5fc766b21f67c777dc2b41bf9df6ee18d2e79 100644 | 
| --- a/src/IceELFObjectWriter.cpp | 
| +++ b/src/IceELFObjectWriter.cpp | 
| @@ -30,11 +30,11 @@ namespace Ice { | 
|  | 
| namespace { | 
|  | 
| -struct { | 
| +constexpr struct { | 
| bool IsELF64; | 
| uint16_t ELFMachine; | 
| uint32_t ELFFlags; | 
| -} ELFTargetInfo[] = { | 
| +} ELFTargetInfo[TargetArch_NUM] = { | 
| #define X(tag, str, is_elf64, e_machine, e_flags)                              \ | 
| { is_elf64, e_machine, e_flags }                                             \ | 
| , | 
| @@ -42,11 +42,19 @@ struct { | 
| #undef X | 
| }; | 
|  | 
| -bool isELF64(TargetArch Arch) { | 
| -  if (Arch < TargetArch_NUM) | 
| -    return ELFTargetInfo[Arch].IsELF64; | 
| -  llvm_unreachable("Invalid target arch for isELF64"); | 
| -  return false; | 
| +bool isELF64(const ClFlags &Flags) { | 
| +  const TargetArch Arch = Flags.getTargetArch(); | 
| +  if (Arch >= TargetArch_NUM) { | 
| +    llvm_unreachable("Invalid target arch for isELF64"); | 
| +    return false; | 
| +  } | 
| + | 
| +  if (!Flags.getUseSandboxing()) { | 
| +    // Unsandboxed code is always ELF32 (pexes are ILP32.) | 
| +    return false; | 
| +  } | 
| + | 
| +  return ELFTargetInfo[Arch].IsELF64; | 
| } | 
|  | 
| uint16_t getELFMachine(TargetArch Arch) { | 
| @@ -66,7 +74,7 @@ uint32_t getELFFlags(TargetArch Arch) { | 
| } // end of anonymous namespace | 
|  | 
| ELFObjectWriter::ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out) | 
| -    : Ctx(Ctx), Str(Out), ELF64(isELF64(Ctx.getFlags().getTargetArch())) { | 
| +    : Ctx(Ctx), Str(Out), ELF64(isELF64(Ctx.getFlags())) { | 
| // Create the special bookkeeping sections now. | 
| const IceString NullSectionName(""); | 
| NullSection = new (Ctx.allocate<ELFSection>()) | 
| @@ -231,10 +239,10 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, | 
| Section = TextSections[0]; | 
| RelSection = RelTextSections[0]; | 
| } | 
| -  RelocOffsetT OffsetInSection = Section->getCurrentSize(); | 
| +  const RelocOffsetT OffsetInSection = Section->getCurrentSize(); | 
| // Function symbols are set to 0 size in the symbol table, in contrast to | 
| // data symbols which have a proper size. | 
| -  SizeT SymbolSize = 0; | 
| +  constexpr SizeT SymbolSize = 0; | 
| Section->appendData(Str, Asm->getBufferView()); | 
| uint8_t SymbolType; | 
| uint8_t SymbolBinding; | 
| @@ -248,6 +256,15 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, | 
| SymTab->createDefinedSym(FuncName, SymbolType, SymbolBinding, Section, | 
| OffsetInSection, SymbolSize); | 
| StrTab->add(FuncName); | 
| +  for (const auto &InternalReloc : Asm->getInternalRelocations()) { | 
| +    const IceString &RelocName = InternalReloc.first; | 
| +    constexpr uint8_t RelocSymbolType = STT_NOTYPE; | 
| +    constexpr uint8_t RelocSymbolBinding = STB_LOCAL; | 
| +    const SizeT RelocOffsetInSection = OffsetInSection + InternalReloc.second; | 
| +    SymTab->createDefinedSym(RelocName, RelocSymbolType, RelocSymbolBinding, | 
| +                             Section, RelocOffsetInSection, SymbolSize); | 
| +    StrTab->add(RelocName); | 
| +  } | 
|  | 
| // Copy the fixup information from per-function Assembler memory to the | 
| // object writer's memory, for writing later. | 
|  |