OSDN Git Service

2009-12-03 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/pf3gnuchains3x.git] / bfd / tekhex.c
index e40c866..bc3c9ca 100644 (file)
@@ -1,13 +1,13 @@
 /* BFD backend for Extended Tektronix Hex Format  objects.
    Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,7 +17,9 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* SUBSECTION
        Tektronix Hex Format handling
@@ -65,8 +67,8 @@
   The data can come out of order, and may be discontigous. This is a
   serial protocol, so big files are unlikely, so we keep a list of 8k chunks.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "libiberty.h"
 
@@ -322,7 +324,8 @@ find_chunk (bfd *abfd, bfd_vma vma)
   if (!d)
     {
       /* No chunk for this address, so make one up.  */
-      d = bfd_zalloc (abfd, (bfd_size_type) sizeof (struct data_struct));
+      d = (struct data_struct *)
+          bfd_zalloc (abfd, (bfd_size_type) sizeof (struct data_struct));
 
       if (!d)
        return NULL;
@@ -381,12 +384,14 @@ first_phase (bfd *abfd, int type, char *src)
       section = bfd_get_section_by_name (abfd, sym);
       if (section == NULL)
        {
-         char *n = bfd_alloc (abfd, (bfd_size_type) len + 1);
+         char *n = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1);
 
          if (!n)
            return FALSE;
          memcpy (n, sym, len + 1);
          section = bfd_make_section (abfd, n);
+         if (section == NULL)
+           return FALSE;
        }
       while (*src)
        {
@@ -411,31 +416,34 @@ first_phase (bfd *abfd, int type, char *src)
              /* Symbols, add to section.  */
              {
                bfd_size_type amt = sizeof (tekhex_symbol_type);
-               tekhex_symbol_type *new = bfd_alloc (abfd, amt);
+               tekhex_symbol_type *new_symbol = (tekhex_symbol_type *)
+                    bfd_alloc (abfd, amt);
                char stype = (*src);
 
-               if (!new)
+               if (!new_symbol)
                  return FALSE;
-               new->symbol.the_bfd = abfd;
+               new_symbol->symbol.the_bfd = abfd;
                src++;
                abfd->symcount++;
                abfd->flags |= HAS_SYMS;
-               new->prev = abfd->tdata.tekhex_data->symbols;
-               abfd->tdata.tekhex_data->symbols = new;
+               new_symbol->prev = abfd->tdata.tekhex_data->symbols;
+               abfd->tdata.tekhex_data->symbols = new_symbol;
                if (!getsym (sym, &src, &len))
                  return FALSE;
-               new->symbol.name = bfd_alloc (abfd, (bfd_size_type) len + 1);
-               if (!new->symbol.name)
+               new_symbol->symbol.name = (const char *)
+                    bfd_alloc (abfd, (bfd_size_type) len + 1);
+               if (!new_symbol->symbol.name)
                  return FALSE;
-               memcpy ((char *) (new->symbol.name), sym, len + 1);
-               new->symbol.section = section;
+               memcpy ((char *) (new_symbol->symbol.name), sym, len + 1);
+               new_symbol->symbol.section = section;
                if (stype <= '4')
-                 new->symbol.flags = (BSF_GLOBAL | BSF_EXPORT);
+                 new_symbol->symbol.flags = (BSF_GLOBAL | BSF_EXPORT);
                else
-                 new->symbol.flags = BSF_LOCAL;
+                 new_symbol->symbol.flags = BSF_LOCAL;
                if (!getvalue (&src, &val))
                  return FALSE;
-               new->symbol.value = val - section->vma;
+               new_symbol->symbol.value = val - section->vma;
+               break;
              }
            default:
              return FALSE;
@@ -457,11 +465,10 @@ pass_over (bfd *abfd, bfd_boolean (*func) (bfd *, int, char *))
 
   /* To the front of the file.  */
   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-    abort ();
+    return FALSE;
   while (! eof)
     {
-      char buffer[MAXCHUNK];
-      char *src = buffer;
+      char src[MAXCHUNK];
       char type;
 
       /* Find first '%'.  */
@@ -471,22 +478,24 @@ pass_over (bfd *abfd, bfd_boolean (*func) (bfd *, int, char *))
 
       if (eof)
        break;
-      src++;
 
       /* Fetch the type and the length and the checksum.  */
       if (bfd_bread (src, (bfd_size_type) 5, abfd) != 5)
-       abort (); /* FIXME.  */
+       return FALSE;
 
       type = src[2];
 
       if (!ISHEX (src[0]) || !ISHEX (src[1]))
        break;
 
-      /* Already read five char.  */
+      /* Already read five chars.  */
       chars_on_line = HEX (src) - 5;
 
+      if (chars_on_line >= MAXCHUNK)
+       return FALSE;
+
       if (bfd_bread (src, (bfd_size_type) chars_on_line, abfd) != chars_on_line)
-       abort (); /* FIXME.  */
+       return FALSE;
 
       /* Put a null at the end.  */
       src[chars_on_line] = 0;
@@ -526,7 +535,7 @@ tekhex_mkobject (bfd *abfd)
 {
   tdata_type *tdata;
 
-  tdata = bfd_alloc (abfd, (bfd_size_type) sizeof (tdata_type));
+  tdata = (tdata_type *) bfd_alloc (abfd, (bfd_size_type) sizeof (tdata_type));
   if (!tdata)
     return FALSE;
   abfd->tdata.tekhex_data = tdata;
@@ -865,7 +874,7 @@ tekhex_write_object_contents (bfd *abfd)
 
 static int
 tekhex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
-                      bfd_boolean exec ATTRIBUTE_UNUSED)
+                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   return 0;
 }
@@ -874,13 +883,14 @@ static asymbol *
 tekhex_make_empty_symbol (bfd *abfd)
 {
   bfd_size_type amt = sizeof (struct tekhex_symbol_struct);
-  tekhex_symbol_type *new = bfd_zalloc (abfd, amt);
+  tekhex_symbol_type *new_symbol = (tekhex_symbol_type *) bfd_zalloc (abfd,
+                                                                      amt);
 
-  if (!new)
+  if (!new_symbol)
     return NULL;
-  new->symbol.the_bfd = abfd;
-  new->prev =  NULL;
-  return &(new->symbol);
+  new_symbol->symbol.the_bfd = abfd;
+  new_symbol->prev =  NULL;
+  return &(new_symbol->symbol);
 }
 
 static void
@@ -937,10 +947,13 @@ tekhex_print_symbol (bfd *abfd,
 #define tekhex_bfd_is_group_section                 bfd_generic_is_group_section
 #define tekhex_bfd_discard_group                    bfd_generic_discard_group
 #define tekhex_section_already_linked               _bfd_generic_section_already_linked
+#define tekhex_bfd_define_common_symbol             bfd_generic_define_common_symbol
 #define tekhex_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
 #define tekhex_bfd_link_hash_table_free             _bfd_generic_link_hash_table_free
 #define tekhex_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
 #define tekhex_bfd_link_just_syms                   _bfd_generic_link_just_syms
+#define tekhex_bfd_copy_link_hash_symbol_type \
+  _bfd_generic_copy_link_hash_symbol_type
 #define tekhex_bfd_final_link                       _bfd_generic_final_link
 #define tekhex_bfd_link_split_section               _bfd_generic_link_split_section
 #define tekhex_get_section_contents_in_window       _bfd_generic_get_section_contents_in_window