diff options
-rw-r--r-- | binutils/ChangeLog | 17 | ||||
-rw-r--r-- | binutils/dwarf.c | 27 | ||||
-rw-r--r-- | binutils/dwarf.h | 1 | ||||
-rw-r--r-- | binutils/elfcomm.c | 9 | ||||
-rw-r--r-- | binutils/elfcomm.h | 4 | ||||
-rw-r--r-- | binutils/readelf.c | 31 | ||||
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/dwarf2dbg.c | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/pr25917.d | 4 |
9 files changed, 56 insertions, 48 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 8da40977e1e..7d00344eb0d 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,20 @@ +2020-05-05 Nick Clifton <nickc@redhat.com> + + * dwarf.c (do_checks): New global variable. + (display_formatted_table): Warn about an unexpected number of + columns in the table, if checks are enabled. Do not complain + about the lack of data following the number of entries in the + table if the table is empty. + (display_debug_lines_decoded): Only warn about an unexpected + number of columns in a table if checks are enabled. + * dwarf.h (do_checks): Add a prototype. + * elfcomm.c (error): Remove weak attribute. + (warn): Likewise. + * readelf.c (do_checks): Delete. + (warn): Delete. + (process_section_headers): Only warn about empty sections if + checks are enabled. + 2020-05-04 Fangrui Song <maskray@google.com> * objcopy.c (copy_object): Allow empty section. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 61373bf44a2..7b5f7af8a1e 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -98,6 +98,7 @@ int do_debug_cu_index; int do_wide; int do_debug_links; int do_follow_links; +bfd_boolean do_checks; int dwarf_cutoff_level = -1; unsigned long dwarf_start_die; @@ -3739,6 +3740,10 @@ display_formatted_table (unsigned char * data, const char * table_name = is_dir ? N_("Directory Table") : N_("File Name Table"); SAFE_BYTE_GET_AND_INC (format_count, data, 1, end); + if (do_checks && format_count > 5) + warn (_("Unexpectedly large number of columns in the %s (%u)\n"), + table_name, format_count); + format_start = data; for (formati = 0; formati < format_count; formati++) { @@ -3752,17 +3757,18 @@ display_formatted_table (unsigned char * data, } READ_ULEB (data_count, data, end); - if (data == end) + if (data_count == 0) { - warn (_("%s: Corrupt entry count\n"), table_name); + printf (_("\n The %s is empty.\n"), table_name); return data; } - - if (data_count == 0) + else if (data == end) { - printf (_("\n The %s is empty.\n"), table_name); + warn (_("%s: Corrupt entry count - expected %s but none found\n"), + table_name, dwarf_vmatoa ("x", data_count)); return data; } + else if (format_count == 0) { warn (_("%s: format count is zero, but the table is not empty\n"), @@ -4343,8 +4349,9 @@ 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); + if (do_checks && 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++) { @@ -4416,9 +4423,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; + if (do_checks && format_count > 5) + warn (_("Unexpectedly large number of columns in the file name table (%u)\n"), + format_count); format_start = data; for (formati = 0; formati < format_count; formati++) { diff --git a/binutils/dwarf.h b/binutils/dwarf.h index 27f8a51521e..0c9f3661073 100644 --- a/binutils/dwarf.h +++ b/binutils/dwarf.h @@ -221,6 +221,7 @@ extern int do_debug_cu_index; extern int do_wide; extern int do_debug_links; extern int do_follow_links; +extern bfd_boolean do_checks; extern int dwarf_cutoff_level; extern unsigned long dwarf_start_die; diff --git a/binutils/elfcomm.c b/binutils/elfcomm.c index fc47b40757f..5ec4690e132 100644 --- a/binutils/elfcomm.c +++ b/binutils/elfcomm.c @@ -34,15 +34,6 @@ extern char *program_name; -/* FIXME: This definition really ought to be in ansidecl.h. */ -#ifndef ATTRIBUTE_WEAK -#define ATTRIBUTE_WEAK __attribute__((weak)) -#endif - -/* Allow the following two functions to be overridden if desired. */ -void error (const char *, ...) ATTRIBUTE_WEAK; -void warn (const char *, ...) ATTRIBUTE_WEAK; - void error (const char *message, ...) { diff --git a/binutils/elfcomm.h b/binutils/elfcomm.h index abc7611fe3f..abf84b5cb9e 100644 --- a/binutils/elfcomm.h +++ b/binutils/elfcomm.h @@ -26,8 +26,8 @@ #include "aout/ar.h" -void error (const char *, ...) ATTRIBUTE_PRINTF_1; -void warn (const char *, ...) ATTRIBUTE_PRINTF_1; +extern void error (const char *, ...) ATTRIBUTE_PRINTF_1; +extern void warn (const char *, ...) ATTRIBUTE_PRINTF_1; typedef unsigned HOST_WIDEST_INT elf_vma; diff --git a/binutils/readelf.c b/binutils/readelf.c index 25c2cce21ae..6bf6d5294cc 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -231,7 +231,6 @@ static bfd_boolean do_ctf = FALSE; static bfd_boolean do_arch = FALSE; static bfd_boolean do_notes = FALSE; static bfd_boolean do_archive_index = FALSE; -static bfd_boolean do_checks = FALSE; static bfd_boolean check_all = FALSE; static bfd_boolean is_32bit_elf = FALSE; static bfd_boolean decompress_dumps = FALSE; @@ -387,25 +386,6 @@ bfd_vmatoa (char *fmtch, bfd_vma value) return ret; } -/* A version of the warn() function that is disabled if do_checks is not active. */ - -void -warn (const char *message, ...) -{ - va_list args; - - if (!do_checks) - return; - - /* Try to keep warning messages in sync with the program's normal output. */ - fflush (stdout); - - va_start (args, message); - fprintf (stderr, _("%s: Warning: "), program_name); - vfprintf (stderr, message, args); - va_end (args); -} - /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at OFFSET + the offset of the current archive member, if we are examining an archive. Put the retrieved data into VAR, if it is not NULL. Otherwise @@ -6378,21 +6358,22 @@ process_section_headers (Filedata * filedata) case SHT_REL: CHECK_ENTSIZE (section, i, Rel); - if (section->sh_size == 0) + if (do_checks && section->sh_size == 0) warn (_("Section '%s': zero-sized relocation section\n"), name); break; case SHT_RELA: CHECK_ENTSIZE (section, i, Rela); - if (section->sh_size == 0) + if (do_checks && section->sh_size == 0) warn (_("Section '%s': zero-sized relocation section\n"), name); break; case SHT_NOTE: case SHT_PROGBITS: - if (section->sh_size == 0) - /* This is not illegal according to the ELF standard, but - it might be an indication that something is wrong. */ + /* Having a zero sized section is not illegal according to the + ELF standard, but it might be an indication that something + is wrong. So issue a warning if we are running in lint mode. */ + if (do_checks && section->sh_size == 0) warn (_("Section '%s': has a size of zero - is this intended ?\n"), name); break; diff --git a/gas/ChangeLog b/gas/ChangeLog index 1a4f01ace39..3ad9fb33d91 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2020-05-05 Nick Clifton <nickc@redhat.com> + + * dwarf2dbg.c (out_dir_and_file_list): Add comments describing the + construction of a DWARF-5 directory name table. + * testsuite/gas/elf/pr25917.d: Update expected output. + 2020-05-05 Gunther Nikl <gnikl@justmail.de> * config/tc-rx.c (elf_flags): Initialize for non-linux targets. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 071450e19a1..69955fea5bf 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -1983,11 +1983,16 @@ out_dir_and_file_list (void) /* Output the Directory Table. */ if (DWARF2_LINE_VERSION >= 5) { + /* We only have one column in the directory table. */ out_byte (1); + + /* Describe the purpose and format of the column. */ out_uleb128 (DW_LNCT_path); /* FIXME: it would be better to store these strings in the .debug_line_str section and reference them here. */ out_uleb128 (DW_FORM_string); + + /* Now state how many rows there are in the table. */ out_uleb128 (dirs_in_use); } diff --git a/gas/testsuite/gas/elf/pr25917.d b/gas/testsuite/gas/elf/pr25917.d index 6f83bbb5c5d..ce031e71860 100644 --- a/gas/testsuite/gas/elf/pr25917.d +++ b/gas/testsuite/gas/elf/pr25917.d @@ -1,9 +1,9 @@ #as: --gdwarf-5 -#name: DWARF5: no files or directories +#name: DWARF5: no files or directories (PR 25917) #readelf: -wl #... The Directory Table is empty. - No Line Number Statements. + The File Name Table is empty. #pass |