diff options
| author | Rui Ueyama <ruiu@google.com> | 2015-12-26 09:48:00 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2015-12-26 09:48:00 +0000 |
| commit | a5d79d1676f07d9a054e15fc3228132592ffc187 (patch) | |
| tree | 0fd90c292bcaecf9978d6de4826053882a87a2d0 | |
| parent | 0168722e3913f30fa0b61b57796db79886c3243a (diff) | |
| download | bcm5719-llvm-a5d79d1676f07d9a054e15fc3228132592ffc187.tar.gz bcm5719-llvm-a5d79d1676f07d9a054e15fc3228132592ffc187.zip | |
Define SECNAME_{start,end} symbols in a separate function. NFC.
llvm-svn: 256445
| -rw-r--r-- | lld/ELF/Writer.cpp | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 814a973423c..18bb422f5ac 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -80,6 +80,7 @@ private: unsigned getNumSections() const { return OutputSections.size() + 1; } void addRelIpltSymbols(); + void addStartEndSymbols(); void addStartStopSymbols(OutputSectionBase<ELFT> *Sec); void setPhdr(Elf_Phdr *PH, uint32_t Type, uint32_t Flags, uintX_t FileOff, uintX_t VA, uintX_t Size, uintX_t Align); @@ -772,24 +773,10 @@ template <class ELFT> void Writer<ELFT>::createSections() { Out<ELFT>::Dynamic->FiniArraySec = Factory.lookup(".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC); - auto AddStartEnd = [&](StringRef Start, StringRef End, - OutputSectionBase<ELFT> *OS) { - if (OS) { - Symtab.addSynthetic(Start, *OS, 0); - Symtab.addSynthetic(End, *OS, OS->getSize()); - } else { - Symtab.addIgnored(Start); - Symtab.addIgnored(End); - } - }; - - AddStartEnd("__preinit_array_start", "__preinit_array_end", - Out<ELFT>::Dynamic->PreInitArraySec); - AddStartEnd("__init_array_start", "__init_array_end", - Out<ELFT>::Dynamic->InitArraySec); - AddStartEnd("__fini_array_start", "__fini_array_end", - Out<ELFT>::Dynamic->FiniArraySec); - + // The linker needs to define SECNAME_start, SECNAME_end and SECNAME_stop + // symbols for sections, so that the runtime can get the start and end + // addresses of each section by section name. Add such symbols. + addStartEndSymbols(); for (OutputSectionBase<ELFT> *Sec : RegularSections) addStartStopSymbols(Sec); @@ -921,6 +908,28 @@ template <class ELFT> void Writer<ELFT>::addPredefinedSections() { OutputSections.push_back(Out<ELFT>::Plt); } +// The linker is expected to define SECNAME_start and SECNAME_end +// symbols for a few sections. This function defines them. +template <class ELFT> void Writer<ELFT>::addStartEndSymbols() { + auto Define = [&](StringRef Start, StringRef End, + OutputSectionBase<ELFT> *OS) { + if (OS) { + Symtab.addSynthetic(Start, *OS, 0); + Symtab.addSynthetic(End, *OS, OS->getSize()); + } else { + Symtab.addIgnored(Start); + Symtab.addIgnored(End); + } + }; + + Define("__preinit_array_start", "__preinit_array_end", + Out<ELFT>::Dynamic->PreInitArraySec); + Define("__init_array_start", "__init_array_end", + Out<ELFT>::Dynamic->InitArraySec); + Define("__fini_array_start", "__fini_array_end", + Out<ELFT>::Dynamic->FiniArraySec); +} + static bool isAlpha(char C) { return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z') || C == '_'; } |

