diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b898da818888ae7a8dcd81e5cbdec0e043726599..56c80cc231da44cd2b7ec305ec31ee087b5f6f0b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2014-04-22  Yuanhui Zhang  <asmwarrior@gmail.com>
+
+	PR ld/16821
+	* peXXigen.c (abs_finder): Fix for 32-bit host builds.
+
 2014-04-22  Will Newton  <will.newton@linaro.org>
 
 	* elfnn-aarch64.c (elfNN_aarch64_section_flags): Remove
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 36d90cce3104292e54cd9bc4edda0957b0f03d8b..56224a89cbb5cc98eacd5e9778b327e427152f65 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -212,7 +212,7 @@ abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
 {
   bfd_vma abs_val = * (bfd_vma *) data;
 
-  return (sec->vma <= abs_val) && ((sec->vma + (1L << 32)) > abs_val);
+  return (sec->vma <= abs_val) && ((sec->vma + (1LL << 32)) > abs_val);
 }
 
 unsigned int
@@ -3591,6 +3591,7 @@ rsrc_sort_entries (rsrc_dir_chain *  chain,
 
 		      /* Unhook NEXT from the chain.  */
 		      /* FIXME: memory loss here.  */
+		      /* FIXME: do we need to decrement sizeof_tables_and_entries ?  */
 		      entry->next_entry = next->next_entry;
 		      chain->num_entries --;
 		      if (chain->num_entries < 2)
@@ -3654,6 +3655,7 @@ rsrc_sort_entries (rsrc_dir_chain *  chain,
 		}
 
 	      /* Unhook NEXT from the chain.  */
+	      /* FIXME: do we need to decrement sizeof_tables_and_entries ?  */
 	      entry->next_entry = next->next_entry;
 	      chain->num_entries --;
 	      if (chain->num_entries < 2)
@@ -3914,6 +3916,12 @@ rsrc_process_section (bfd * abfd,
   if (new_data == NULL)
     goto end;
 
+  /* We have merged the top level Type Tables of all of the input
+     .rsrc sections into one Type Table.  So we can (and must)
+     reduce the count of the number of tables that we will be
+     emitting appropriately.  */
+  sizeof_tables_and_entries -= 16 * (num_resource_sets - 1);
+
   write_data.abfd        = abfd;
   write_data.datastart   = new_data;
   write_data.next_table  = new_data;