From 82b4288b1a32a781af50760ad12698b64da233e2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 2 Feb 2016 07:50:18 +0000 Subject: [PATCH] ELF: Simplify and add comments. llvm-svn: 259474 --- lld/ELF/Writer.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index d7c82db..5ab32f6 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -387,15 +387,23 @@ void Writer::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::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::RelaDyn->addReloc({&C, &RI}); } } -- 2.7.4