From: Matt Davis Date: Thu, 14 Feb 2019 23:50:35 +0000 (+0000) Subject: [symbolizer] Avoid collecting symbols belonging to invalid sections. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=925de09633b0f91b1e082ca0a0448aaf854c1f1a;p=llvm [symbolizer] Avoid collecting symbols belonging to invalid sections. Summary: llvm-symbolizer would originally report symbols that belonged to an invalid object file section. Specifically the case where: `*Symbol.getSection() == ObjFile.section_end()` This patch prevents the Symbolizer from collecting symbols that belong to invalid sections. The test (from PR40591) introduces a case where two symbols have address 0, one symbol is defined, 'foo', and the other is not defined, 'bar'. This patch will cause the Symbolizer to keep 'foo' and ignore 'bar'. As a side note, the logic for adding symbols to the Symbolizer's store (`SymbolizableObjectFile::addSymbol`) replaces symbols with the same pair. At some point that logic should be revisited as in the aforementioned case, 'bar' was overwriting 'foo' in the Symbolizer's store, and 'foo' was forgotten. This fixes PR40591 Reviewers: jhenderson, rupprecht Reviewed By: rupprecht Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58146 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354083 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index 21f017e768c..4f528f750a6 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -136,6 +136,11 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol, uint64_t SymbolSize, DataExtractor *OpdExtractor, uint64_t OpdAddress) { + // Avoid adding symbols from an unknown/undefined section. + const ObjectFile *Obj = Symbol.getObject(); + Expected Sec = Symbol.getSection(); + if (!Sec || (Obj && Obj->section_end() == *Sec)) + return std::error_code(); Expected SymbolTypeOrErr = Symbol.getType(); if (!SymbolTypeOrErr) return errorToErrorCode(SymbolTypeOrErr.takeError()); diff --git a/test/tools/llvm-symbolizer/ignore-undefined-symbols.s b/test/tools/llvm-symbolizer/ignore-undefined-symbols.s new file mode 100644 index 00000000000..62b7df32dc5 --- /dev/null +++ b/test/tools/llvm-symbolizer/ignore-undefined-symbols.s @@ -0,0 +1,12 @@ +# REQUIRES: x86-registered-target +# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.o -g +# RUN: llvm-symbolizer --obj=%t.o 0 | FileCheck %s --implicit-check-not=bar + +# CHECK: foo +# CHECK-NEXT: ignore-undefined-symbols.s:12:0 + +.type bar,@function +.type foo,@function +.global foo +foo: + call bar