]> granicus.if.org Git - llvm/commitdiff
[llvm-objcopy] [COFF] Remove unreferenced undefined externals with --strip-unneeded.
authorMartin Storsjo <martin@martin.st>
Mon, 14 Jan 2019 18:56:47 +0000 (18:56 +0000)
committerMartin Storsjo <martin@martin.st>
Mon, 14 Jan 2019 18:56:47 +0000 (18:56 +0000)
Differential Revision: https://reviews.llvm.org/D56660

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351099 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objcopy/COFF/Inputs/discard-locals.yaml
test/tools/llvm-objcopy/COFF/discard-all.test
test/tools/llvm-objcopy/COFF/strip-unneeded.test
tools/llvm-objcopy/COFF/COFFObjcopy.cpp

index 0a8def855ee865ec0ddcccfa49449b1993747146..8b34e8fffed02cfb30ac4195003eff95bc692e3f 100644 (file)
@@ -6,11 +6,14 @@ sections:
   - Name:            .text
     Characteristics: [  ]
     Alignment:       4
-    SectionData:     E800000000C3C3C3
+    SectionData:     E800000000E800000000C3C3C3
     Relocations:     
       - VirtualAddress:  1
         SymbolName:      local_referenced
         Type:            IMAGE_REL_AMD64_REL32
+      - VirtualAddress:  5
+        SymbolName:      external_undefined
+        Type:            IMAGE_REL_AMD64_REL32
 symbols:         
   - Name:            external
     Value:           0
@@ -24,6 +27,12 @@ symbols:
     SimpleType:      IMAGE_SYM_TYPE_NULL
     ComplexType:     IMAGE_SYM_DTYPE_NULL
     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+  - Name:            external_undefined_unreferenced
+    Value:           0
+    SectionNumber:   0
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
   - Name:            local_unreferenced
     Value:           6
     SectionNumber:   1
index 2ea4f444509b9ef61fc2a6179d1475b487cd37a1..5d7d5cef2f36094a54601de40d45fa2e502ff99e 100644 (file)
@@ -19,6 +19,7 @@ RUN: cmp %t.out.o %t.strip-discard-all.o
 SYMBOLS: SYMBOL TABLE:
 SYMBOLS-NEXT: external
 SYMBOLS-NEXT: external_undefined
+SYMBOLS-NEXT: external_undefined_unreferenced
 SYMBOLS-PRE-NEXT: local_unreferenced
 SYMBOLS-NEXT: local_referenced
 SYMBOLS-NEXT: local_undefined_unreferenced
index bbecb15e3e4dc8f1cadded855a831d5e27ec37e2..569bc8aed2f3691b16282925255ddca2fdbc9a8a 100644 (file)
@@ -8,6 +8,7 @@ RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS
 SYMBOLS: SYMBOL TABLE:
 SYMBOLS-NEXT: external
 SYMBOLS-NEXT: external_undefined
+SYMBOLS-PRE-NEXT: external_undefined_unreferenced
 SYMBOLS-PRE-NEXT: local_unreferenced
 SYMBOLS-NEXT: local_referenced
 SYMBOLS-PRE-NEXT: local_undefined_unreferenced
index d48bd0267faeaf2e4bbdaac10c298f1159e24d4c..ea46b841bcff4550225004c0c0cae17f0122c6b2 100644 (file)
@@ -47,13 +47,19 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
       return true;
     }
 
-    if (!Sym.Referenced && Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC) {
-      if (Config.StripUnneeded)
+    if (!Sym.Referenced) {
+      // With --strip-unneeded, GNU objcopy removes all unreferenced local
+      // symbols, and any unreferenced undefined external.
+      if (Config.StripUnneeded &&
+          (Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC ||
+           Sym.Sym.SectionNumber == 0))
         return true;
+
       // GNU objcopy keeps referenced local symbols and external symbols
       // if --discard-all is set, similar to what --strip-unneeded does,
       // but undefined local symbols are kept when --discard-all is set.
-      if (Config.DiscardAll && Sym.Sym.SectionNumber != 0)
+      if (Config.DiscardAll && Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC &&
+          Sym.Sym.SectionNumber != 0)
         return true;
     }