diff options
author | Richard Mitton <richard@codersnotes.com> | 2013-08-16 18:54:26 +0000 |
---|---|---|
committer | Richard Mitton <richard@codersnotes.com> | 2013-08-16 18:54:26 +0000 |
commit | b0f79298851836cdfcca90252260d007d7561cad (patch) | |
tree | 3dbe0adaa71db1fa06ecd83f00424c11a228d468 | |
parent | 8ae1efeb07be4d1bd007fee90b08813ecf05e5b1 (diff) | |
download | external_llvm-b0f79298851836cdfcca90252260d007d7561cad.zip external_llvm-b0f79298851836cdfcca90252260d007d7561cad.tar.gz external_llvm-b0f79298851836cdfcca90252260d007d7561cad.tar.bz2 |
Fixed RuntimeDyldELF absolute relocations.
If an ELF relocation is pointed at an absolute address, it will have a symbol ID of zero.
RuntimeDyldELF::processRelocationRef was not previously handling this case, and was instead trying to handle it as a section-relative fixup.
I think this is the right fix here, but my elf-fu is poor on some of the more exotic platforms, so I'd appreciate it if anyone with greater knowledge could verify this.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188572 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index 501959e..16fd52d 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -843,6 +843,13 @@ void RuntimeDyldELF::processRelocationRef(unsigned SectionID, case SymbolRef::ST_Unknown: { Value.SymbolName = TargetName.data(); Value.Addend = Addend; + + // Absolute relocations will have a zero symbol ID (STN_UNDEF), which + // will manifest here as a NULL symbol name. + // We can set this as a valid (but empty) symbol name, and rely + // on addRelocationForSymbol to handle this. + if (!Value.SymbolName) + Value.SymbolName = ""; break; } default: @@ -1068,7 +1075,10 @@ void RuntimeDyldELF::processRelocationRef(unsigned SectionID, RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); // Extra check to avoid relocation againt empty symbols (usually // the R_PPC64_TOC). - if (Value.SymbolName && !TargetName.empty()) + if (SymType != SymbolRef::ST_Unknown && TargetName.empty()) + Value.SymbolName = NULL; + + if (Value.SymbolName) addRelocationForSymbol(RE, Value.SymbolName); else addRelocationForSection(RE, Value.SectionID); |