mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-17 00:27:31 +00:00
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. llvm-svn: 188572
This commit is contained in:
parent
6637b0bf1f
commit
17e557f705
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user