Add the DT_NEEDED entries to the dynamic table.
llvm-svn: 247181
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 91771b3..af615ab 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -167,10 +167,10 @@
typedef typename Base::Elf_Dyn Elf_Dyn;
public:
- DynamicSection(const StringTableSection<Is64Bits> &DynStrSec)
+ DynamicSection(SymbolTable &SymTab, StringTableSection<Is64Bits> &DynStrSec)
: OutputSectionBase<Is64Bits>(".dynamic", SHT_DYNAMIC,
SHF_ALLOC | SHF_WRITE),
- DynStrSec(DynStrSec) {
+ DynStrSec(DynStrSec), SymTab(SymTab) {
typename Base::HeaderT &Header = this->Header;
Header.sh_addralign = Is64Bits ? 8 : 4;
Header.sh_entsize = Is64Bits ? 16 : 8;
@@ -178,6 +178,14 @@
unsigned NumEntries = 0;
++NumEntries; // DT_STRTAB
+ ++NumEntries; // DT_STRSZ
+
+ const std::vector<std::unique_ptr<SharedFileBase>> &SharedFiles =
+ SymTab.getSharedFiles();
+ for (const std::unique_ptr<SharedFileBase> &File : SharedFiles)
+ DynStrSec.add(File->getName());
+ NumEntries += SharedFiles.size();
+
++NumEntries; // DT_NULL
Header.sh_size = NumEntries * Header.sh_entsize;
@@ -194,12 +202,26 @@
P->d_un.d_ptr = DynStrSec.getVA();
++P;
+ P->d_tag = DT_STRSZ;
+ P->d_un.d_val = DynStrSec.StrTabBuilder.data().size();
+ ++P;
+
+ const std::vector<std::unique_ptr<SharedFileBase>> &SharedFiles =
+ SymTab.getSharedFiles();
+ for (const std::unique_ptr<SharedFileBase> &File : SharedFiles) {
+ P->d_tag = DT_NEEDED;
+ P->d_un.d_val = DynStrSec.getFileOff(File->getName());
+ ++P;
+ }
+
P->d_tag = DT_NULL;
P->d_un.d_val = 0;
+ ++P;
}
private:
- const StringTableSection<Is64Bits> &DynStrSec;
+ StringTableSection<Is64Bits> &DynStrSec;
+ SymbolTable &SymTab;
};
// The writer writes a SymbolTable result to a file.
@@ -212,7 +234,7 @@
typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
Writer(SymbolTable *T)
: StrTabSec(false), DynStrSec(true), SymTable(*T, StrTabSec),
- DynamicSec(DynStrSec) {}
+ DynamicSec(*T, DynStrSec) {}
void run();
private:
@@ -638,7 +660,7 @@
auto PHdrs = reinterpret_cast<Elf_Phdr *>(Buf + EHdr->e_phoff);
PHdrs->p_type = PT_LOAD;
PHdrs->p_flags = PF_R | PF_X;
- PHdrs->p_offset = 0x0000;
+ PHdrs->p_offset = 0x1000;
PHdrs->p_vaddr = 0x1000;
PHdrs->p_paddr = PHdrs->p_vaddr;
PHdrs->p_filesz = FileSize;