Skip to content

Commit

Permalink
[ELF] Prevent crash when reporting errors if debug line cannot be parsed
Browse files Browse the repository at this point in the history
LLD uses the debug info and debug line sections to determine the location of
e.g. references to undefined symbols, when producing error messages. In the
event that debug info was present, but debug line parsing failed for some
reason, then a nullptr would end up being dereferenced by the location-lookup
code.

Differential Revision: https://reviews.llvm.org/D44205

Reviewers: grimar
llvm-svn: 326899
  • Loading branch information
jh7370 committed Mar 7, 2018
1 parent cb9e89c commit cb4c19f
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
2 changes: 2 additions & 0 deletions lld/ELF/InputFiles.cpp
Expand Up @@ -126,6 +126,8 @@ template <class ELFT> void ObjFile<ELFT>::initializeDwarf() {
// CU (object file), so offset is always 0.
const DWARFDebugLine::LineTable *LT =
DwarfLine->getOrParseLineTable(LineData, 0, Dwarf, nullptr);
if (!LT)
return;

// Return if there is no debug information about CU available.
if (!Dwarf.getNumCompileUnits())
Expand Down
44 changes: 44 additions & 0 deletions lld/test/ELF/Inputs/undef-bad-debug.s
@@ -0,0 +1,44 @@
.section .text,"ax"
sym:
.quad zed6

.section .debug_info,"",@progbits
.long .Lcu_end - .Lcu_start # Length of Unit
.Lcu_start:
.short 4 # DWARF version number
.long .Lsection_abbrev # Offset Into Abbrev. Section
.byte 8 # Address Size (in bytes)
.byte 1 # Abbrev [1] 0xb:0x79 DW_TAG_compile_unit
.byte 2 # Abbrev [2] 0x2a:0x15 DW_TAG_variable
.long .Linfo_string # DW_AT_name
# DW_AT_external
.byte 1 # DW_AT_decl_file
.byte 3 # DW_AT_decl_line
.byte 0 # End Of Children Mark
.Lcu_end:

.section .debug_abbrev,"",@progbits
.Lsection_abbrev:
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 1 # DW_CHILDREN_yes
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 2 # Abbreviation Code
.byte 52 # DW_TAG_variable
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 63 # DW_AT_external
.byte 25 # DW_FORM_flag_present
.byte 58 # DW_AT_decl_file
.byte 11 # DW_FORM_data1
.byte 59 # DW_AT_decl_line
.byte 11 # DW_FORM_data1
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 0 # EOM(3)

.section .debug_str,"MS",@progbits,1
.Linfo_string:
.asciz "sym"
8 changes: 6 additions & 2 deletions lld/test/ELF/undef.s
Expand Up @@ -2,9 +2,10 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/undef.s -o %t2.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/undef-debug.s -o %t3.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/undef-bad-debug.s -o %t4.o
# RUN: llvm-ar rc %t2.a %t2.o
# RUN: not ld.lld %t.o %t2.a %t3.o -o %t.exe 2>&1 | FileCheck %s
# RUN: not ld.lld -pie %t.o %t2.a %t3.o -o %t.exe 2>&1 | FileCheck %s
# RUN: not ld.lld %t.o %t2.a %t3.o %t4.o -o %t.exe 2>&1 | FileCheck %s
# RUN: not ld.lld -pie %t.o %t2.a %t3.o %t4.o -o %t.exe 2>&1 | FileCheck %s

# CHECK: error: undefined symbol: foo
# CHECK: >>> referenced by undef.s
Expand Down Expand Up @@ -33,6 +34,9 @@
# CHECK: >>> referenced by undef-debug.s:11 (dir{{/|\\}}undef-debug.s:11)
# CHECK: >>> {{.*}}.o:(.text.2+0x0)

# CHECK: error: undefined symbol: zed6
# CHECK: >>> referenced by {{.*}}tmp4.o:(.text+0x0)

# RUN: not ld.lld %t.o %t2.a -o %t.exe -no-demangle 2>&1 | \
# RUN: FileCheck -check-prefix=NO-DEMANGLE %s
# NO-DEMANGLE: error: undefined symbol: _Z3fooi
Expand Down

0 comments on commit cb4c19f

Please sign in to comment.