summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog17
-rw-r--r--binutils/dwarf.c27
-rw-r--r--binutils/dwarf.h1
-rw-r--r--binutils/elfcomm.c9
-rw-r--r--binutils/elfcomm.h4
-rw-r--r--binutils/readelf.c31
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/dwarf2dbg.c5
-rw-r--r--gas/testsuite/gas/elf/pr25917.d4
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