2007-05-16 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 16 May 2007 12:52:03 +0000 (12:52 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 16 May 2007 12:52:03 +0000 (12:52 +0000)
    Alan Modra  <amodra@bigpond.net.au>

* elflink.c (_bfd_elf_adjust_dynamic_copy): Align dynamic bss
section to the minimum alignment.

bfd/ChangeLog
bfd/elflink.c

index a46bc09ef41355fa1d8c4fc6fabc420c35971d5d..ab4a46fd40e623649fb7d9a78e2f3d6f02554fd9 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-16  H.J. Lu  <hongjiu.lu@intel.com>
+           Alan Modra  <amodra@bigpond.net.au>
+
+       * elflink.c (_bfd_elf_adjust_dynamic_copy): Align dynamic bss
+       section to the minimum alignment.
+
 2007-05-15  H.J. Lu  <hongjiu.lu@intel.com>
            Alan Modra  <amodra@bigpond.net.au>
 
index 6cf1ba9f67baf7cb837e3c343b0714482cbfcf40..dfdbade6353c337bf2459d07f52550cfd6ca7acc 100644 (file)
@@ -2616,33 +2616,33 @@ bfd_boolean
 _bfd_elf_adjust_dynamic_copy (struct elf_link_hash_entry *h,
                              asection *dynbss)
 {
-  unsigned int power_of_two, orig_power_of_two;
+  unsigned int power_of_two;
   bfd_vma mask;
   asection *sec = h->root.u.def.section;
 
   /* The section aligment of definition is the maximum alignment
-     requirement of symbols defined in the section.  */
-  power_of_two = bfd_get_section_alignment (dynbss->owner, dynbss);
-  orig_power_of_two = bfd_get_section_alignment (sec->owner, sec);
+     requirement of symbols defined in the section.  Since we don't
+     know the symbol alignment requirement, we start with the
+     maximum alignment and check low bits of the symbol address
+     for the minimum alignment.  */
+  power_of_two = bfd_get_section_alignment (sec->owner, sec);
+  mask = ((bfd_vma) 1 << power_of_two) - 1;
+  while ((h->root.u.def.value & mask) != 0)
+    {
+       mask >>= 1;
+       --power_of_two;
+    }
 
-  if (orig_power_of_two > power_of_two)
+  if (power_of_two > bfd_get_section_alignment (dynbss->owner,
+                                               dynbss))
     {
       /* Adjust the section alignment if needed.  */
       if (! bfd_set_section_alignment (dynbss->owner, dynbss,
-                                      orig_power_of_two))
+                                      power_of_two))
        return FALSE;
     }
 
-  /* We make sure that the symbol will be aligned properly.  Since we
-     don't know its alignment requirement, we start with the maximum
-     alignment and check low bits of the symbol address for the
-     minimum alignment.  */
-  mask = ((bfd_vma) 1 << orig_power_of_two) - 1;
-  while ((h->root.u.def.value & mask) != 0)
-    {
-       mask >>= 1;
-       --orig_power_of_two;
-    }
+  /* We make sure that the symbol will be aligned properly.  */
   dynbss->size = BFD_ALIGN (dynbss->size, mask + 1);
 
   /* Define the symbol as being at this point in DYNBSS.  */