Index: src/IceELFObjectWriter.cpp |
diff --git a/src/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp |
index b701f2af123aff39f926b604646ad5d25e62fc60..f370d873cd9fe3b5f5cb06ed9f653f9a13bfc87a 100644 |
--- a/src/IceELFObjectWriter.cpp |
+++ b/src/IceELFObjectWriter.cpp |
@@ -217,7 +217,7 @@ Elf64_Off ELFObjectWriter::alignFileOffset(Elf64_Xword Align) { |
} |
void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
- bool IsInternal, const Assembler *Asm) { |
+ bool IsInternal, Assembler *Asm) { |
assert(!SectionNumbersAssigned); |
ELFTextSection *Section = nullptr; |
ELFRelocationSection *RelSection = nullptr; |
@@ -243,7 +243,6 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
// Function symbols are set to 0 size in the symbol table, in contrast to |
// data symbols which have a proper size. |
constexpr SizeT SymbolSize = 0; |
- Section->appendData(Str, Asm->getBufferView()); |
uint8_t SymbolType; |
uint8_t SymbolBinding; |
if (IsInternal && !Ctx.getFlags().getDisableInternal()) { |
@@ -259,9 +258,18 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
// Copy the fixup information from per-function Assembler memory to the |
// object writer's memory, for writing later. |
- if (!Asm->fixups().empty()) { |
+ const auto &Fixups = Asm->fixups(); |
+ if (!Fixups.empty()) { |
+ if (!RelSection->isRela()) { |
+ // This is a non-rela section, so we need to update the instruction stream |
+ // with the relocation addends. |
+ for (const auto *Fixup : Fixups) { |
+ Fixup->emitOffset(Asm); |
+ } |
+ } |
RelSection->addRelocations(OffsetInSection, Asm->fixups()); |
} |
+ Section->appendData(Str, Asm->getBufferView()); |
} |
namespace { |