Skip to content

Commit ee5be79

Browse files
committed
[llvm-objcopy] Add --globalize-symbol option
llvm-svn: 331068
1 parent 345f873 commit ee5be79

File tree

3 files changed

+86
-3
lines changed

3 files changed

+86
-3
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# RUN: yaml2obj %s > %t
2+
# RUN: llvm-objcopy --globalize-symbol Global --globalize-symbol Local --globalize-symbol Weak %t %t2
3+
# RUN: llvm-readobj -symbols %t2 | FileCheck %s
4+
5+
!ELF
6+
FileHeader:
7+
Class: ELFCLASS64
8+
Data: ELFDATA2LSB
9+
Type: ET_REL
10+
Machine: EM_X86_64
11+
Sections:
12+
- Name: .text
13+
Type: SHT_PROGBITS
14+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
15+
Address: 0x1000
16+
AddressAlign: 0x0000000000000010
17+
Size: 64
18+
Symbols:
19+
Local:
20+
- Name: Local
21+
Type: STT_FUNC
22+
Section: .text
23+
Value: 0x1000
24+
Size: 8
25+
Weak:
26+
- Name: Weak
27+
Type: STT_FUNC
28+
Size: 8
29+
Section: .text
30+
Value: 0x1008
31+
Global:
32+
- Name: Global
33+
Type: STT_FUNC
34+
Size: 8
35+
Section: .text
36+
Value: 0x1010
37+
38+
#CHECK: Symbols [
39+
#CHECK-NEXT: Symbol {
40+
#CHECK-NEXT: Name:
41+
#CHECK-NEXT: Value: 0x0
42+
#CHECK-NEXT: Size: 0
43+
#CHECK-NEXT: Binding: Local
44+
#CHECK-NEXT: Type: None
45+
#CHECK-NEXT: Other: 0
46+
#CHECK-NEXT: Section: Undefined
47+
#CHECK-NEXT: }
48+
#CHECK-NEXT: Symbol {
49+
#CHECK-NEXT: Name: Local
50+
#CHECK-NEXT: Value: 0x1000
51+
#CHECK-NEXT: Size: 8
52+
#CHECK-NEXT: Binding: Global
53+
#CHECK-NEXT: Type: Function
54+
#CHECK-NEXT: Other: 0
55+
#CHECK-NEXT: Section: .text
56+
#CHECK-NEXT: }
57+
#CHECK-NEXT: Symbol {
58+
#CHECK-NEXT: Name: Global
59+
#CHECK-NEXT: Value: 0x1010
60+
#CHECK-NEXT: Size: 8
61+
#CHECK-NEXT: Binding: Global
62+
#CHECK-NEXT: Type: Function
63+
#CHECK-NEXT: Other: 0
64+
#CHECK-NEXT: Section: .text
65+
#CHECK-NEXT: }
66+
#CHECK-NEXT: Symbol {
67+
#CHECK-NEXT: Name: Weak
68+
#CHECK-NEXT: Value: 0x1008
69+
#CHECK-NEXT: Size: 8
70+
#CHECK-NEXT: Binding: Global
71+
#CHECK-NEXT: Type: Function
72+
#CHECK-NEXT: Other: 0
73+
#CHECK-NEXT: Section: .text
74+
#CHECK-NEXT: }
75+
#CHECK-NEXT:]

llvm/tools/llvm-objcopy/Opts.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,6 @@ defm localize_symbol : Eq<"localize-symbol">,
6464
HelpText<"Mark <symbol> as local">;
6565
def L : JoinedOrSeparate<["-"], "L">,
6666
Alias<localize_symbol>;
67+
defm globalize_symbol : Eq<"globalize-symbol">,
68+
MetaVarName<"symbol">,
69+
HelpText<"Mark <symbol> as global">;

llvm/tools/llvm-objcopy/llvm-objcopy.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ struct CopyConfig {
119119
std::vector<StringRef> OnlyKeep;
120120
std::vector<StringRef> AddSection;
121121
std::vector<StringRef> SymbolsToLocalize;
122+
std::vector<StringRef> SymbolsToGlobalize;
122123
StringMap<StringRef> SymbolsToRename;
123124
bool StripAll;
124125
bool StripAllGNU;
@@ -320,11 +321,13 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader,
320321
if ((Config.LocalizeHidden &&
321322
(Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL)) ||
322323
(!Config.SymbolsToLocalize.empty() &&
323-
std::find(std::begin(Config.SymbolsToLocalize),
324-
std::end(Config.SymbolsToLocalize),
325-
Sym.Name) != std::end(Config.SymbolsToLocalize)))
324+
is_contained(Config.SymbolsToLocalize, Sym.Name)))
326325
Sym.Binding = STB_LOCAL;
327326

327+
if (!Config.SymbolsToGlobalize.empty() &&
328+
is_contained(Config.SymbolsToGlobalize, Sym.Name))
329+
Sym.Binding = STB_GLOBAL;
330+
328331
const auto I = Config.SymbolsToRename.find(Sym.Name);
329332
if (I != Config.SymbolsToRename.end())
330333
Sym.Name = I->getValue();
@@ -416,6 +419,8 @@ CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
416419
Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden);
417420
for (auto Arg : InputArgs.filtered(OBJCOPY_localize_symbol))
418421
Config.SymbolsToLocalize.push_back(Arg->getValue());
422+
for (auto Arg : InputArgs.filtered(OBJCOPY_globalize_symbol))
423+
Config.SymbolsToGlobalize.push_back(Arg->getValue());
419424

420425
return Config;
421426
}

0 commit comments

Comments
 (0)