ELF: Simplify and add comments.

llvm-svn: 259474
This commit is contained in:
Rui Ueyama 2016-02-02 07:50:18 +00:00
parent 4a3c7fa441
commit 82b4288b1a
1 changed files with 16 additions and 8 deletions

View File

@ -387,15 +387,23 @@ void Writer<ELFT>::scanRelocs(
continue;
}
// Here we are creating a relocation for the dynamic linker based on
// a relocation from an object file, but some relocations need no
// load-time fixup when the final target is known. Skip such relocation.
bool CBP = canBePreempted(Body, /*NeedsGot=*/false);
bool Dynrel = Config->Shared && !Target->isRelRelative(Type) &&
!Target->isSizeRel(Type);
if (CBP)
// We get here if a program was not compiled as PIC.
if (canBePreempted(Body, /*NeedsGot=*/false)) {
Body->setUsedInDynamicReloc();
if (CBP || Dynrel)
Out<ELFT>::RelaDyn->addReloc({&C, &RI});
continue;
}
// If we get here, the code we are handling is not PIC. We need to copy
// relocations from object files to the output file, so that the
// dynamic linker can fix up addresses. But there are a few exceptions.
// If the relocation will not change at runtime, we don't need to copy
// them. For example, we don't copy PC-relative relocations because
// the distance between two symbols won't change whereever they are
// loaded. Likewise, if we are linking an executable, it will be loaded
// at a fixed address, so we don't copy relocations.
if (Config->Shared && !Target->isRelRelative(Type) &&
!Target->isSizeRel(Type))
Out<ELFT>::RelaDyn->addReloc({&C, &RI});
}
}