+2017-01-09  Nick Clifton  <nickc@redhat.com>
+
+       * dwarf2.c (lookup_address_in_function_table): Return early if
+       there are no functions in the given comp unit, or if the high
+       address of the last function in the comp unit is less than the
+       desired address.
+
 2017-01-09  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/21013
 
   bfd_size_type low, high, mid, first;
   struct arange *arange;
 
+  if (number_of_functions == 0)
+    return FALSE;
+
   if (!build_lookup_funcinfo_table (unit))
     return FALSE;
 
+  if (unit->lookup_funcinfo_table[number_of_functions - 1].high_addr < addr)
+    return FALSE;
+  
   /* Find the first function in the lookup table which may contain the
      specified address.  */
   low = 0;
 
+2017-01-09  Nick Clifton  <nickc@redhat.com>
+
+       * objdump.c (display_file): Add new parameter 'last_file'.  If
+       last_file is true, do not call bfd_close at the end of the
+       function.
+       (main): Set the value of the last_file parameter when calling
+       display_file.
+
 2017-01-09  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (process_section_headers): Correct .rel.dyn/.rela.dyn
 
 }
 
 static void
-display_file (char *filename, char *target)
+display_file (char *filename, char *target, bfd_boolean last_file)
 {
   bfd *file;
 
 
   display_any_bfd (file, 0);
 
-  bfd_close (file);
+  /* This is an optimization to improve the speed of objdump, especially when
+     dumping a file with lots of associated debug informatiom.  Calling
+     bfd_close on such a file can take a non-trivial amount of time as there
+     are lots of lists to walk and buffers to free.  This is only really
+     necessary however if we are about to load another file and we need the
+     memory back.  Otherwise, if we are about to exit, then we can save (a lot
+     of) time by only doing a quick close, and allowing the OS to reclaim the
+     memory for us.  */
+  if (! last_file)
+    bfd_close (file);
+  else
+    bfd_close_all_done (file);
 }
 \f
 int
   else
     {
       if (optind == argc)
-       display_file ("a.out", target);
+       display_file ("a.out", target, TRUE);
       else
        for (; optind < argc;)
-         display_file (argv[optind++], target);
+         {
+           display_file (argv[optind], target, optind == argc - 1);
+           optind++;
+         }
     }
 
   free_only_list ();