mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 21:55:39 +08:00
ELF2: Simplify DT_FLAGS{,_1} handling. NFC.
llvm-svn: 250914
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user