- MCSymbolData &Data = *MSD.SymbolData;
- uint8_t Info = (Data.getFlags() & 0xff);
- uint8_t Other = ((Data.getFlags() & 0xf00) >> ELF_STV_Shift);
+ MCSymbolData &OrigData = *MSD.SymbolData;
+ MCSymbolData *AliasData = NULL;
+ if (OrigData.Symbol->isVariable()) {
+ const MCExpr *Value = OrigData.getSymbol().getVariableValue();
+ assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented");
+ const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
+ AliasData = &Layout.getAssembler().getSymbolData(Ref->getSymbol());
+ }
+ MCSymbolData &Data = AliasData ? *AliasData : OrigData;
+
+ uint8_t Binding = GetBinding(OrigData);
+ uint8_t Visibility = GetVisibility(OrigData);
+ uint8_t Type = GetType(Data);
+
+ uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
+ uint8_t Other = Visibility;
+