forked from Imagelibrary/binutils-gdb
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.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2020-05-04 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
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 <amodra@gmail.com>
|
2020-05-04 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* readelf.c (process_nds32_specific): Check size of .nds32_e_flags
|
* readelf.c (process_nds32_specific): Check size of .nds32_e_flags
|
||||||
|
|||||||
@@ -4343,6 +4343,8 @@ display_debug_lines_decoded (struct dwarf_section * section,
|
|||||||
|
|
||||||
/* Skip directories format. */
|
/* Skip directories format. */
|
||||||
SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
|
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;
|
format_start = data;
|
||||||
for (formati = 0; formati < format_count; formati++)
|
for (formati = 0; formati < format_count; formati++)
|
||||||
{
|
{
|
||||||
@@ -4357,8 +4359,11 @@ display_debug_lines_decoded (struct dwarf_section * section,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
directory_table = (unsigned char **)
|
if (n_directories == 0)
|
||||||
xmalloc (n_directories * sizeof (unsigned char *));
|
directory_table = NULL;
|
||||||
|
else
|
||||||
|
directory_table = (unsigned char **)
|
||||||
|
xmalloc (n_directories * sizeof (unsigned char *));
|
||||||
|
|
||||||
for (entryi = 0; entryi < n_directories; entryi++)
|
for (entryi = 0; entryi < n_directories; entryi++)
|
||||||
{
|
{
|
||||||
@@ -4411,6 +4416,9 @@ display_debug_lines_decoded (struct dwarf_section * section,
|
|||||||
|
|
||||||
/* Skip files format. */
|
/* Skip files format. */
|
||||||
SAFE_BYTE_GET_AND_INC (format_count, data, 1, end);
|
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;
|
format_start = data;
|
||||||
for (formati = 0; formati < format_count; formati++)
|
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);
|
READ_ULEB (n_files, data, end);
|
||||||
if (data == end)
|
if (data == end && n_files > 0)
|
||||||
{
|
{
|
||||||
warn (_("Corrupt file name list\n"));
|
warn (_("Corrupt file name list\n"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
file_table = (File_Entry *) xcalloc (1, n_files
|
if (n_files == 0)
|
||||||
* sizeof (File_Entry));
|
file_table = NULL;
|
||||||
|
else
|
||||||
|
file_table = (File_Entry *) xcalloc (1, n_files
|
||||||
|
* sizeof (File_Entry));
|
||||||
|
|
||||||
for (entryi = 0; entryi < n_files; entryi++)
|
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. */
|
/* Print the Compilation Unit's name and a header. */
|
||||||
if (file_table == NULL)
|
if (file_table == NULL)
|
||||||
;
|
printf (_("CU: No directory table\n"));
|
||||||
else if (directory_table == NULL)
|
else if (directory_table == NULL)
|
||||||
printf (_("CU: %s:\n"), file_table[0].name);
|
printf (_("CU: %s:\n"), file_table[0].name);
|
||||||
else
|
else
|
||||||
@@ -4610,7 +4621,10 @@ display_debug_lines_decoded (struct dwarf_section * section,
|
|||||||
printf ("%s:\n", file_table[0].name);
|
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;
|
saved_linfo = linfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
2020-05-04 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
2020-05-04 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
2020-05-04 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||||
|
|
||||||
PR gas/25863
|
PR gas/25863
|
||||||
@@ -10,6 +12,9 @@
|
|||||||
PR 25917
|
PR 25917
|
||||||
* dwarf2dbg.c (out_dir_and_file_list): Check for the directory
|
* dwarf2dbg.c (out_dir_and_file_list): Check for the directory
|
||||||
table's existence before looking at its entries.
|
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.s: New test source file.
|
||||||
* testsuite/gas/elf/pr25917.d: New test driver.
|
* testsuite/gas/elf/pr25917.d: New test driver.
|
||||||
* testsuite/gas/elf/elf.exp (run_elf_list_test): Run the new test.
|
* testsuite/gas/elf/elf.exp (run_elf_list_test): Run the new test.
|
||||||
|
|||||||
@@ -1981,7 +1981,6 @@ out_dir_and_file_list (void)
|
|||||||
bfd_boolean emit_filesize = TRUE;
|
bfd_boolean emit_filesize = TRUE;
|
||||||
|
|
||||||
/* Output the Directory Table. */
|
/* Output the Directory Table. */
|
||||||
|
|
||||||
if (DWARF2_LINE_VERSION >= 5)
|
if (DWARF2_LINE_VERSION >= 5)
|
||||||
{
|
{
|
||||||
out_byte (1);
|
out_byte (1);
|
||||||
@@ -1993,7 +1992,7 @@ out_dir_and_file_list (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Emit directory list. */
|
/* Emit directory list. */
|
||||||
if (DWARF2_LINE_VERSION >= 5)
|
if (DWARF2_LINE_VERSION >= 5 && dirs_in_use > 0)
|
||||||
{
|
{
|
||||||
if (dirs == NULL || dirs[0] == NULL)
|
if (dirs == NULL || dirs[0] == NULL)
|
||||||
dir = remap_debug_filename (".");
|
dir = remap_debug_filename (".");
|
||||||
@@ -2017,7 +2016,6 @@ out_dir_and_file_list (void)
|
|||||||
out_byte ('\0');
|
out_byte ('\0');
|
||||||
|
|
||||||
/* Output the File Name Table. */
|
/* Output the File Name Table. */
|
||||||
|
|
||||||
if (DWARF2_LINE_VERSION >= 5)
|
if (DWARF2_LINE_VERSION >= 5)
|
||||||
{
|
{
|
||||||
unsigned int columns = 4;
|
unsigned int columns = 4;
|
||||||
@@ -2045,7 +2043,6 @@ out_dir_and_file_list (void)
|
|||||||
|
|
||||||
/* The number of format entries to follow. */
|
/* The number of format entries to follow. */
|
||||||
out_byte (columns);
|
out_byte (columns);
|
||||||
|
|
||||||
/* The format of the file name. */
|
/* The format of the file name. */
|
||||||
out_uleb128 (DW_LNCT_path);
|
out_uleb128 (DW_LNCT_path);
|
||||||
/* FIXME: it would be better to store these strings in
|
/* FIXME: it would be better to store these strings in
|
||||||
|
|||||||
Reference in New Issue
Block a user