diff --git a/test/tools/llvm-objcopy/ELF/localize.test b/test/tools/llvm-objcopy/ELF/localize.test index a04c51d8fc1..50cdce78da1 100644 --- a/test/tools/llvm-objcopy/ELF/localize.test +++ b/test/tools/llvm-objcopy/ELF/localize.test @@ -1,6 +1,7 @@ # RUN: yaml2obj %s > %t # RUN: llvm-objcopy \ # RUN: --localize-symbol Global \ +# RUN: -L GlobalUndef \ # RUN: -L Local \ # RUN: -L Weak \ # RUN: -L GlobalCommon \ @@ -45,6 +46,8 @@ Symbols: Size: 8 Section: .text Value: 0x1010 + - Name: GlobalUndef + Type: STT_FUNC - Name: GlobalCommon Type: STT_OBJECT Index: SHN_COMMON @@ -89,6 +92,15 @@ Symbols: #CHECK-NEXT: Section: .text #CHECK-NEXT: } #CHECK-NEXT: Symbol { +#CHECK-NEXT: Name: GlobalUndef +#CHECK-NEXT: Value: +#CHECK-NEXT: Size: +#CHECK-NEXT: Binding: Global +#CHECK-NEXT: Type: Function +#CHECK-NEXT: Other: +#CHECK-NEXT: Section: Undefined +#CHECK-NEXT: } +#CHECK-NEXT: Symbol { #CHECK-NEXT: Name: GlobalCommon #CHECK-NEXT: Value: 0x2006 #CHECK-NEXT: Size: 2 diff --git a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index e77361e285a..2dd2fe9c9a9 100644 --- a/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -287,7 +287,9 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj, // them. if (Obj.SymbolTable) { Obj.SymbolTable->updateSymbols([&](Symbol &Sym) { - if (!Sym.isCommon() && + // Common and undefined symbols don't make sense as local symbols, and can + // even cause crashes if we localize those, so skip them. + if (!Sym.isCommon() && Sym.getShndx() != SHN_UNDEF && ((Config.LocalizeHidden && (Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL)) || is_contained(Config.SymbolsToLocalize, Sym.Name)))