forked from OSchip/llvm-project
Revert "[ELF] Only mark as DT_NEEDED libs that are strictly necessary"
This reverts commit r219353 because that seems to break buildbots. llvm-svn: 219369
This commit is contained in:
parent
40cba91ad1
commit
b3f97ba815
|
@ -90,15 +90,6 @@ public:
|
|||
const Reference &) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// \brief Is this a copy relocation?
|
||||
///
|
||||
/// If this is a copy relocation, its target must be an ObjectAtom. We must
|
||||
/// include in DT_NEEDED the name of the library where this object came from.
|
||||
virtual bool isCopyRelocation(const Reference &) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool validateImpl(raw_ostream &diagnostics) override;
|
||||
|
||||
/// \brief Does the linker allow dynamic libraries to be linked with?
|
||||
|
|
|
@ -59,15 +59,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
bool isCopyRelocation(const Reference &r) const override {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
return false;
|
||||
assert(r.kindArch() == Reference::KindArch::AArch64);
|
||||
if (r.kindValue() == llvm::ELF::R_AARCH64_COPY)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isPLTRelocation(const DefinedAtom &,
|
||||
const Reference &r) const override {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
|
|
|
@ -452,7 +452,7 @@ public:
|
|||
if (obj != _objectMap.end())
|
||||
return obj->second;
|
||||
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file, a);
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file);
|
||||
// This needs to point to the atom that we just created.
|
||||
oa->addReferenceELF_AArch64(R_AARCH64_COPY, 0, oa, 0);
|
||||
|
||||
|
|
|
@ -689,11 +689,8 @@ public:
|
|||
/// \brief Atom which represents an object for which a COPY relocation will be
|
||||
/// generated.
|
||||
class ObjectAtom : public SimpleELFDefinedAtom {
|
||||
const SharedLibraryAtom *_sla;
|
||||
|
||||
public:
|
||||
ObjectAtom(const File &f, const SharedLibraryAtom *sla)
|
||||
: SimpleELFDefinedAtom(f), _sla(sla) {}
|
||||
ObjectAtom(const File &f) : SimpleELFDefinedAtom(f) {}
|
||||
|
||||
Scope scope() const override { return scopeGlobal; }
|
||||
|
||||
|
@ -716,8 +713,6 @@ public:
|
|||
|
||||
StringRef name() const override { return _name; }
|
||||
|
||||
const SharedLibraryAtom *getOriginalOwner() const { return _sla; }
|
||||
|
||||
std::string _name;
|
||||
uint64_t _size;
|
||||
};
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#ifndef LLD_READER_WRITER_ELF_DEFAULT_LAYOUT_H
|
||||
#define LLD_READER_WRITER_ELF_DEFAULT_LAYOUT_H
|
||||
|
||||
#include "Atoms.h"
|
||||
#include "Chunk.h"
|
||||
#include "HeaderChunks.h"
|
||||
#include "Layout.h"
|
||||
|
@ -172,7 +171,6 @@ public:
|
|||
typedef typename std::vector<lld::AtomLayout *>::iterator AbsoluteAtomIterT;
|
||||
|
||||
typedef llvm::DenseSet<const Atom *> AtomSetT;
|
||||
typedef llvm::DenseSet<const SharedLibraryAtom *> SharedLibraryAtomSetT;
|
||||
|
||||
DefaultLayout(const ELFLinkingContext &context) : _context(context) {}
|
||||
|
||||
|
@ -305,10 +303,6 @@ public:
|
|||
return _referencedDynAtoms.count(a);
|
||||
}
|
||||
|
||||
const SharedLibraryAtomSetT &getCopiedDynAtoms() const {
|
||||
return _copiedDynAtoms;
|
||||
}
|
||||
|
||||
protected:
|
||||
/// \brief Allocate a new section.
|
||||
virtual AtomSection<ELFT> *createSection(
|
||||
|
@ -331,7 +325,6 @@ protected:
|
|||
LLD_UNIQUE_BUMP_PTR(RelocationTable<ELFT>) _pltRelocationTable;
|
||||
std::vector<lld::AtomLayout *> _absoluteAtoms;
|
||||
AtomSetT _referencedDynAtoms;
|
||||
SharedLibraryAtomSetT _copiedDynAtoms;
|
||||
const ELFLinkingContext &_context;
|
||||
};
|
||||
|
||||
|
@ -589,14 +582,7 @@ ErrorOr<const lld::AtomLayout &> DefaultLayout<ELFT>::addAtom(const Atom *atom)
|
|||
if (isa<UndefinedAtom>(reloc->target()) && isLocalReloc)
|
||||
continue;
|
||||
|
||||
if (!_context.isCopyRelocation(*reloc)) {
|
||||
_referencedDynAtoms.insert(reloc->target());
|
||||
continue;
|
||||
}
|
||||
|
||||
const ObjectAtom *oa = dyn_cast<ObjectAtom>(reloc->target());
|
||||
assert (oa != nullptr && "Targets of copy relocs must be ObjectAtoms");
|
||||
_copiedDynAtoms.insert(oa->getOriginalOwner());
|
||||
_referencedDynAtoms.insert(reloc->target());
|
||||
}
|
||||
|
||||
return section->appendAtom(atom);
|
||||
|
|
|
@ -37,6 +37,10 @@ protected:
|
|||
return std::error_code();
|
||||
}
|
||||
|
||||
bool isNeededTagRequired(const SharedLibraryAtom *sla) const override {
|
||||
return _writeHelper.isNeededTagRequired(sla);
|
||||
}
|
||||
|
||||
LLD_UNIQUE_BUMP_PTR(DynamicTable<ELFT>) createDynamicTable();
|
||||
|
||||
LLD_UNIQUE_BUMP_PTR(DynamicSymbolTable<ELFT>) createDynamicSymbolTable();
|
||||
|
|
|
@ -69,6 +69,11 @@ public:
|
|||
return file;
|
||||
}
|
||||
|
||||
bool isNeededTagRequired(const SharedLibraryAtom *sla) const {
|
||||
return _targetLayout.isReferencedByDefinedAtom(sla) ||
|
||||
_targetLayout.isCopied(sla);
|
||||
}
|
||||
|
||||
private:
|
||||
MipsLinkingContext &_ctx;
|
||||
MipsTargetLayout<ELFT> &_targetLayout;
|
||||
|
|
|
@ -38,6 +38,10 @@ protected:
|
|||
return std::error_code();
|
||||
}
|
||||
|
||||
bool isNeededTagRequired(const SharedLibraryAtom *sla) const override {
|
||||
return _writeHelper.isNeededTagRequired(sla);
|
||||
}
|
||||
|
||||
LLD_UNIQUE_BUMP_PTR(DynamicTable<ELFT>) createDynamicTable();
|
||||
|
||||
LLD_UNIQUE_BUMP_PTR(DynamicSymbolTable<ELFT>) createDynamicSymbolTable();
|
||||
|
|
|
@ -65,15 +65,6 @@ bool MipsLinkingContext::isDynamicRelocation(const DefinedAtom &,
|
|||
}
|
||||
}
|
||||
|
||||
bool MipsLinkingContext::isCopyRelocation(const Reference &r) const {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
return false;
|
||||
assert(r.kindArch() == Reference::KindArch::Mips);
|
||||
if (r.kindValue() == llvm::ELF::R_MIPS_COPY)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsLinkingContext::isPLTRelocation(const DefinedAtom &,
|
||||
const Reference &r) const {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
|
|
|
@ -47,7 +47,6 @@ public:
|
|||
bool isRelaOutputFormat() const override { return false; }
|
||||
bool isDynamicRelocation(const DefinedAtom &,
|
||||
const Reference &r) const override;
|
||||
bool isCopyRelocation(const Reference &r) const override;
|
||||
bool isPLTRelocation(const DefinedAtom &, const Reference &r) const override;
|
||||
};
|
||||
|
||||
|
|
|
@ -781,7 +781,7 @@ RelocationPass<ELFT>::getObjectEntry(const SharedLibraryAtom *a) {
|
|||
if (obj != _objectMap.end())
|
||||
return obj->second;
|
||||
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file, a);
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file);
|
||||
oa->addReferenceELF_Mips(R_MIPS_COPY, 0, oa, 0);
|
||||
oa->_name = a->name();
|
||||
oa->_size = a->size();
|
||||
|
|
|
@ -62,6 +62,26 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
ErrorOr<const lld::AtomLayout &> addAtom(const Atom *atom) override {
|
||||
// Maintain:
|
||||
// 1. Set of shared library atoms referenced by regular defined atoms.
|
||||
// 2. Set of shared library atoms have corresponding R_MIPS_COPY copies.
|
||||
if (const auto *da = dyn_cast<DefinedAtom>(atom))
|
||||
for (const Reference *ref : *da) {
|
||||
if (ref->kindNamespace() == lld::Reference::KindNamespace::ELF) {
|
||||
assert(ref->kindArch() == Reference::KindArch::Mips);
|
||||
if (ref->kindValue() == llvm::ELF::R_MIPS_COPY)
|
||||
_copiedDynSymNames.insert(atom->name());
|
||||
}
|
||||
}
|
||||
|
||||
return TargetLayout<ELFType>::addAtom(atom);
|
||||
}
|
||||
|
||||
bool isCopied(const SharedLibraryAtom *sla) const {
|
||||
return _copiedDynSymNames.count(sla->name());
|
||||
}
|
||||
|
||||
/// \brief GP offset relative to .got section.
|
||||
uint64_t getGPOffset() const { return 0x7FF0; }
|
||||
|
||||
|
@ -89,6 +109,7 @@ private:
|
|||
MipsPLTSection<ELFType> *_pltSection;
|
||||
llvm::Optional<AtomLayout *> _gpAtom;
|
||||
llvm::Optional<AtomLayout *> _gpDispAtom;
|
||||
llvm::StringSet<> _copiedDynSymNames;
|
||||
};
|
||||
|
||||
/// \brief Mips Runtime file.
|
||||
|
|
|
@ -180,14 +180,11 @@ template <class ELFT>
|
|||
void OutputELFWriter<ELFT>::buildDynamicSymbolTable(const File &file) {
|
||||
ScopedTask task(getDefaultDomain(), "buildDynamicSymbolTable");
|
||||
for (const auto &sla : file.sharedLibrary()) {
|
||||
if (!isDynSymEntryRequired(sla))
|
||||
continue;
|
||||
_dynamicSymbolTable->addSymbol(sla, ELF::SHN_UNDEF);
|
||||
if (isDynSymEntryRequired(sla))
|
||||
_dynamicSymbolTable->addSymbol(sla, ELF::SHN_UNDEF);
|
||||
if (isNeededTagRequired(sla))
|
||||
_soNeeded.insert(sla->loadName());
|
||||
}
|
||||
for (const auto &sla : _layout.getCopiedDynAtoms())
|
||||
_soNeeded.insert(sla->loadName());
|
||||
// Never mark the dynamic linker as DT_NEEDED
|
||||
_soNeeded.erase(sys::path::filename(_context.getInterpreter()));
|
||||
for (const auto &loadName : _soNeeded) {
|
||||
|
|
|
@ -58,15 +58,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
bool isCopyRelocation(const Reference &r) const override {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
return false;
|
||||
assert(r.kindArch() == Reference::KindArch::x86_64);
|
||||
if (r.kindValue() == llvm::ELF::R_X86_64_COPY)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool isPLTRelocation(const DefinedAtom &,
|
||||
const Reference &r) const override {
|
||||
if (r.kindNamespace() != Reference::KindNamespace::ELF)
|
||||
|
|
|
@ -430,7 +430,7 @@ public:
|
|||
if (obj != _objectMap.end())
|
||||
return obj->second;
|
||||
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file, a);
|
||||
auto oa = new (_file._alloc) ObjectAtom(_file);
|
||||
// This needs to point to the atom that we just created.
|
||||
oa->addReferenceELF_x86_64(R_X86_64_COPY, 0, oa, 0);
|
||||
|
||||
|
|
Loading…
Reference in New Issue