From 9e6619e285873fe1cb002da4bb7749be40a5627c Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Wed, 20 Apr 2011 07:17:01 +0000
Subject: [PATCH] 	* libbfd.c (bfd_log2): Do return rounded up value. 
 * elflink.c (bfd_elf_size_dynsym_hash_dynstr): Replace bfd_log2 	call
 with expanded old round down version of the function.

---
 bfd/ChangeLog | 4 ++++
 bfd/elflink.c | 7 +++++--
 bfd/libbfd.c  | 6 +++++-
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index afa1cf269d8..5a15a6c2833 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,9 @@
 2011-04-20  Alan Modra  <amodra@gmail.com>
 
+	* libbfd.c (bfd_log2): Do return rounded up value.
+	* elflink.c (bfd_elf_size_dynsym_hash_dynstr): Replace bfd_log2
+	call with expanded old round down version of the function.
+
 	* archive.c (_bfd_get_elt_at_filepos): Don't release n_nfd.
 	* elflink.c (elf_link_add_object_symbols): Delete redundant code.
 
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 3c95b572151..3a4d22c4cf8 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -6537,10 +6537,13 @@ bfd_elf_size_dynsym_hash_dynstr (bfd *output_bfd, struct bfd_link_info *info)
 	    }
 	  else
 	    {
-	      unsigned long int maskwords, maskbitslog2;
+	      unsigned long int maskwords, maskbitslog2, x;
 	      BFD_ASSERT (cinfo.min_dynindx != -1);
 
-	      maskbitslog2 = bfd_log2 (cinfo.nsyms) + 1;
+	      x = cinfo.nsyms;
+	      maskbitslog2 = 1;
+	      while ((x >>= 1) != 0)
+		++maskbitslog2;
 	      if (maskbitslog2 < 3)
 		maskbitslog2 = 5;
 	      else if ((1 << (maskbitslog2 - 2)) & cinfo.nsyms)
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index 4e5813aaf76..cec13d95132 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -979,8 +979,12 @@ bfd_log2 (bfd_vma x)
 {
   unsigned int result = 0;
 
-  while ((x = (x >> 1)) != 0)
+  if (x <= 1)
+    return result;
+  --x;
+  do
     ++result;
+  while ((x >>= 1) != 0);
   return result;
 }