Skip to content

Commit 4b0694b

Browse files
committedJan 14, 2019
[llvm-objcopy] [COFF] Remove unreferenced undefined externals with --strip-unneeded.
Differential Revision: https://reviews.llvm.org/D56660 llvm-svn: 351099
1 parent 4707fb6 commit 4b0694b

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed
 

‎llvm/test/tools/llvm-objcopy/COFF/Inputs/discard-locals.yaml

+10-1
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ sections:
66
- Name: .text
77
Characteristics: [ ]
88
Alignment: 4
9-
SectionData: E800000000C3C3C3
9+
SectionData: E800000000E800000000C3C3C3
1010
Relocations:
1111
- VirtualAddress: 1
1212
SymbolName: local_referenced
1313
Type: IMAGE_REL_AMD64_REL32
14+
- VirtualAddress: 5
15+
SymbolName: external_undefined
16+
Type: IMAGE_REL_AMD64_REL32
1417
symbols:
1518
- Name: external
1619
Value: 0
@@ -24,6 +27,12 @@ symbols:
2427
SimpleType: IMAGE_SYM_TYPE_NULL
2528
ComplexType: IMAGE_SYM_DTYPE_NULL
2629
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
30+
- Name: external_undefined_unreferenced
31+
Value: 0
32+
SectionNumber: 0
33+
SimpleType: IMAGE_SYM_TYPE_NULL
34+
ComplexType: IMAGE_SYM_DTYPE_NULL
35+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
2736
- Name: local_unreferenced
2837
Value: 6
2938
SectionNumber: 1

‎llvm/test/tools/llvm-objcopy/COFF/discard-all.test

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ RUN: cmp %t.out.o %t.strip-discard-all.o
1919
SYMBOLS: SYMBOL TABLE:
2020
SYMBOLS-NEXT: external
2121
SYMBOLS-NEXT: external_undefined
22+
SYMBOLS-NEXT: external_undefined_unreferenced
2223
SYMBOLS-PRE-NEXT: local_unreferenced
2324
SYMBOLS-NEXT: local_referenced
2425
SYMBOLS-NEXT: local_undefined_unreferenced

‎llvm/test/tools/llvm-objcopy/COFF/strip-unneeded.test

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS
88
SYMBOLS: SYMBOL TABLE:
99
SYMBOLS-NEXT: external
1010
SYMBOLS-NEXT: external_undefined
11+
SYMBOLS-PRE-NEXT: external_undefined_unreferenced
1112
SYMBOLS-PRE-NEXT: local_unreferenced
1213
SYMBOLS-NEXT: local_referenced
1314
SYMBOLS-PRE-NEXT: local_undefined_unreferenced

‎llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,19 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
4747
return true;
4848
}
4949

50-
if (!Sym.Referenced && Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC) {
51-
if (Config.StripUnneeded)
50+
if (!Sym.Referenced) {
51+
// With --strip-unneeded, GNU objcopy removes all unreferenced local
52+
// symbols, and any unreferenced undefined external.
53+
if (Config.StripUnneeded &&
54+
(Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC ||
55+
Sym.Sym.SectionNumber == 0))
5256
return true;
57+
5358
// GNU objcopy keeps referenced local symbols and external symbols
5459
// if --discard-all is set, similar to what --strip-unneeded does,
5560
// but undefined local symbols are kept when --discard-all is set.
56-
if (Config.DiscardAll && Sym.Sym.SectionNumber != 0)
61+
if (Config.DiscardAll && Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC &&
62+
Sym.Sym.SectionNumber != 0)
5763
return true;
5864
}
5965

0 commit comments

Comments
 (0)
Please sign in to comment.