[lld] r262369 - [ELF] - More direct implementation of edata/etext
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 1 11:18:07 PST 2016
Author: grimar
Date: Tue Mar 1 13:18:07 2016
New Revision: 262369
URL: http://llvm.org/viewvc/llvm-project?rev=262369&view=rev
Log:
[ELF] - More direct implementation of edata/etext
As was suggested in mails, this patch implements edata/etext
symbols in a more direct way.
It iterates through PT_LOADs.
Result seems to be the same and equal to gold output.
Differential revision: http://reviews.llvm.org/D17755
Modified:
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=262369&r1=262368&r2=262369&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Mar 1 13:18:07 2016
@@ -1467,15 +1467,16 @@ template <class ELFT> void Writer<ELFT>:
if (Config->EMachine == EM_MIPS)
ElfSym<ELFT>::MipsGp.st_value = getMipsGpAddr<ELFT>();
- // _etext points to location after the last read-only loadable segment.
- // _edata points to the end of the last non SHT_NOBITS section.
- for (OutputSectionBase<ELFT> *Sec : OutputSections) {
- if (!(Sec->getFlags() & SHF_ALLOC))
+ // _etext is the first location after the last read-only loadable segment.
+ // _edata is the first location after the last read-write loadable segment.
+ for (Phdr &PHdr : Phdrs) {
+ if (PHdr.H.p_type != PT_LOAD)
continue;
- if (!(Sec->getFlags() & SHF_WRITE))
- ElfSym<ELFT>::Etext.st_value = Sec->getVA() + Sec->getSize();
- if (Sec->getType() != SHT_NOBITS)
- ElfSym<ELFT>::Edata.st_value = Sec->getVA() + Sec->getSize();
+ uintX_t Val = PHdr.H.p_vaddr + PHdr.H.p_filesz;
+ if (PHdr.H.p_flags & PF_W)
+ ElfSym<ELFT>::Edata.st_value = Val;
+ else
+ ElfSym<ELFT>::Etext.st_value = Val;
}
}
More information about the llvm-commits
mailing list