OSDN Git Service

PR binutils/2735
authornickc <nickc>
Mon, 12 Jun 2006 11:12:51 +0000 (11:12 +0000)
committernickc <nickc>
Mon, 12 Jun 2006 11:12:51 +0000 (11:12 +0000)
* elflink.c (elf_link_add_object_symbols): Fix the warning message about
  mismatched alignments to allow for the case where the common alignment
  has been deduced from the section alignment.
* bfd.c (_bfd_default_error_handler): Update comment to explain why bfd
  and asection varargs are out of order.
  Explicitly catch and abort on NULL bfd and asection arguments.

bfd/ChangeLog
bfd/bfd.c
bfd/elflink.c

index e9163e6..a1b2a3f 100644 (file)
@@ -1,3 +1,13 @@
+2006-06-12  Nick Clifton  <nickc@redhat.com>
+
+       PR binutils/2735
+       * elflink.c (elf_link_add_object_symbols): Fix the warning message
+       about mismatched alignments to allow for the case where the common
+       alignment has been deduced from the section alignment.
+       * bfd.c (_bfd_default_error_handler): Update comment to explain
+       why bfd and asection varargs are out of order.  Explicitly catch
+       and abort on NULL bfd and asection arguments.
+
 2006-06-11  Richard Sandiford  <richard@codesourcery.com>
            Thiemo Seufer  <ths@mips.com>
 
index ebfd314..238bbd6 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -419,6 +419,23 @@ static const char *_bfd_error_program_name;
 
    %A section name from section.  For group components, print group name too.
    %B file name from bfd.  For archive components, prints archive too.
+
+   Note - because these two extra format specifiers require special handling
+   they are scanned for and processed in this function, before calling
+   vfprintf.  This means that the *arguments* for these format specifiers
+   must be the first ones in the variable argument list, regardless of where
+   the specifiers appear in the format string.  Thus for example calling
+   this function with a format string of:
+
+      "blah %s blah %A blah %d blah %B"
+
+   would involve passing the arguments as:
+
+      "blah %s blah %A blah %d blah %B",
+        asection_for_the_%A,
+       bfd_for_the_%B,
+       string_for_the_%s,
+       integer_for_the_%d);
  */
 
 void
@@ -483,7 +500,11 @@ _bfd_default_error_handler (const char *fmt, ...)
              if (p[1] == 'B')
                {
                  bfd *abfd = va_arg (ap, bfd *);
-                 if (abfd->my_archive)
+
+                 if (abfd == NULL)
+                   /* Invoking %B with a null bfd pointer is an internal error.  */
+                   abort ();
+                 else if (abfd->my_archive)
                    snprintf (bufp, avail, "%s(%s)",
                              abfd->my_archive->filename, abfd->filename);
                  else
@@ -492,10 +513,14 @@ _bfd_default_error_handler (const char *fmt, ...)
              else
                {
                  asection *sec = va_arg (ap, asection *);
-                 bfd *abfd = sec->owner;
+                 bfd *abfd;
                  const char *group = NULL;
                  struct coff_comdat_info *ci;
 
+                 if (sec == NULL)
+                   /* Invoking %A with a null section pointer is an internal error.  */
+                   abort ();
+                 abfd = sec->owner;
                  if (abfd != NULL
                      && bfd_get_flavour (abfd) == bfd_target_elf_flavour
                      && elf_next_in_group (sec) != NULL
index c5b1007..f4c63f4 100644 (file)
@@ -3922,11 +3922,21 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
                }
 
              if (normal_align < common_align)
-               (*_bfd_error_handler)
-                 (_("Warning: alignment %u of symbol `%s' in %B"
-                    " is smaller than %u in %B"),
-                  normal_bfd, common_bfd,
-                  1 << normal_align, name, 1 << common_align);
+               {
+                 /* PR binutils/2735 */
+                 if (normal_bfd == NULL)
+                   (*_bfd_error_handler)
+                     (_("Warning: alignment %u of common symbol `%s' in %B"
+                        " is greater than the alignment (%u) of its section %A"),
+                      common_bfd, h->root.u.def.section,
+                      1 << common_align, name, 1 << normal_align);
+                 else
+                   (*_bfd_error_handler)
+                     (_("Warning: alignment %u of symbol `%s' in %B"
+                        " is smaller than %u in %B"),
+                      normal_bfd, common_bfd,
+                      1 << normal_align, name, 1 << common_align);
+               }
            }
 
          /* Remember the symbol size and type.  */