* elf32-xtensa.c (property_table_compare): Remove assertion about
authorBob Wilson <bob.wilson@acm.org>
Thu, 11 Nov 2004 23:09:24 +0000 (23:09 +0000)
committerBob Wilson <bob.wilson@acm.org>
Thu, 11 Nov 2004 23:09:24 +0000 (23:09 +0000)
entries with the same address and non-zero size.
(xtensa_read_table_entries): Report such entries as errors.

bfd/ChangeLog
bfd/elf32-xtensa.c

index 783c831..ed41ba2 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-11  Bob Wilson  <bob.wilson@acm.org>
+
+       * elf32-xtensa.c (property_table_compare): Remove assertion about
+       entries with the same address and non-zero size.
+       (xtensa_read_table_entries): Report such entries as errors.
+
 2004-11-11  Mark Mitchell  <mark@codesourcery.com>
 
        * elf32-arm.c (elf32_arm_final_link_relocate): Correct logic for
index 472ec34..f3eba9f 100644 (file)
@@ -523,12 +523,6 @@ property_table_compare (const void *ap, const void *bp)
 
   if (a->address == b->address)
     {
-      /* The only circumstance where two entries may legitimately have the
-        same address is when one of them is a zero-size placeholder to
-        mark a place where fill can be inserted.  The zero-size entry should
-        come first.  */
-      BFD_ASSERT ((a->size == 0 || b->size == 0));
-
       if (a->size != b->size)
        return (a->size - b->size);
 
@@ -585,7 +579,7 @@ xtensa_read_table_entries (bfd *abfd,
   bfd_size_type table_size = 0;
   bfd_byte *table_data;
   property_table_entry *blocks;
-  int block_count;
+  int blk, block_count;
   bfd_size_type num_records;
   Elf_Internal_Rela *internal_relocs;
   bfd_vma section_addr;
@@ -700,6 +694,25 @@ xtensa_read_table_entries (bfd *abfd,
       /* Now sort them into address order for easy reference.  */
       qsort (blocks, block_count, sizeof (property_table_entry),
             property_table_compare);
+
+      /* Check that the table contents are valid.  Problems may occur,
+         for example, if an unrelocated object file is stripped.  */
+      for (blk = 1; blk < block_count; blk++)
+       {
+         /* The only circumstance where two entries may legitimately
+            have the same address is when one of them is a zero-size
+            placeholder to mark a place where fill can be inserted.
+            The zero-size entry should come first.  */
+         if (blocks[blk - 1].address == blocks[blk].address &&
+             blocks[blk - 1].size != 0)
+           {
+             (*_bfd_error_handler) (_("%B(%A): invalid property table"),
+                                    abfd, section);
+             bfd_set_error (bfd_error_bad_value);
+             free (blocks);
+             return -1;
+           }
+       }
     }
 
   *table_p = blocks;