Index: lib/ReaderWriter/ELF/Atoms.h =================================================================== --- lib/ReaderWriter/ELF/Atoms.h +++ lib/ReaderWriter/ELF/Atoms.h @@ -844,6 +844,33 @@ ArrayRef rawContent() const override { return ArrayRef(); } }; +class InitArrayAtom : public SimpleELFDefinedAtom { + StringRef _name; + StringRef _section; + +public: + InitArrayAtom(const File &f, StringRef symName, StringRef secName) + : SimpleELFDefinedAtom(f), _name(symName), _section(secName) {} + + StringRef name() const override { return _name; }; + + Scope scope() const override { return scopeGlobal; }; + + SectionChoice sectionChoice() const override { return sectionCustomRequired; } + + StringRef customSectionName() const override { return _section; } + + ContentType contentType() const override { return typeData; } + + uint64_t size() const override { return 0; } + + ContentPermissions permissions() const override { return permRW_; } + + Alignment alignment() const override { return Alignment(0); } + + ArrayRef rawContent() const override { return ArrayRef(); } +}; + class InitFiniAtom : public SimpleELFDefinedAtom { StringRef _section; Index: lib/ReaderWriter/ELF/ELFFile.h =================================================================== --- lib/ReaderWriter/ELF/ELFFile.h +++ lib/ReaderWriter/ELF/ELFFile.h @@ -470,10 +470,15 @@ return *newAtom; } - // cannot add atoms to C Runtime file - virtual void addAtom(const Atom &) { - llvm_unreachable("cannot add atoms to Runtime files"); + /// \brief add default atom + virtual void addAtom(const Atom &atom) { + if (auto *defAtom = dyn_cast(&atom)) { + this->_definedAtoms._atoms.push_back(defAtom); + } else { + llvm_unreachable("can't add this atom"); + } } + llvm::BumpPtrAllocator _alloc; }; template Index: lib/ReaderWriter/ELF/ExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/ExecutableWriter.h +++ lib/ReaderWriter/ELF/ExecutableWriter.h @@ -81,14 +81,18 @@ template void ExecutableWriter::addDefaultAtoms() { _runtimeFile->addUndefinedAtom(this->_context.entrySymbolName()); + _runtimeFile->addAtom(*new (_runtimeFile->_alloc) + InitArrayAtom(*_runtimeFile, "__init_array_start", ".init_array")); + _runtimeFile->addAtom(*new (_runtimeFile->_alloc) + InitArrayAtom(*_runtimeFile, "__init_array_end", ".init_array")); + + // XXX: These aren't absolute atoms and need to be fixed. _runtimeFile->addAbsoluteAtom("__bss_start"); _runtimeFile->addAbsoluteAtom("__bss_end"); _runtimeFile->addAbsoluteAtom("_end"); _runtimeFile->addAbsoluteAtom("end"); _runtimeFile->addAbsoluteAtom("__preinit_array_start"); _runtimeFile->addAbsoluteAtom("__preinit_array_end"); - _runtimeFile->addAbsoluteAtom("__init_array_start"); - _runtimeFile->addAbsoluteAtom("__init_array_end"); if (this->_context.isRelaOutputFormat()) { _runtimeFile->addAbsoluteAtom("__rela_iplt_start"); _runtimeFile->addAbsoluteAtom("__rela_iplt_end"); @@ -145,7 +149,6 @@ }; startEnd("preinit_array", ".preinit_array"); - startEnd("init_array", ".init_array"); if (this->_context.isRelaOutputFormat()) startEnd("rela_iplt", ".rela.plt"); else