diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2007-05-16 12:52:03 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2007-05-16 12:52:03 +0000 |
commit | 91ac591132f0891f30c9f6e6e7d4a3c56707ecdd (patch) | |
tree | b94a4c8c9eb62fed1ead1707ab5a5b88bf627cf7 /bfd | |
parent | 8ee82aff445c6ba118ca1afcf89213cd25490b56 (diff) | |
download | gdb-91ac591132f0891f30c9f6e6e7d4a3c56707ecdd.zip gdb-91ac591132f0891f30c9f6e6e7d4a3c56707ecdd.tar.gz gdb-91ac591132f0891f30c9f6e6e7d4a3c56707ecdd.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 32 |
2 files changed, 22 insertions, 16 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a46bc09..ab4a46f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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> diff --git a/bfd/elflink.c b/bfd/elflink.c index 6cf1ba9..dfdbade 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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. */ |