Index: llvm/trunk/test/tools/llvm-objcopy/prefix-symbols.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/prefix-symbols.test +++ llvm/trunk/test/tools/llvm-objcopy/prefix-symbols.test @@ -0,0 +1,71 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy --prefix-symbols prefix %t %t2 +# RUN: llvm-readobj -symbols %t2 | FileCheck %s --check-prefix=COMMON --check-prefix=BASIC +# RUN: llvm-objcopy --redefine-sym bar=baz --prefix-symbols prefix %t %t3 +# RUN: llvm-readobj -symbols %t3 | FileCheck %s --check-prefix=COMMON --check-prefix=REDEF + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1000 + AddressAlign: 0x0000000000000010 + Size: 64 +Symbols: + Local: + - Name: foo + Type: STT_SECTION + Section: .text + - Name: bar + Type: STT_FILE + Section: .text + Global: + - Name: foobar + Type: STT_FUNC + Section: .text + +# COMMON: Symbols [ +# COMMON-NEXT: Symbol { +# COMMON-NEXT: Name: +# COMMON-NEXT: Value: 0x0 +# COMMON-NEXT: Size: 0 +# COMMON-NEXT: Binding: Local +# COMMON-NEXT: Type: None +# COMMON-NEXT: Other: 0 +# COMMON-NEXT: Section: Undefined +# COMMON-NEXT: } +# COMMON-NEXT: Symbol { +# COMMON-NEXT: Name: foo +# COMMON-NEXT: Value: 0x0 +# COMMON-NEXT: Size: 0 +# COMMON-NEXT: Binding: Local +# COMMON-NEXT: Type: Section +# COMMON-NEXT: Other: 0 +# COMMON-NEXT: Section: .text +# COMMON-NEXT: } +# COMMON-NEXT: Symbol { +# BASIC-NEXT: Name: prefixbar +# REDEF-NEXT: Name: prefixbaz +# COMMON-NEXT: Value: 0x0 +# COMMON-NEXT: Size: 0 +# COMMON-NEXT: Binding: Local +# COMMON-NEXT: Type: File +# COMMON-NEXT: Other: 0 +# COMMON-NEXT: Section: .text +# COMMON-NEXT: } +# COMMON-NEXT: Symbol { +# COMMON-NEXT: Name: prefixfoobar +# COMMON-NEXT: Value: 0x0 +# COMMON-NEXT: Size: 0 +# COMMON-NEXT: Binding: Global +# COMMON-NEXT: Type: Function +# COMMON-NEXT: Other: 0 +# COMMON-NEXT: Section: .text +# COMMON-NEXT: } +# COMMON-NEXT:] Index: llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td =================================================================== --- llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td +++ llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td @@ -105,3 +105,6 @@ defm dump_section : Eq<"dump-section">, MetaVarName<"section=file">, HelpText<"Dump contents of section named
into file ">; +defm prefix_symbols : Eq<"prefix-symbols">, + MetaVarName<"prefix">, + HelpText<"Add to the start of every symbol name">; Index: llvm/trunk/tools/llvm-objcopy/Object.h =================================================================== --- llvm/trunk/tools/llvm-objcopy/Object.h +++ llvm/trunk/tools/llvm-objcopy/Object.h @@ -387,7 +387,7 @@ SectionBase *DefinedIn = nullptr; SymbolShndxType ShndxType; uint32_t Index; - StringRef Name; + std::string Name; uint32_t NameIndex; uint64_t Size; uint8_t Type; Index: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp +++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp @@ -133,6 +133,7 @@ StringRef SplitDWO; StringRef AddGnuDebugLink; + StringRef SymbolsPrefix; std::vector ToRemove; std::vector Keep; std::vector OnlyKeep; @@ -388,6 +389,9 @@ const auto I = Config.SymbolsToRename.find(Sym.Name); if (I != Config.SymbolsToRename.end()) Sym.Name = I->getValue(); + + if (!Config.SymbolsPrefix.empty() && Sym.Type != STT_SECTION) + Sym.Name = (Config.SymbolsPrefix + Sym.Name).str(); }); // The purpose of this loop is to mark symbols referenced by sections @@ -723,6 +727,7 @@ Config.SplitDWO = InputArgs.getLastArgValue(OBJCOPY_split_dwo); Config.AddGnuDebugLink = InputArgs.getLastArgValue(OBJCOPY_add_gnu_debuglink); + Config.SymbolsPrefix = InputArgs.getLastArgValue(OBJCOPY_prefix_symbols); for (auto Arg : InputArgs.filtered(OBJCOPY_redefine_symbol)) { if (!StringRef(Arg->getValue()).contains('='))