Index: test/tools/llvm-objcopy/prefix-symbols.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/prefix-symbols.test @@ -0,0 +1,109 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy --prefix-symbols prefix %t %t2 +# RUN: llvm-readobj -symbols %t2 | FileCheck %s +# RUN: llvm-objcopy --redefine-sym bar=baz --prefix-symbols prefix %t %t3 +# RUN: llvm-readobj -symbols %t3 | FileCheck %s --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 + +# CHECK: Symbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: foo +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: Section +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: prefixbar +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: File +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: prefixfoobar +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT:] + +# REDEF: Symbols [ +# REDEF-NEXT: Symbol { +# REDEF-NEXT: Name: +# REDEF-NEXT: Value: 0x0 +# REDEF-NEXT: Size: 0 +# REDEF-NEXT: Binding: Local +# REDEF-NEXT: Type: None +# REDEF-NEXT: Other: 0 +# REDEF-NEXT: Section: Undefined +# REDEF-NEXT: } +# REDEF-NEXT: Symbol { +# REDEF-NEXT: Name: foo +# REDEF-NEXT: Value: 0x0 +# REDEF-NEXT: Size: 0 +# REDEF-NEXT: Binding: Local +# REDEF-NEXT: Type: Section +# REDEF-NEXT: Other: 0 +# REDEF-NEXT: Section: .text +# REDEF-NEXT: } +# REDEF-NEXT: Symbol { +# REDEF-NEXT: Name: prefixbaz +# REDEF-NEXT: Value: 0x0 +# REDEF-NEXT: Size: 0 +# REDEF-NEXT: Binding: Local +# REDEF-NEXT: Type: File +# REDEF-NEXT: Other: 0 +# REDEF-NEXT: Section: .text +# REDEF-NEXT: } +# REDEF-NEXT: Symbol { +# REDEF-NEXT: Name: prefixfoobar +# REDEF-NEXT: Value: 0x0 +# REDEF-NEXT: Size: 0 +# REDEF-NEXT: Binding: Global +# REDEF-NEXT: Type: Function +# REDEF-NEXT: Other: 0 +# REDEF-NEXT: Section: .text +# REDEF-NEXT: } +# REDEF-NEXT:] Index: tools/llvm-objcopy/ObjcopyOpts.td =================================================================== --- tools/llvm-objcopy/ObjcopyOpts.td +++ tools/llvm-objcopy/ObjcopyOpts.td @@ -102,3 +102,6 @@ HelpText<"Remove all symbols not needed by relocations">; def keep_file_symbols : Flag<["-", "--"], "keep-file-symbols">, HelpText<"Do not remove file symbols">; +defm prefix_symbols : Eq<"prefix-symbols">, + MetaVarName<"prefix">, + HelpText<"Add to the start of every symbol name">; Index: tools/llvm-objcopy/Object.h =================================================================== --- tools/llvm-objcopy/Object.h +++ tools/llvm-objcopy/Object.h @@ -386,7 +386,7 @@ SectionBase *DefinedIn = nullptr; SymbolShndxType ShndxType; uint32_t Index; - StringRef Name; + std::string Name; uint32_t NameIndex; uint64_t Size; uint8_t Type; Index: tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- tools/llvm-objcopy/llvm-objcopy.cpp +++ 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; @@ -363,6 +364,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.str() + Sym.Name; }); // The purpose of this loop is to mark symbols referenced by sections @@ -688,6 +692,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('='))