Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -671,9 +671,11 @@ // Report an undefined symbol if necessary. // Returns true if this function printed out an error message. +template static bool maybeReportUndefined(Symbol &Sym, InputSectionBase &Sec, - uint64_t Offset) { - if (Sym.isLocal() || !Sym.isUndefined() || Sym.isWeak()) + const RelTy &Rel) { + if (!Sym.isUndefined() || Sym.isWeak() || + Rel.getSymbol(Config->IsMips64EL) == 0) return false; bool CanBeExternal = @@ -690,10 +692,10 @@ Msg += "protected "; Msg += "symbol: " + toString(Sym) + "\n>>> referenced by "; - std::string Src = Sec.getSrcMsg(Sym, Offset); + std::string Src = Sec.getSrcMsg(Sym, Rel.r_offset); if (!Src.empty()) Msg += Src + "\n>>> "; - Msg += Sec.getObjMsg(Offset); + Msg += Sec.getObjMsg(Rel.r_offset); if (Sym.getName().startswith("_ZTV")) Msg += "\nthe vtable symbol may be undefined because the class is missing " @@ -1027,7 +1029,7 @@ return; // Skip if the target symbol is an erroneous undefined symbol. - if (maybeReportUndefined(Sym, Sec, Rel.r_offset)) + if (maybeReportUndefined(Sym, Sec, Rel)) return; const uint8_t *RelocatedAddr = Sec.data().begin() + Rel.r_offset; Index: test/ELF/amdgpu-relocs.s =================================================================== --- test/ELF/amdgpu-relocs.s +++ test/ELF/amdgpu-relocs.s @@ -2,7 +2,7 @@ # RUN: llvm-mc -filetype=obj -triple=amdgcn--amdhsa -mcpu=fiji %s -o %t.o # RUN: ld.lld --hash-style=sysv -shared %t.o -o %t.so # RUN: llvm-readobj -r %t.so | FileCheck %s -# RUN: llvm-objdump -s %t.so | FileCheck %s --check-prefix=OBJDUMP +# RUN: llvm-readelf -x .rodata -x nonalloc %t.so | FileCheck %s --check-prefix=HEX .text @@ -48,6 +48,9 @@ .local local_var0 .local local_var1 .local local_var2 + local_var0: + local_var1: + local_var2: # R_AMDGPU_ABS32: .section nonalloc, "w", @progbits @@ -68,6 +71,7 @@ .type temp2, @object .local temp2 .size temp2, 4 + temp2: .type ptr2, @object .globl ptr2 @@ -89,7 +93,7 @@ # linker. # CHECK: Relocations [ # CHECK: .rela.dyn { -# CHECK-NEXT: R_AMDGPU_RELATIVE64 - 0x0 +# CHECK-NEXT: R_AMDGPU_RELATIVE64 - 0x3008 # CHECK-NEXT: R_AMDGPU_ABS64 common_var0 0x0 # CHECK-NEXT: R_AMDGPU_ABS64 common_var1 0x0 # CHECK-NEXT: R_AMDGPU_ABS64 common_var2 0x0 @@ -109,9 +113,9 @@ # CHECK-NEXT: } # CHECK-NEXT: ] -# OBJDUMP: Contents of section .rodata: -# OBJDUMP: 98f8ffff ffffffff +# HEX: section '.rodata': +# HEX-NEXT: 0x00000768 a0280000 00000000 -# OBJDUMP: Contents of section nonalloc: -# OBJDUMP-NEXT: 0000 00000000 14380000 00000000 18340000 -# OBJDUMP-NEXT: 00000000 1c300000 +# HEX: section 'nonalloc': +# HEX-NEXT: 0x00000000 00000000 14380000 00000000 18340000 +# HEX-NEXT: 0x00000010 00000000 1c300000 Index: test/ELF/local-undefined-symbol.s =================================================================== --- test/ELF/local-undefined-symbol.s +++ test/ELF/local-undefined-symbol.s @@ -1,10 +1,8 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t -# RUN: ld.lld %t -o %t1 -# RUN: llvm-readobj --symbols %t1 | FileCheck %s +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s -# CHECK: Symbols [ -# CHECK-NOT: Name: foo +# CHECK: error: undefined symbol: foo .global _start _start: