ELF2: Simplify DT_FLAGS{,_1} handling. NFC.

llvm-svn: 250914
This commit is contained in:
Rui Ueyama
2015-10-21 17:47:10 +00:00
parent bea731292f
commit c96d0dd431
3 changed files with 26 additions and 25 deletions

View File

@@ -159,11 +159,12 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
Config->Undefined.push_back(Arg->getValue());
for (auto *Arg : Args.filtered(OPT_z)) {
if (Arg->getValue() == StringRef("nodelete"))
StringRef S = Arg->getValue();
if (S == "nodelete")
Config->ZNodelete = true;
else if (Arg->getValue() == StringRef("now"))
else if (S == "now")
Config->ZNow = true;
else if (Arg->getValue() == StringRef("origin"))
else if (S == "origin")
Config->ZOrigin = true;
}

View File

@@ -349,9 +349,23 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() {
++NumEntries; // DT_INIT
if (FiniSym)
++NumEntries; // DT_FINI
if (Config->Bsymbolic || Config->ZNow || Config->ZOrigin)
if (Config->Bsymbolic)
DtFlags |= DF_SYMBOLIC;
if (Config->ZNodelete)
DtFlags1 |= DF_1_NODELETE;
if (Config->ZNow) {
DtFlags |= DF_BIND_NOW;
DtFlags1 |= DF_1_NOW;
}
if (Config->ZOrigin) {
DtFlags |= DF_ORIGIN;
DtFlags1 |= DF_1_ORIGIN;
}
if (DtFlags)
++NumEntries; // DT_FLAGS
if (Config->ZNodelete || Config->ZNow || Config->ZOrigin)
if (DtFlags1)
++NumEntries; // DT_FLAGS_1
++NumEntries; // DT_NULL
@@ -428,26 +442,10 @@ template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
WritePtr(DT_INIT, getSymVA<ELFT>(*InitSym));
if (FiniSym)
WritePtr(DT_FINI, getSymVA<ELFT>(*FiniSym));
uint32_t Flags = 0;
if (Config->Bsymbolic)
Flags |= DF_SYMBOLIC;
if (Config->ZNow)
Flags |= DF_BIND_NOW;
if (Config->ZOrigin)
Flags |= DF_ORIGIN;
if (Flags)
WriteVal(DT_FLAGS, Flags);
Flags = 0;
if (Config->ZNodelete)
Flags |= DF_1_NODELETE;
if (Config->ZNow)
Flags |= DF_1_NOW;
if (Config->ZOrigin)
Flags |= DF_1_ORIGIN;
if (Flags)
WriteVal(DT_FLAGS_1, Flags);
if (DtFlags)
WriteVal(DT_FLAGS, DtFlags);
if (DtFlags1)
WriteVal(DT_FLAGS_1, DtFlags1);
WriteVal(DT_NULL, 0);
}

View File

@@ -305,6 +305,8 @@ private:
SymbolTable<ELFT> &SymTab;
const ELFSymbolBody<ELFT> *InitSym = nullptr;
const ELFSymbolBody<ELFT> *FiniSym = nullptr;
uint32_t DtFlags = 0;
uint32_t DtFlags1 = 0;
};
// All output sections that are hadnled by the linker specially are