diff options
author | Paul Semel <semelpaul@gmail.com> | 2018-08-09 17:49:04 +0000 |
---|---|---|
committer | Paul Semel <semelpaul@gmail.com> | 2018-08-09 17:49:04 +0000 |
commit | ffc59809e8cbf9fdb6816291589235c33e53e844 (patch) | |
tree | dc736326f8c47d24ecf753c8ac8eb135c0f86b54 | |
parent | 123d5beafd7ae8d89e408d790157edec08e60d01 (diff) |
[llvm-objcopy] Add --prefix-symbols option
Differential Revision: https://reviews.llvm.org/D50381
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339362 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/tools/llvm-objcopy/prefix-symbols.test | 71 | ||||
-rw-r--r-- | tools/llvm-objcopy/ObjcopyOpts.td | 3 | ||||
-rw-r--r-- | tools/llvm-objcopy/Object.h | 2 | ||||
-rw-r--r-- | tools/llvm-objcopy/llvm-objcopy.cpp | 5 |
4 files changed, 80 insertions, 1 deletions
diff --git a/test/tools/llvm-objcopy/prefix-symbols.test b/test/tools/llvm-objcopy/prefix-symbols.test new file mode 100644 index 00000000000..8761ba9fada --- /dev/null +++ b/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:] diff --git a/tools/llvm-objcopy/ObjcopyOpts.td b/tools/llvm-objcopy/ObjcopyOpts.td index 9b872540e91..5e3ac1f7947 100644 --- a/tools/llvm-objcopy/ObjcopyOpts.td +++ b/tools/llvm-objcopy/ObjcopyOpts.td @@ -105,3 +105,6 @@ def keep_file_symbols : Flag<["-", "--"], "keep-file-symbols">, defm dump_section : Eq<"dump-section">, MetaVarName<"section=file">, HelpText<"Dump contents of section named <section> into file <file>">; +defm prefix_symbols : Eq<"prefix-symbols">, + MetaVarName<"prefix">, + HelpText<"Add <prefix> to the start of every symbol name">; diff --git a/tools/llvm-objcopy/Object.h b/tools/llvm-objcopy/Object.h index ba6aea93505..525c5e3a775 100644 --- a/tools/llvm-objcopy/Object.h +++ b/tools/llvm-objcopy/Object.h @@ -387,7 +387,7 @@ struct Symbol { SectionBase *DefinedIn = nullptr; SymbolShndxType ShndxType; uint32_t Index; - StringRef Name; + std::string Name; uint32_t NameIndex; uint64_t Size; uint8_t Type; diff --git a/tools/llvm-objcopy/llvm-objcopy.cpp b/tools/llvm-objcopy/llvm-objcopy.cpp index 0c153d521c7..92b882ae649 100644 --- a/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/tools/llvm-objcopy/llvm-objcopy.cpp @@ -133,6 +133,7 @@ struct CopyConfig { StringRef SplitDWO; StringRef AddGnuDebugLink; + StringRef SymbolsPrefix; std::vector<StringRef> ToRemove; std::vector<StringRef> Keep; std::vector<StringRef> OnlyKeep; @@ -388,6 +389,9 @@ static void HandleArgs(const CopyConfig &Config, Object &Obj, 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 @@ static CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) { 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('=')) |