Index: ELF/Config.h =================================================================== --- ELF/Config.h +++ ELF/Config.h @@ -105,6 +105,7 @@ std::vector VersionScriptLocals; std::vector BuildIdVector; llvm::MapVector RenamedSymbols; + std::vector> WrapSymbols; bool AllowMultipleDefinition; bool AsNeeded = false; bool Bsymbolic; Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -169,6 +169,11 @@ Config->RenamedSymbols[Real] = {Sym, Real->Binding}; Config->RenamedSymbols[Sym] = {Wrap, Sym->Binding}; + + auto It = Symtab.find(CachedHashStringRef(Wrap->body()->getName())); + std::pair Foo = + std::make_pair(It->second.Idx, (Symbol *)Real); + Config->WrapSymbols.push_back(Foo); } // Creates alias for symbol. Used to implement --defsym=ALIAS=SYM. @@ -192,12 +197,23 @@ // LTO (if LTO is running) not to include these symbols in IPO. Now that the // symbols are finalized, we can perform the replacement. template void SymbolTable::applySymbolRenames() { + std::vector Origs; + Origs.resize(Config->WrapSymbols.size()); + for (unsigned I = 0, N = Config->WrapSymbols.size(); I < N; ++I) { + Symbol *S = Config->WrapSymbols[I].second; + memcpy(&Origs[I], S, sizeof(Symbol)); + } for (auto &KV : Config->RenamedSymbols) { Symbol *Dst = KV.first; Symbol *Src = KV.second.Target; Dst->body()->copy(Src->body()); Dst->Binding = KV.second.OriginalBinding; } + for (unsigned I = 0, N = Config->WrapSymbols.size(); I < N; ++I) { + unsigned Idx = Config->WrapSymbols[I].first; + SymVector[Idx] = make(); + memcpy(SymVector[Idx], &Origs[I], sizeof(Symbol)); + } } static uint8_t getMinVisibility(uint8_t VA, uint8_t VB) { Index: test/ELF/lto/wrap-2.ll =================================================================== --- test/ELF/lto/wrap-2.ll +++ test/ELF/lto/wrap-2.ll @@ -14,11 +14,11 @@ ; CHECK-NEXT: callq{{.*}} ; Check that bar and __wrap_bar retain their original binding. -; BIND: Name: bar +; BIND: Name: __wrap_bar ; BIND-NEXT: Value: ; BIND-NEXT: Size: ; BIND-NEXT: Binding: Local -; BIND: Name: __wrap_bar +; BIND: Name: bar ; BIND-NEXT: Value: ; BIND-NEXT: Size: ; BIND-NEXT: Binding: Local Index: test/ELF/wrap.s =================================================================== --- test/ELF/wrap.s +++ test/ELF/wrap.s @@ -19,8 +19,8 @@ // RUN: llvm-readobj -t -s %t3 | FileCheck -check-prefix=SYM %s // SYM: Name: foo // SYM-NEXT: Value: 0x11000 -// SYM: Name: __wrap_foo -// SYM-NEXT: Value: 0x11010 +// SYM: Name: __real_foo +// SYM-NEXT: Value: 0x11020 // SYM: Name: __wrap_foo // SYM-NEXT: Value: 0x11010