aboutsummaryrefslogtreecommitdiff
path: root/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-09-21 00:24:38 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-09-21 00:24:38 +0000
commitf7c10a3cff61c70efe8e405d9bdc5386e8e3fc0a (patch)
tree88ff50f86272dfe9b42d58b8640578391a6ef10a /lib/MC/ELFObjectWriter.cpp
parent44be1a8d661cfab0cc3d11b0dd158271b2d2ca04 (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.cpp15
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!");