diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-21 00:24:38 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-21 00:24:38 +0000 |
commit | f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0a (patch) | |
tree | 88ff50f86272dfe9b42d58b8640578391a6ef10a /lib/MC/ELFObjectWriter.cpp | |
parent | 44be1a8d661cfab0cc3d11b0dd158271b2d2ca04 (diff) |
Implement support for .local and its "interesting" interactions with .comm.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114382 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index ebbba1327d..f3a09c8df2 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -386,6 +386,8 @@ void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD, if (Data.isCommon() && Data.isExternal()) Value = Data.getCommonAlignment(); + assert(!(Data.isCommon() && !Data.isExternal())); + if (!Data.isCommon() && !(Data.getFlags() & ELF_STB_Weak)) if (MCFragment *FF = Data.getFragment()) Value = Layout.getSymbolAddress(&Data) - @@ -502,7 +504,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, if (Base) { if (F && (!Symbol->isInSection() || SD.isCommon()) && !SD.isExternal()) { Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1; - Value += Layout.getSymbolAddress(&SD); + + MCSectionData *FSD = F->getParent(); + // Offset of the symbol in the section + Value += Layout.getSymbolAddress(&SD) - Layout.getSectionAddress(FSD); } else Index = getSymbolIndexInSymbolTable(Asm, Symbol); if (Base != &SD) @@ -672,7 +677,10 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { MSD.SymbolData = it; MSD.StringIndex = Entry; - if (Symbol.isUndefined()) { + if (it->isCommon()) { + MSD.SectionIndex = ELF::SHN_COMMON; + ExternalSymbolData.push_back(MSD); + } else if (Symbol.isUndefined()) { MSD.SectionIndex = ELF::SHN_UNDEF; // XXX: for some reason we dont Emit* this it->setFlags(it->getFlags() | ELF_STB_Global); @@ -680,9 +688,6 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { } else if (Symbol.isAbsolute()) { MSD.SectionIndex = ELF::SHN_ABS; ExternalSymbolData.push_back(MSD); - } else if (it->isCommon()) { - MSD.SectionIndex = ELF::SHN_COMMON; - ExternalSymbolData.push_back(MSD); } else { MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); |