diff --git a/test/Object/Inputs/weak.elf-x86-64 b/test/Object/Inputs/weak.elf-x86-64 new file mode 100644 index 00000000000..e45f9880f9d Binary files /dev/null and b/test/Object/Inputs/weak.elf-x86-64 differ diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index d13d217d2f1..c2d2ebb14b5 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -6,6 +6,8 @@ RUN: llvm-nm %p/Inputs/trivial-object-test.elf-i386 \ RUN: | FileCheck %s -check-prefix ELF RUN: llvm-nm %p/Inputs/trivial-object-test.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-nm %p/Inputs/weak.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix WEAK-ELF RUN: llvm-nm %p/Inputs/trivial-object-test.macho-i386 \ RUN: | FileCheck %s -check-prefix macho RUN: llvm-nm %p/Inputs/trivial-object-test.macho-x86-64 \ @@ -34,6 +36,10 @@ ELF: U SomeOtherFunction ELF: 00000000 T main ELF: U puts +WEAK-ELF: w f1 +WEAK-ELF: 00000000 W f2 +WEAK-ELF: v x1 +WEAK-ELF: 00000000 V x2 macho: 00000000 U _SomeOtherFunction macho: 00000000 T _main diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 5b8bafc8ab0..8d1fa729bd7 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -360,8 +360,12 @@ static char getSymbolNMTypeChar(ELFObjectFile &Obj, symbol_iterator I) { Ret = ::toupper(Ret); break; case ELF::STB_WEAK: - if (EF.getSymbolTableIndex(ESym) == ELF::SHN_UNDEF) - Ret = 'w'; + if (EF.getSymbolTableIndex(ESym) == ELF::SHN_UNDEF) { + if (ESym->getType() == ELF::STT_OBJECT) + Ret = 'v'; + else + Ret = 'w'; + } else if (ESym->getType() == ELF::STT_OBJECT) Ret = 'V'; else