From 070b775f03ebdab6d0d007787fe19b916af4439c Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 4 May 2020 13:50:05 +0100 Subject: [PATCH] GAS: Do not create an entry for the default directory if the directory table is empty. Improve readelf's decoding of empty directory and file name tables. PR 25917 * dwarf.c (display_debug_lines_decoded): Warn if encountering a supicious number of entries for DWARF-5 format directory and file name tables. Do not display file name table header if the table is empty. Do not allocate space for empty tables. --- binutils/ChangeLog | 8 ++++++++ binutils/dwarf.c | 28 +++++++++++++++++++++------- gas/ChangeLog | 5 +++++ gas/dwarf2dbg.c | 5 +---- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 7b0d1a0477e..7cc692b3e5b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2020-05-04 Nick Clifton + + PR 25917 + * dwarf.c (display_debug_lines_decoded): Warn if encountering a + supicious number of entries for DWARF-5 format directory and file + name tables. Do not display file name table header if the table + is empty. Do not allocate space for empty tables. + 2020-05-04 Alan Modra * readelf.c (process_nds32_specific): Check size of .nds32_e_flags diff --git a/binutils/dwarf.c b/binutils/dwarf.c index eb053ce1f15..61373bf44a2 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -4343,6 +4343,8 @@ display_debug_lines_decoded (struct dwarf_section * section, /* Skip directories format. */ SAFE_BYTE_GET_AND_INC (format_count, data, 1, end); + if (format_count > 1) + warn ("Unexpectedly large number of columns in the directory name table (%u)\n", format_count); format_start = data; for (formati = 0; formati < format_count; formati++) { @@ -4357,8 +4359,11 @@ display_debug_lines_decoded (struct dwarf_section * section, break; } - directory_table = (unsigned char **) - xmalloc (n_directories * sizeof (unsigned char *)); + if (n_directories == 0) + directory_table = NULL; + else + directory_table = (unsigned char **) + xmalloc (n_directories * sizeof (unsigned char *)); for (entryi = 0; entryi < n_directories; entryi++) { @@ -4411,6 +4416,9 @@ display_debug_lines_decoded (struct dwarf_section * section, /* Skip files format. */ SAFE_BYTE_GET_AND_INC (format_count, data, 1, end); + if (format_count > 5) + warn ("Unexpectedly large number of columns in the file name table (%u)\n", format_count); + format_count = 2; format_start = data; for (formati = 0; formati < format_count; formati++) { @@ -4419,14 +4427,17 @@ display_debug_lines_decoded (struct dwarf_section * section, } READ_ULEB (n_files, data, end); - if (data == end) + if (data == end && n_files > 0) { warn (_("Corrupt file name list\n")); break; } - file_table = (File_Entry *) xcalloc (1, n_files - * sizeof (File_Entry)); + if (n_files == 0) + file_table = NULL; + else + file_table = (File_Entry *) xcalloc (1, n_files + * sizeof (File_Entry)); for (entryi = 0; entryi < n_files; entryi++) { @@ -4582,7 +4593,7 @@ display_debug_lines_decoded (struct dwarf_section * section, /* Print the Compilation Unit's name and a header. */ if (file_table == NULL) - ; + printf (_("CU: No directory table\n")); else if (directory_table == NULL) printf (_("CU: %s:\n"), file_table[0].name); else @@ -4610,7 +4621,10 @@ display_debug_lines_decoded (struct dwarf_section * section, printf ("%s:\n", file_table[0].name); } - printf (_("File name Line number Starting address View Stmt\n")); + if (n_files > 0) + printf (_("File name Line number Starting address View Stmt\n")); + else + printf (_("CU: Empty file name table\n")); saved_linfo = linfo; } diff --git a/gas/ChangeLog b/gas/ChangeLog index 20ae8178340..8d664f5aa19 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,5 @@ +2020-05-04 Nick Clifton + 2020-05-04 Andre Vieira PR gas/25863 @@ -10,6 +12,9 @@ PR 25917 * dwarf2dbg.c (out_dir_and_file_list): Check for the directory table's existence before looking at its entries. + Also do not emit a default directory entry if there are no + directories in use. + * testsuite/gas/elf/pr25917.s: New test source file. * testsuite/gas/elf/pr25917.d: New test driver. * testsuite/gas/elf/elf.exp (run_elf_list_test): Run the new test. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 213f3828877..071450e19a1 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -1981,7 +1981,6 @@ out_dir_and_file_list (void) bfd_boolean emit_filesize = TRUE; /* Output the Directory Table. */ - if (DWARF2_LINE_VERSION >= 5) { out_byte (1); @@ -1993,7 +1992,7 @@ out_dir_and_file_list (void) } /* Emit directory list. */ - if (DWARF2_LINE_VERSION >= 5) + if (DWARF2_LINE_VERSION >= 5 && dirs_in_use > 0) { if (dirs == NULL || dirs[0] == NULL) dir = remap_debug_filename ("."); @@ -2017,7 +2016,6 @@ out_dir_and_file_list (void) out_byte ('\0'); /* Output the File Name Table. */ - if (DWARF2_LINE_VERSION >= 5) { unsigned int columns = 4; @@ -2045,7 +2043,6 @@ out_dir_and_file_list (void) /* The number of format entries to follow. */ out_byte (columns); - /* The format of the file name. */ out_uleb128 (DW_LNCT_path); /* FIXME: it would be better to store these strings in -- 2.30.2