[ELF] Interp section is only needed in dynamic executables
authorShankar Easwaran <shankare@codeaurora.org>
Wed, 20 Mar 2013 05:06:40 +0000 (05:06 +0000)
committerShankar Easwaran <shankare@codeaurora.org>
Wed, 20 Mar 2013 05:06:40 +0000 (05:06 +0000)
llvm-svn: 177483

lld/lib/ReaderWriter/ELF/ExecutableWriter.h
lld/lib/ReaderWriter/ELF/OutputELFWriter.h

index 60dbcb2..fc0bde0 100644 (file)
@@ -31,9 +31,10 @@ public:
 
 private:
   virtual void addDefaultAtoms();
-  virtual void addFiles(InputFiles&);
+  virtual void addFiles(InputFiles &);
   virtual void finalizeDefaultAtomValues();
-
+  virtual void createDefaultSections();
+  LLD_UNIQUE_BUMP_PTR(InterpSection<ELFT>) _interpSection;
   CRuntimeFile<ELFT> _runtimeFile;
 };
 
@@ -69,10 +70,19 @@ void ExecutableWriter<ELFT>::addFiles(InputFiles &inputFiles) {
   this->_targetHandler.addFiles(inputFiles);
 }
 
+template <class ELFT> void ExecutableWriter<ELFT>::createDefaultSections() {
+  OutputELFWriter<ELFT>::createDefaultSections();
+  if (this->_targetInfo.isDynamic()) {
+    _interpSection.reset(new (this->_alloc) InterpSection<ELFT>(
+        this->_targetInfo, ".interp", DefaultLayout<ELFT>::ORDER_INTERP,
+        this->_targetInfo.getInterpreter()));
+    this->_layout->addSection(_interpSection.get());
+  }
+}
+
 /// Finalize the value of all the absolute symbols that we
 /// created
-template<class ELFT>
-void ExecutableWriter<ELFT>::finalizeDefaultAtomValues() {
+template <class ELFT> void ExecutableWriter<ELFT>::finalizeDefaultAtomValues() {
   auto bssStartAtomIter = this->_layout->findAbsoluteAtom("__bss_start");
   auto bssEndAtomIter = this->_layout->findAbsoluteAtom("__bss_end");
   auto underScoreEndAtomIter = this->_layout->findAbsoluteAtom("_end");
index 5f8e52b..d2850ad 100644 (file)
@@ -109,7 +109,6 @@ protected:
   LLD_UNIQUE_BUMP_PTR(DynamicTable<ELFT>) _dynamicTable;
   LLD_UNIQUE_BUMP_PTR(DynamicSymbolTable<ELFT>) _dynamicSymbolTable;
   LLD_UNIQUE_BUMP_PTR(StringTable<ELFT>) _dynamicStringTable;
-  LLD_UNIQUE_BUMP_PTR(InterpSection<ELFT>) _interpSection;
   LLD_UNIQUE_BUMP_PTR(HashSection<ELFT>) _hashTable;
   llvm::StringSet<> _soNeeded;
   /// @}
@@ -226,15 +225,11 @@ void OutputELFWriter<ELFT>::createDefaultSections() {
         true));
     _dynamicSymbolTable.reset(new (_alloc) DynamicSymbolTable<ELFT>(
         _targetInfo, ".dynsym", DefaultLayout<ELFT>::ORDER_DYNAMIC_SYMBOLS));
-    _interpSection.reset(new (_alloc) InterpSection<ELFT>(
-        _targetInfo, ".interp", DefaultLayout<ELFT>::ORDER_INTERP,
-        _targetInfo.getInterpreter()));
     _hashTable.reset(new (_alloc) HashSection<ELFT>(
         _targetInfo, ".hash", DefaultLayout<ELFT>::ORDER_HASH));
     _layout->addSection(_dynamicTable.get());
     _layout->addSection(_dynamicStringTable.get());
     _layout->addSection(_dynamicSymbolTable.get());
-    _layout->addSection(_interpSection.get());
     _layout->addSection(_hashTable.get());
     _dynamicSymbolTable->setStringSection(_dynamicStringTable.get());
     if (_layout->hasDynamicRelocationTable())