Add octets vs bytes functionality to LD.
authorTimothy Wall <twall@alum.mit.edu>
Thu, 3 Feb 2000 18:24:46 +0000 (18:24 +0000)
committerTimothy Wall <twall@alum.mit.edu>
Thu, 3 Feb 2000 18:24:46 +0000 (18:24 +0000)
ld/ChangeLog
ld/ldexp.c
ld/ldlang.c

index 5adfeb4f2d20f1c553f6b40ca415e15090c4b169..33ca5c1185cc916137294bd5ff474201ed6b9c48 100644 (file)
@@ -1,3 +1,24 @@
+2000-02-03  Timothy Wall <twall@redhat.com>
+
+       * ld/ldexp.c (fold_name): Make SIZEOF operator return byte count, not
+       octet count.
+       * ld/ldlang.c (print_input_section, print_data_statement,
+       print_reloc_statement, print_padding_statement): Print target
+       address values and section sizes as bytes, not octets.
+       (insert_pad) Calculate padding size in octets, and adjust "dot"
+       by bytes.
+       (size_input_section) Always adjust "dot" by bytes, not octets.
+       (lang_check_section_addresses, lang_do_assignments) Adjust
+       "dot" by bytes, not octets.  Use the larger of the directive size
+       or octets_per_byte for the number of octets actually allocated in
+       the output section.
+       (lang_set_startof) Make sure STARTOF returns a target address.
+       (lang_one_common) Record size changes in octets.
+       (lang_abs_symbol_at_end_of) Section end symbol's value is
+       recorded in target bytes.
+       * ld.texinfo:   Updated description of BYTE, SHORT, LONG, etc.
+       to be clear about behavior when an octet is smaller than one byte.
+       
 2000-01-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
 
        * ldcref.c (output_cref): Don't pass message strings to printf
index 121ed889d87945b515b1ff65560fb8915765728f..0c38314ffa4399d41917de861e5fc60a3edf94f0 100644 (file)
@@ -456,11 +456,12 @@ fold_name (tree, current_section, allocation_done, dot)
       case SIZEOF:
        if (allocation_done != lang_first_phase_enum)
          {
+            int opb = bfd_octets_per_byte (output_bfd);
            lang_output_section_statement_type *os;
 
            os = lang_output_section_find (tree->name.name);
            check (os, tree->name.name, "SIZEOF");
-           result = new_abs (os->bfd_section->_raw_size);
+           result = new_abs (os->bfd_section->_raw_size / opb);
          }
        else
          result = invalid ();
index f12fcce616a8a12dfeca69a30703e83179a09b68..6896b2040188557fe52f5fc6008148a267ad725f 100644 (file)
@@ -2168,7 +2168,8 @@ print_input_section (in)
 {
   asection *i = in->section;
   bfd_size_type size = i->_cooked_size != 0 ? i->_cooked_size : i->_raw_size;
-
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine);
   if (size != 0)
     {
       print_space ();
@@ -2192,7 +2193,7 @@ print_input_section (in)
            }
 
          minfo ("0x%V %W %B\n",
-                i->output_section->vma + i->output_offset, size,
+                i->output_section->vma + i->output_offset, size / opb,
                 i->owner);
 
          if (i->_cooked_size != 0 && i->_cooked_size != i->_raw_size)
@@ -2214,7 +2215,7 @@ print_input_section (in)
 
          bfd_link_hash_traverse (link_info.hash, print_one_symbol, (PTR) i);
 
-         print_dot = i->output_section->vma + i->output_offset + size;
+         print_dot = i->output_section->vma + i->output_offset + size / opb;
        }
     }
 }
@@ -2234,6 +2235,8 @@ print_data_statement (data)
   bfd_vma addr;
   bfd_size_type size;
   const char *name;
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine);
 
   for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
     print_space ();
@@ -2278,7 +2281,8 @@ print_data_statement (data)
 
   print_nl ();
 
-  print_dot = addr + size;
+  print_dot = addr + size / opb;
+
 }
 
 /* Print an address statement.  These are generated by options like
@@ -2302,6 +2306,8 @@ print_reloc_statement (reloc)
   int i;
   bfd_vma addr;
   bfd_size_type size;
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
 
   for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
     print_space ();
@@ -2323,7 +2329,7 @@ print_reloc_statement (reloc)
 
   print_nl ();
 
-  print_dot = addr + size;
+  print_dot = addr + size / opb;
 }  
 
 static void
@@ -2332,6 +2338,8 @@ print_padding_statement (s)
 {
   int len;
   bfd_vma addr;
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
 
   minfo (" *fill*");
 
@@ -2352,7 +2360,7 @@ print_padding_statement (s)
 
   print_nl ();
 
-  print_dot = addr + s->size;
+  print_dot = addr + s->size / opb;
 }
 
 static void
@@ -2547,6 +2555,8 @@ insert_pad (this_ptr, fill, power, output_section_statement, dot)
      inserting a magic 'padding' statement.
      */
 
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
   unsigned int alignment_needed = align_power (dot, power) - dot;
 
   if (alignment_needed != 0)
@@ -2563,7 +2573,7 @@ insert_pad (this_ptr, fill, power, output_section_statement, dot)
       new->padding_statement.output_offset =
        dot - output_section_statement->vma;
       new->padding_statement.fill = fill;
-      new->padding_statement.size = alignment_needed;
+      new->padding_statement.size = alignment_needed * opb;
     }
 
 
@@ -2572,9 +2582,9 @@ insert_pad (this_ptr, fill, power, output_section_statement, dot)
     {
       output_section_statement->alignment_power = power;
     }
-  output_section_statement->_raw_size += alignment_needed;
-  return alignment_needed + dot;
+  output_section_statement->_raw_size += alignment_needed * opb;
 
+  return dot + alignment_needed;
 }
 
 /* Work out how much this section will move the dot point */
@@ -2588,6 +2598,8 @@ size_input_section (this_ptr, output_section_statement, fill, dot, relax)
 {
   lang_input_section_type *is = &((*this_ptr)->input_section);
   asection *i = is->section;
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
 
   if (is->ifile->just_syms_flag == false)
     {
@@ -2605,10 +2617,11 @@ size_input_section (this_ptr, output_section_statement, fill, dot, relax)
       /* Mark how big the output section must be to contain this now
         */
       if (i->_cooked_size != 0)
-       dot += i->_cooked_size;
+       dot += i->_cooked_size / opb;
       else
-       dot += i->_raw_size;
-      output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
+       dot += i->_raw_size / opb;
+      output_section_statement->bfd_section->_raw_size = 
+        (dot - output_section_statement->bfd_section->vma) * opb;
     }
   else
     {
@@ -2629,6 +2642,7 @@ static void
 lang_check_section_addresses ()
 {
   asection * s;
+  int opb = bfd_octets_per_byte (output_bfd);
 
   /* Scan all sections in the output list.  */
   for (s = output_bfd->sections; s != NULL; s = s->next)
@@ -2692,6 +2706,9 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
      bfd_vma dot;
      boolean relax;
 {
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine);
+
   /* Size up the sections from their constituent parts.  */
   for (; s != (lang_statement_union_type *) NULL; s = s->next)
     {
@@ -2805,19 +2822,19 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
            (void) lang_size_sections (os->children.head, os, &os->children.head,
                                       os->fill, dot, relax);
            
-           /* Ignore the size of the input sections, use the vma and size to
-              align against.  */
-
-           after = ALIGN_N (os->bfd_section->vma +
-                            os->bfd_section->_raw_size,
+            /* put the section within the requested block size, or align at
+               the block boundary */
+           after = ALIGN_N (os->bfd_section->vma,
+                            os->bfd_section->_raw_size / opb,
                             /* The coercion here is important, see ld.h.  */
                             (bfd_vma) os->block_value);
 
            if (bfd_is_abs_section (os->bfd_section))
              ASSERT (after == os->bfd_section->vma);
            else
-             os->bfd_section->_raw_size = after - os->bfd_section->vma;
-           dot = os->bfd_section->vma + os->bfd_section->_raw_size;
+             os->bfd_section->_raw_size = 
+                (after - os->bfd_section->vma) * opb;
+           dot = os->bfd_section->vma + os->bfd_section->_raw_size / opb;
            os->processed = true;
 
            /* Update dot in the region ?
@@ -2903,8 +2920,9 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
                size = BYTE_SIZE;
                break;
              }
-
-           dot += size;
+            if (size < opb)
+              size = opb;
+           dot += size / opb;
            output_section_statement->bfd_section->_raw_size += size;
            /* The output section gets contents, and then we inspect for
               any flags set in the input script which override any ALLOC.  */
@@ -2924,7 +2942,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
            s->reloc_statement.output_section =
              output_section_statement->bfd_section;
            size = bfd_get_reloc_size (s->reloc_statement.howto);
-           dot += size;
+           dot += size / opb;
            output_section_statement->bfd_section->_raw_size += size;
          }
          break;
@@ -3012,7 +3030,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
                    new->padding_statement.output_offset =
                      dot - output_section_statement->bfd_section->vma;
                    new->padding_statement.fill = fill;
-                   new->padding_statement.size = newdot - dot;
+                   new->padding_statement.size = (newdot - dot) * opb;
                    output_section_statement->bfd_section->_raw_size +=
                      new->padding_statement.size;
                  }
@@ -3030,7 +3048,7 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
             pass than it did at this point in the previous pass.  */
          s->padding_statement.output_offset =
            dot - output_section_statement->bfd_section->vma;
-         dot += s->padding_statement.size;
+         dot += s->padding_statement.size / opb;
          output_section_statement->bfd_section->_raw_size +=
            s->padding_statement.size;
          break;
@@ -3063,6 +3081,9 @@ lang_do_assignments (s, output_section_statement, fill, dot)
      fill_type fill;
      bfd_vma dot;
 {
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
+
   for (; s != (lang_statement_union_type *) NULL; s = s->next)
     {
       switch (s->header.type)
@@ -3084,7 +3105,8 @@ lang_do_assignments (s, output_section_statement, fill, dot)
                dot = os->bfd_section->vma;
                (void) lang_do_assignments (os->children.head, os,
                                            os->fill, dot);
-               dot = os->bfd_section->vma + os->bfd_section->_raw_size;
+               dot = os->bfd_section->vma + os->bfd_section->_raw_size / opb;
+
              }
            if (os->load_base) 
              {
@@ -3124,22 +3146,28 @@ lang_do_assignments (s, output_section_statement, fill, dot)
            if (value.valid_p == false)
              einfo (_("%F%P: invalid data statement\n"));
          }
-         switch (s->data_statement.type)
-           {
-           case QUAD:
-           case SQUAD:
-             dot += QUAD_SIZE;
-             break;
-           case LONG:
-             dot += LONG_SIZE;
-             break;
-           case SHORT:
-             dot += SHORT_SIZE;
-             break;
-           case BYTE:
-             dot += BYTE_SIZE;
-             break;
-           }
+          {
+            int size;
+            switch (s->data_statement.type)
+              {
+              case QUAD:
+              case SQUAD:
+                size = QUAD_SIZE;
+                break;
+              case LONG:
+                size = LONG_SIZE;
+                break;
+              case SHORT:
+                size = SHORT_SIZE;
+                break;
+              case BYTE:
+                size = BYTE_SIZE;
+                break;
+              }
+            if (size < opb)
+              size = opb;
+            dot += size / opb;
+          }
          break;
 
        case lang_reloc_statement_enum:
@@ -3153,7 +3181,7 @@ lang_do_assignments (s, output_section_statement, fill, dot)
            if (value.valid_p == false)
              einfo (_("%F%P: invalid reloc statement\n"));
          }
-         dot += bfd_get_reloc_size (s->reloc_statement.howto);
+         dot += bfd_get_reloc_size (s->reloc_statement.howto) / opb;
          break;
 
        case lang_input_section_enum:
@@ -3161,9 +3189,9 @@ lang_do_assignments (s, output_section_statement, fill, dot)
            asection *in = s->input_section.section;
 
            if (in->_cooked_size != 0)
-             dot += in->_cooked_size;
+             dot += in->_cooked_size / opb;
            else
-             dot += in->_raw_size;
+             dot += in->_raw_size / opb;
          }
          break;
 
@@ -3183,7 +3211,7 @@ lang_do_assignments (s, output_section_statement, fill, dot)
 
          break;
        case lang_padding_statement_enum:
-         dot += s->padding_statement.size;
+         dot += s->padding_statement.size / opb;
          break;
 
        case lang_group_statement_enum:
@@ -3241,11 +3269,13 @@ lang_set_startof ()
       h = bfd_link_hash_lookup (link_info.hash, buf, false, false, true);
       if (h != NULL && h->type == bfd_link_hash_undefined)
        {
+          int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                                   ldfile_output_machine); 
          h->type = bfd_link_hash_defined;
          if (s->_cooked_size != 0)
-           h->u.def.value = s->_cooked_size;
+           h->u.def.value = s->_cooked_size / opb;
          else
-           h->u.def.value = s->_raw_size;
+           h->u.def.value = s->_raw_size / opb;
          h->u.def.section = bfd_abs_section_ptr;
        }
 
@@ -3422,6 +3452,8 @@ lang_one_common (h, info)
   unsigned int power_of_two;
   bfd_vma size;
   asection *section;
+  int opb = bfd_arch_mach_octets_per_byte (ldfile_output_architecture, 
+                                           ldfile_output_machine); 
 
   if (h->type != bfd_link_hash_common)
     return true;
@@ -3436,8 +3468,8 @@ lang_one_common (h, info)
   section = h->u.c.p->section;
 
   /* Increase the size of the section.  */
-  section->_cooked_size = ALIGN_N (section->_cooked_size,
-                                  (bfd_size_type) (1 << power_of_two));
+  section->_cooked_size = ALIGN_N ((section->_cooked_size + opb - 1) / opb,
+                                  (bfd_size_type) (1 << power_of_two)) * opb;
 
   /* Adjust the alignment if necessary.  */
   if (power_of_two > section->alignment_power)
@@ -4297,7 +4329,8 @@ lang_abs_symbol_at_end_of (secname, name)
        h->u.def.value = 0;
       else
        h->u.def.value = (bfd_get_section_vma (output_bfd, sec)
-                         + bfd_section_size (output_bfd, sec));
+                         + bfd_section_size (output_bfd, sec) /
+                          bfd_octets_per_byte (output_bfd));
 
       h->u.def.section = bfd_abs_section_ptr;
     }