diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 4bba8dfb81a..404a0bdbac6 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -11082,7 +11082,7 @@ display_debug_not_supported (struct dwarf_section *section,
    Note: does *not* initialise the allocated memory to zero.  */
 
 void *
-cmalloc (size_t nmemb, size_t size)
+cmalloc (uint64_t nmemb, size_t size)
 {
   /* Check for overflow.  */
   if (nmemb >= ~(size_t) 0 / size)
@@ -11096,13 +11096,13 @@ cmalloc (size_t nmemb, size_t size)
    Note: does *not* initialise the allocated memory to zero.  */
 
 void *
-xcmalloc (size_t nmemb, size_t size)
+xcmalloc (uint64_t nmemb, size_t size)
 {
   /* Check for overflow.  */
   if (nmemb >= ~(size_t) 0 / size)
     {
       fprintf (stderr,
-	       _("Attempt to allocate an array with an excessive number of elements: %#zx\n"),
+	       _("Attempt to allocate an array with an excessive number of elements: %#" PRIx64 "\n"),
 	       nmemb);
       xexit (1);
     }
@@ -11115,12 +11115,12 @@ xcmalloc (size_t nmemb, size_t size)
    Note: does *not* initialise any new memory to zero.  */
 
 void *
-xcrealloc (void *ptr, size_t nmemb, size_t size)
+xcrealloc (void *ptr, uint64_t nmemb, size_t size)
 {
   /* Check for overflow.  */
   if (nmemb >= ~(size_t) 0 / size)
     {
-      error (_("Attempt to re-allocate an array with an excessive number of elements: %#zx\n"),
+      error (_("Attempt to re-allocate an array with an excessive number of elements: %#" PRIx64 "\n"),
 	     nmemb);
       xexit (1);
     }
@@ -11131,12 +11131,12 @@ xcrealloc (void *ptr, size_t nmemb, size_t size)
 /* Like xcalloc, but verifies that the first parameter is not too large.  */
 
 void *
-xcalloc2 (size_t nmemb, size_t size)
+xcalloc2 (uint64_t nmemb, size_t size)
 {
   /* Check for overflow.  */
   if (nmemb >= ~(size_t) 0 / size)
     {
-      error (_("Attempt to allocate a zero'ed array with an excessive number of elements: %#zx\n"),
+      error (_("Attempt to allocate a zero'ed array with an excessive number of elements: %#" PRIx64 "\n"),
 	     nmemb);
       xexit (1);
     }
diff --git a/binutils/dwarf.h b/binutils/dwarf.h
index bb6128e3b5b..9c0031355d2 100644
--- a/binutils/dwarf.h
+++ b/binutils/dwarf.h
@@ -144,7 +144,7 @@ struct dwarf_section
   enum dwarf_section_display_enum  abbrev_sec;
   /* Used by clients to help them implement the reloc_at callback.  */
   void *                           reloc_info;
-  unsigned long                    num_relocs;
+  uint64_t                         num_relocs;
 };
 
 /* A structure containing the name of a debug section
@@ -256,10 +256,10 @@ extern void dwarf_select_sections_all (void);
 
 extern unsigned int * find_cu_tu_set (void *, unsigned int);
 
-extern void * cmalloc (size_t, size_t);
-extern void * xcalloc2 (size_t, size_t);
-extern void * xcmalloc (size_t, size_t);
-extern void * xcrealloc (void *, size_t, size_t);
+extern void * cmalloc (uint64_t, size_t);
+extern void * xcalloc2 (uint64_t, size_t);
+extern void * xcmalloc (uint64_t, size_t);
+extern void * xcrealloc (void *, uint64_t, size_t);
 
 /* A callback into the client.  Returns TRUE if there is a
    relocation against the given debug section at the given
diff --git a/binutils/elfcomm.c b/binutils/elfcomm.c
index 0e7d0b57ac6..6070b6ee8d9 100644
--- a/binutils/elfcomm.c
+++ b/binutils/elfcomm.c
@@ -530,7 +530,7 @@ setup_archive (struct archive_info *arch, const char *file_name,
       /* PR 17531: file: 01068045.  */
       if (arch->longnames_size < 8)
 	{
-	  error (_("%s: long name table is too small, (size = %ld)\n"),
+	  error (_("%s: long name table is too small, (size = %" PRId64 ")\n"),
 		 file_name, arch->longnames_size);
 	  return 1;
 	}
@@ -538,7 +538,7 @@ setup_archive (struct archive_info *arch, const char *file_name,
       if ((off_t) arch->longnames_size > file_size
 	  || (signed long) arch->longnames_size < 0)
 	{
-	  error (_("%s: long name table is too big, (size = 0x%lx)\n"),
+	  error (_("%s: long name table is too big, (size = %#" PRIx64 ")\n"),
 		 file_name, arch->longnames_size);
 	  return 1;
 	}
diff --git a/binutils/elfcomm.h b/binutils/elfcomm.h
index bab46b03451..54ac4b36811 100644
--- a/binutils/elfcomm.h
+++ b/binutils/elfcomm.h
@@ -49,19 +49,19 @@ extern uint64_t byte_get_big_endian (const unsigned char *, unsigned int);
 
 struct archive_info
 {
-  char * file_name;                     /* Archive file name.  */
-  FILE * file;                          /* Open file descriptor.  */
-  uint64_t index_num;                   /* Number of symbols in table.  */
-  uint64_t * index_array;               /* The array of member offsets.  */
-  char * sym_table;                     /* The symbol table.  */
-  unsigned long sym_size;               /* Size of the symbol table.  */
-  char * longnames;                     /* The long file names table.  */
-  unsigned long longnames_size;         /* Size of the long file names table.  */
-  unsigned long nested_member_origin;   /* Origin in the nested archive of the current member.  */
-  unsigned long next_arhdr_offset;      /* Offset of the next archive header.  */
-  int is_thin_archive;                  /* 1 if this is a thin archive.  */
-  int uses_64bit_indices;               /* 1 if the index table uses 64bit entries.  */
-  struct ar_hdr arhdr;                  /* Current archive header.  */
+  char *file_name;               /* Archive file name.  */
+  FILE *file;                    /* Open file descriptor.  */
+  uint64_t index_num;            /* Number of symbols in table.  */
+  uint64_t *index_array;         /* The array of member offsets.  */
+  char *sym_table;               /* The symbol table.  */
+  uint64_t sym_size;             /* Size of the symbol table.  */
+  char *longnames;               /* The long file names table.  */
+  uint64_t longnames_size;       /* Size of the long file names table.  */
+  uint64_t nested_member_origin; /* Origin in the nested archive of the current member.  */
+  uint64_t next_arhdr_offset;    /* Offset of the next archive header.  */
+  int is_thin_archive;           /* 1 if this is a thin archive.  */
+  int uses_64bit_indices;        /* 1 if the index table uses 64bit entries.  */
+  struct ar_hdr arhdr;           /* Current archive header.  */
 };
 
 /* Return the path name for a proxy entry in a thin archive.  */
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 291bc13e0d0..1bd6df9448a 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -272,27 +272,27 @@ typedef struct filedata
   FILE *               handle;
   uint64_t             file_size;
   Elf_Internal_Ehdr    file_header;
-  unsigned long        archive_file_offset;
-  unsigned long        archive_file_size;
+  uint64_t             archive_file_offset;
+  uint64_t             archive_file_size;
   /* Everything below this point is cleared out by free_filedata.  */
   Elf_Internal_Shdr *  section_headers;
   Elf_Internal_Phdr *  program_headers;
   char *               string_table;
-  unsigned long        string_table_length;
-  unsigned long        dynamic_addr;
+  uint64_t             string_table_length;
+  uint64_t             dynamic_addr;
   uint64_t             dynamic_size;
-  size_t               dynamic_nent;
+  uint64_t             dynamic_nent;
   Elf_Internal_Dyn *   dynamic_section;
   Elf_Internal_Shdr *  dynamic_strtab_section;
   char *               dynamic_strings;
-  unsigned long        dynamic_strings_length;
+  uint64_t             dynamic_strings_length;
   Elf_Internal_Shdr *  dynamic_symtab_section;
-  unsigned long        num_dynamic_syms;
+  uint64_t             num_dynamic_syms;
   Elf_Internal_Sym *   dynamic_symbols;
-  uint64_t              version_info[16];
+  uint64_t             version_info[16];
   unsigned int         dynamic_syminfo_nent;
   Elf_Internal_Syminfo * dynamic_syminfo;
-  unsigned long        dynamic_syminfo_offset;
+  uint64_t             dynamic_syminfo_offset;
   uint64_t             nbuckets;
   uint64_t             nchains;
   uint64_t *           buckets;
@@ -396,7 +396,7 @@ fseek64 (FILE *stream, int64_t offset, int whence)
 }
 
 static const char * get_symbol_version_string
-  (Filedata *, bool, const char *, unsigned long, unsigned,
+  (Filedata *, bool, const char *, size_t, unsigned,
    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
 
 #define UNKNOWN -1
@@ -473,7 +473,7 @@ get_dynamic_name (const Filedata *filedata, size_t offset)
 static void *
 get_data (void *var,
 	  Filedata *filedata,
-	  unsigned long offset,
+	  uint64_t offset,
 	  uint64_t size,
 	  uint64_t nmemb,
 	  const char *reason)
@@ -516,7 +516,7 @@ get_data (void *var,
 	       SEEK_SET))
     {
       if (reason)
-	error (_("Unable to seek to 0x%lx for %s\n"),
+	error (_("Unable to seek to %#" PRIx64 " for %s\n"),
 	       filedata->archive_file_offset + offset, reason);
       return NULL;
     }
@@ -919,7 +919,7 @@ printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
 }
 
 static const char *
-printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
+printable_section_name_from_index (Filedata *filedata, size_t ndx)
 {
   if (ndx >= filedata->file_header.e_shnum)
     return _("<corrupt>");
@@ -1162,14 +1162,14 @@ guess_is_rela (unsigned int e_machine)
    responsibility to free the allocated buffer.  */
 
 static bool
-slurp_rela_relocs (Filedata *            filedata,
-		   unsigned long         rel_offset,
-		   unsigned long         rel_size,
-		   Elf_Internal_Rela **  relasp,
-		   unsigned long *       nrelasp)
+slurp_rela_relocs (Filedata *filedata,
+		   uint64_t rel_offset,
+		   uint64_t rel_size,
+		   Elf_Internal_Rela **relasp,
+		   uint64_t *nrelasp)
 {
   Elf_Internal_Rela * relas;
-  size_t nrelas;
+  uint64_t nrelas;
   unsigned int i;
 
   if (is_32bit_elf)
@@ -1262,14 +1262,14 @@ slurp_rela_relocs (Filedata *            filedata,
    responsibility to free the allocated buffer.  */
 
 static bool
-slurp_rel_relocs (Filedata *            filedata,
-		  unsigned long         rel_offset,
-		  unsigned long         rel_size,
-		  Elf_Internal_Rela **  relsp,
-		  unsigned long *       nrelsp)
+slurp_rel_relocs (Filedata *filedata,
+		  uint64_t rel_offset,
+		  uint64_t rel_size,
+		  Elf_Internal_Rela **relsp,
+		  uint64_t *nrelsp)
 {
   Elf_Internal_Rela * rels;
-  size_t nrels;
+  uint64_t nrels;
   unsigned int i;
 
   if (is_32bit_elf)
@@ -1354,11 +1354,11 @@ slurp_rel_relocs (Filedata *            filedata,
 }
 
 static bool
-slurp_relr_relocs (Filedata * filedata,
-		   unsigned long relr_offset,
-		   unsigned long relr_size,
-		   uint64_t ** relrsp,
-		   unsigned long * nrelrsp)
+slurp_relr_relocs (Filedata *filedata,
+		   uint64_t relr_offset,
+		   uint64_t relr_size,
+		   uint64_t **relrsp,
+		   uint64_t *nrelrsp)
 {
   void *relrs;
   size_t size = 0, nentries, i;
@@ -1468,17 +1468,17 @@ uses_msp430x_relocs (Filedata * filedata)
    offset.  */
 
 static bool
-dump_relocations (Filedata *          filedata,
-		  unsigned long       rel_offset,
-		  unsigned long       rel_size,
-		  Elf_Internal_Sym *  symtab,
-		  unsigned long       nsyms,
-		  char *              strtab,
-		  unsigned long       strtablen,
-		  relocation_type     rel_type,
-		  bool                is_dynsym)
-{
-  unsigned long i;
+dump_relocations (Filedata *filedata,
+		  uint64_t rel_offset,
+		  uint64_t rel_size,
+		  Elf_Internal_Sym *symtab,
+		  uint64_t nsyms,
+		  char *strtab,
+		  uint64_t strtablen,
+		  relocation_type rel_type,
+		  bool is_dynsym)
+{
+  size_t i;
   Elf_Internal_Rela * rels;
   bool res = true;
 
@@ -1505,7 +1505,8 @@ dump_relocations (Filedata *          filedata,
 			      &rel_size))
 	return false;
 
-      printf (ngettext ("  %lu offset\n", "  %lu offsets\n", rel_size),
+      printf (ngettext ("  %" PRIu64 " offset\n",
+			"  %" PRIu64 " offsets\n", rel_size),
 	      rel_size);
       for (i = 0; i < rel_size; i++)
 	printf (format, relrs[i]);
@@ -1944,8 +1945,8 @@ dump_relocations (Filedata *          filedata,
 	  else
 	    {
 	      putchar (' ');
-	      printf (_("<unknown addend: %lx>"),
-		      (unsigned long) rels[i].r_addend);
+	      printf (_("<unknown addend: %" PRIx64 ">"),
+		      rels[i].r_addend);
 	      res = false;
 	    }
 	}
@@ -2098,7 +2099,7 @@ dump_relocations (Filedata *          filedata,
       if (filedata->file_header.e_machine == EM_SPARCV9
 	  && rtype != NULL
 	  && streq (rtype, "R_SPARC_OLO10"))
-	printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
+	printf (" + %" PRIx64, ELF64_R_TYPE_DATA (inf));
 
       putchar ('\n');
 
@@ -2624,7 +2625,7 @@ static bool get_dynamic_section (Filedata *);
 static void
 locate_dynamic_section (Filedata *filedata)
 {
-  unsigned long dynamic_addr = 0;
+  uint64_t dynamic_addr = 0;
   uint64_t dynamic_size = 0;
 
   if (filedata->file_header.e_phnum != 0
@@ -6126,7 +6127,7 @@ process_program_headers (Filedata * filedata)
 	}
     }
 
-  unsigned long dynamic_addr = 0;
+  uint64_t dynamic_addr = 0;
   uint64_t dynamic_size = 0;
   for (i = 0, segment = filedata->program_headers;
        i < filedata->file_header.e_phnum;
@@ -6374,7 +6375,7 @@ the .dynamic section is not the same as the dynamic segment\n"));
 
 /* Find the file offset corresponding to VMA by using the program headers.  */
 
-static long
+static int64_t
 offset_from_vma (Filedata * filedata, uint64_t vma, uint64_t size)
 {
   Elf_Internal_Phdr * seg;
@@ -6397,9 +6398,9 @@ offset_from_vma (Filedata * filedata, uint64_t vma, uint64_t size)
 	return vma - seg->p_vaddr + seg->p_offset;
     }
 
-  warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
-	(unsigned long) vma);
-  return (long) vma;
+  warn (_("Virtual address %#" PRIx64
+	  " not located in any PT_LOAD segment.\n"), vma);
+  return vma;
 }
 
 
@@ -6560,11 +6561,11 @@ get_section_headers (Filedata *filedata, bool probe)
 }
 
 static Elf_Internal_Sym *
-get_32bit_elf_symbols (Filedata *           filedata,
-		       Elf_Internal_Shdr *  section,
-		       unsigned long *      num_syms_return)
+get_32bit_elf_symbols (Filedata *filedata,
+		       Elf_Internal_Shdr *section,
+		       uint64_t *num_syms_return)
 {
-  unsigned long number = 0;
+  uint64_t number = 0;
   Elf32_External_Sym * esyms = NULL;
   Elf_External_Sym_Shndx * shndx = NULL;
   Elf_Internal_Sym * isyms = NULL;
@@ -6582,17 +6583,17 @@ get_32bit_elf_symbols (Filedata *           filedata,
   /* Run some sanity checks first.  */
   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
     {
-      error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
+      error (_("Section %s has an invalid sh_entsize of %#" PRIx64 "\n"),
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_entsize);
+	     section->sh_entsize);
       goto exit_point;
     }
 
   if (section->sh_size > filedata->file_size)
     {
-      error (_("Section %s has an invalid sh_size of 0x%lx\n"),
+      error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"),
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_size);
+	     section->sh_size);
       goto exit_point;
     }
 
@@ -6600,10 +6601,11 @@ get_32bit_elf_symbols (Filedata *           filedata,
 
   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
     {
-      error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
-	     (unsigned long) section->sh_size,
+      error (_("Size (%#" PRIx64 ") of section %s "
+	       "is not a multiple of its sh_entsize (%#" PRIx64 ")\n"),
+	     section->sh_size,
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_entsize);
+	     section->sh_entsize);
       goto exit_point;
     }
 
@@ -6615,7 +6617,7 @@ get_32bit_elf_symbols (Filedata *           filedata,
   shndx = NULL;
   for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
     {
-      if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
+      if (entry->hdr->sh_link != (size_t) (section - filedata->section_headers))
 	continue;
 
       if (shndx != NULL)
@@ -6634,10 +6636,10 @@ get_32bit_elf_symbols (Filedata *           filedata,
       /* PR17531: file: heap-buffer-overflow */
       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
 	{
-	  error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
+	  error (_("Index section %s has an sh_size of %#" PRIx64 " - expected %#" PRIx64 "\n"),
 		 printable_section_name (filedata, entry->hdr),
-		 (unsigned long) entry->hdr->sh_size,
-		 (unsigned long) section->sh_size);
+		 entry->hdr->sh_size,
+		 section->sh_size);
 	  goto exit_point;
 	}
     }
@@ -6646,8 +6648,7 @@ get_32bit_elf_symbols (Filedata *           filedata,
 
   if (isyms == NULL)
     {
-      error (_("Out of memory reading %lu symbols\n"),
-	     (unsigned long) number);
+      error (_("Out of memory reading %" PRIu64 " symbols\n"), number);
       goto exit_point;
     }
 
@@ -6677,11 +6678,11 @@ get_32bit_elf_symbols (Filedata *           filedata,
 }
 
 static Elf_Internal_Sym *
-get_64bit_elf_symbols (Filedata *           filedata,
-		       Elf_Internal_Shdr *  section,
-		       unsigned long *      num_syms_return)
+get_64bit_elf_symbols (Filedata *filedata,
+		       Elf_Internal_Shdr *section,
+		       uint64_t *num_syms_return)
 {
-  unsigned long number = 0;
+  uint64_t number = 0;
   Elf64_External_Sym * esyms = NULL;
   Elf_External_Sym_Shndx * shndx = NULL;
   Elf_Internal_Sym * isyms = NULL;
@@ -6699,17 +6700,17 @@ get_64bit_elf_symbols (Filedata *           filedata,
   /* Run some sanity checks first.  */
   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
     {
-      error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
+      error (_("Section %s has an invalid sh_entsize of %#" PRIx64 "\n"),
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_entsize);
+	     section->sh_entsize);
       goto exit_point;
     }
 
   if (section->sh_size > filedata->file_size)
     {
-      error (_("Section %s has an invalid sh_size of 0x%lx\n"),
+      error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"),
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_size);
+	     section->sh_size);
       goto exit_point;
     }
 
@@ -6717,10 +6718,11 @@ get_64bit_elf_symbols (Filedata *           filedata,
 
   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
     {
-      error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
-	     (unsigned long) section->sh_size,
+      error (_("Size (%#" PRIx64 ") of section %s "
+	       "is not a multiple of its sh_entsize (%#" PRIx64 ")\n"),
+	     section->sh_size,
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_entsize);
+	     section->sh_entsize);
       goto exit_point;
     }
 
@@ -6732,7 +6734,7 @@ get_64bit_elf_symbols (Filedata *           filedata,
   shndx = NULL;
   for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
     {
-      if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
+      if (entry->hdr->sh_link != (size_t) (section - filedata->section_headers))
 	continue;
 
       if (shndx != NULL)
@@ -6751,10 +6753,10 @@ get_64bit_elf_symbols (Filedata *           filedata,
       /* PR17531: file: heap-buffer-overflow */
       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
 	{
-	  error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
+	  error (_("Index section %s has an sh_size of %#" PRIx64 " - expected %#" PRIx64 "\n"),
 		 printable_section_name (filedata, entry->hdr),
-		 (unsigned long) entry->hdr->sh_size,
-		 (unsigned long) section->sh_size);
+		 entry->hdr->sh_size,
+		 section->sh_size);
 	  goto exit_point;
 	}
     }
@@ -6763,8 +6765,7 @@ get_64bit_elf_symbols (Filedata *           filedata,
 
   if (isyms == NULL)
     {
-      error (_("Out of memory reading %lu symbols\n"),
-	     (unsigned long) number);
+      error (_("Out of memory reading %" PRIu64 " symbols\n"), number);
       goto exit_point;
     }
 
@@ -6798,7 +6799,7 @@ get_64bit_elf_symbols (Filedata *           filedata,
 static Elf_Internal_Sym *
 get_elf_symbols (Filedata *filedata,
 		 Elf_Internal_Shdr *section,
-		 unsigned long *num_syms_return)
+		 uint64_t *num_syms_return)
 {
   if (is_32bit_elf)
     return get_32bit_elf_symbols (filedata, section, num_syms_return);
@@ -7183,12 +7184,12 @@ process_section_headers (Filedata * filedata)
 	printf (_("In linked file '%s': "), filedata->file_name);
       if (! filedata->is_separate || process_links)
 	printf (ngettext ("There is %d section header, "
-			  "starting at offset 0x%lx:\n",
+			  "starting at offset %#" PRIx64 ":\n",
 			  "There are %d section headers, "
-			  "starting at offset 0x%lx:\n",
+			  "starting at offset %#" PRIx64 ":\n",
 			  filedata->file_header.e_shnum),
 		filedata->file_header.e_shnum,
-		(unsigned long) filedata->file_header.e_shoff);
+		filedata->file_header.e_shoff);
     }
 
   if (!get_section_headers (filedata, false))
@@ -7854,8 +7855,8 @@ process_section_headers (Filedata * filedata)
 
 static bool
 get_symtab (Filedata *filedata, Elf_Internal_Shdr *symsec,
-	    Elf_Internal_Sym **symtab, unsigned long *nsyms,
-	    char **strtab, unsigned long *strtablen)
+	    Elf_Internal_Sym **symtab, uint64_t *nsyms,
+	    char **strtab, uint64_t *strtablen)
 {
   *strtab = NULL;
   *strtablen = 0;
@@ -7922,7 +7923,7 @@ process_section_groups (Filedata * filedata)
   Elf_Internal_Shdr * symtab_sec;
   Elf_Internal_Shdr * strtab_sec;
   Elf_Internal_Sym * symtab;
-  unsigned long num_syms;
+  uint64_t num_syms;
   char * strtab;
   size_t strtab_size;
 
@@ -7988,8 +7989,7 @@ process_section_groups (Filedata * filedata)
 
   if (filedata->section_groups == NULL)
     {
-      error (_("Out of memory reading %lu groups\n"),
-	     (unsigned long) filedata->group_count);
+      error (_("Out of memory reading %zu groups\n"), filedata->group_count);
       return false;
     }
 
@@ -8092,10 +8092,11 @@ process_section_groups (Filedata * filedata)
 	  /* PR 17531: file: loop.  */
 	  if (section->sh_entsize > section->sh_size)
 	    {
-	      error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
+	      error (_("Section %s has sh_entsize (%#" PRIx64 ")"
+		       " which is larger than its size (%#" PRIx64 ")\n"),
 		     printable_section_name (filedata, section),
-		     (unsigned long) section->sh_entsize,
-		     (unsigned long) section->sh_size);
+		     section->sh_entsize,
+		     section->sh_size);
 	      continue;
 	    }
 
@@ -8226,7 +8227,7 @@ dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
 			      unsigned int                strtab_sz)
 {
   Elf64_External_VMS_IMAGE_FIXUP * imfs;
-  long i;
+  size_t i;
   const char * lib_name;
 
   imfs = get_data (NULL, filedata,
@@ -8240,17 +8241,18 @@ dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
     lib_name = strtab + fixup->needed;
   else
     {
-      warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
-            (unsigned long) fixup->needed);
+      warn (_("corrupt library name index of %#" PRIx64
+	      " found in dynamic entry"), fixup->needed);
       lib_name = "???";
     }
 
-  printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
-	  (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
+  printf (_("\nImage fixups for needed library #%" PRId64
+	    ": %s - ident: %" PRIx64 "\n"),
+	  fixup->fixup_needed, lib_name, fixup->needed_ident);
   printf
     (_("Seg Offset           Type                             SymVec DataType\n"));
 
-  for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
+  for (i = 0; i < (size_t) fixup->fixup_rela_cnt; i++)
     {
       unsigned int type;
       const char *rtype;
@@ -8277,7 +8279,7 @@ static bool
 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
 {
   Elf64_External_VMS_IMAGE_RELA *imrs;
-  long i;
+  size_t i;
 
   imrs = get_data (NULL, filedata,
 		   filedata->dynamic_addr + imgrela->img_rela_off,
@@ -8290,7 +8292,7 @@ dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *i
   printf
     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
 
-  for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
+  for (i = 0; i < (size_t) imgrela->img_rela_cnt; i++)
     {
       unsigned int type;
       const char *rtype;
@@ -8404,8 +8406,8 @@ static struct
 static bool
 process_relocs (Filedata * filedata)
 {
-  unsigned long rel_size;
-  unsigned long rel_offset;
+  uint64_t rel_size;
+  uint64_t rel_offset;
 
   if (!do_reloc)
     return true;
@@ -8447,11 +8449,13 @@ process_relocs (Filedata * filedata)
 	    {
 	      if (filedata->is_separate)
 		printf
-		  (_("\nIn linked file '%s' section '%s' at offset 0x%lx contains %ld bytes:\n"),
+		  (_("\nIn linked file '%s' section '%s' at offset %#" PRIx64
+		     " contains %" PRId64 " bytes:\n"),
 		   filedata->file_name, name, rel_offset, rel_size);
 	      else
 		printf
-		  (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
+		  (_("\n'%s' relocation section at offset %#" PRIx64
+		     " contains %" PRId64 " bytes:\n"),
 		   name, rel_offset, rel_size);
 
 	      dump_relocations (filedata,
@@ -8481,7 +8485,7 @@ process_relocs (Filedata * filedata)
   else
     {
       Elf_Internal_Shdr * section;
-      unsigned long i;
+      size_t i;
       bool found = false;
 
       for (i = 0, section = filedata->section_headers;
@@ -8499,7 +8503,7 @@ process_relocs (Filedata * filedata)
 	  if (rel_size)
 	    {
 	      relocation_type rel_type;
-	      unsigned long num_rela;
+	      uint64_t num_rela;
 
 	      if (filedata->is_separate)
 		printf (_("\nIn linked file '%s' relocation section "),
@@ -8513,8 +8517,10 @@ process_relocs (Filedata * filedata)
 		printf ("'%s'", printable_section_name (filedata, section));
 
 	      num_rela = rel_size / section->sh_entsize;
-	      printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
-				" at offset 0x%lx contains %lu entries:\n",
+	      printf (ngettext (" at offset %#" PRIx64
+				" contains %" PRIu64 " entry:\n",
+				" at offset %#" PRIx64
+				" contains %" PRId64 " entries:\n",
 				num_rela),
 		      rel_offset, num_rela);
 
@@ -8524,11 +8530,11 @@ process_relocs (Filedata * filedata)
 	      if (section->sh_link != 0
 		  && section->sh_link < filedata->file_header.e_shnum)
 		{
-		  Elf_Internal_Shdr * symsec;
-		  Elf_Internal_Sym *  symtab;
-		  unsigned long nsyms;
-		  unsigned long strtablen = 0;
-		  char * strtab = NULL;
+		  Elf_Internal_Shdr *symsec;
+		  Elf_Internal_Sym *symtab;
+		  uint64_t nsyms;
+		  uint64_t strtablen = 0;
+		  char *strtab = NULL;
 
 		  symsec = filedata->section_headers + section->sh_link;
 		  if (symsec->sh_type != SHT_SYMTAB
@@ -8599,14 +8605,14 @@ struct absaddr
    name, if found, and the offset from the symbol to ADDR.  */
 
 static void
-find_symbol_for_address (Filedata *          filedata,
-			 Elf_Internal_Sym *  symtab,
-			 unsigned long       nsyms,
-			 const char *        strtab,
-			 unsigned long       strtab_size,
-			 struct absaddr      addr,
-			 const char **       symname,
-			 uint64_t *          offset)
+find_symbol_for_address (Filedata *filedata,
+			 Elf_Internal_Sym *symtab,
+			 uint64_t nsyms,
+			 const char *strtab,
+			 uint64_t strtab_size,
+			 struct absaddr addr,
+			 const char **symname,
+			 uint64_t *offset)
 {
   uint64_t dist = 0x100000;
   Elf_Internal_Sym * sym;
@@ -8679,24 +8685,24 @@ struct ia64_unw_table_entry
 struct ia64_unw_aux_info
 {
   struct ia64_unw_table_entry * table;		/* Unwind table.  */
-  unsigned long                 table_len;	/* Length of unwind table.  */
+  uint64_t                      table_len;	/* Length of unwind table.  */
   unsigned char *               info;		/* Unwind info.  */
-  unsigned long                 info_size;	/* Size of unwind info.  */
+  uint64_t                      info_size;	/* Size of unwind info.  */
   uint64_t                      info_addr;	/* Starting address of unwind info.  */
   uint64_t                      seg_base;	/* Starting address of segment.  */
   Elf_Internal_Sym *            symtab;		/* The symbol table.  */
-  unsigned long                 nsyms;		/* Number of symbols.  */
+  uint64_t                      nsyms;		/* Number of symbols.  */
   Elf_Internal_Sym *            funtab;		/* Sorted table of STT_FUNC symbols.  */
-  unsigned long                 nfuns;		/* Number of entries in funtab.  */
+  uint64_t                      nfuns;		/* Number of entries in funtab.  */
   char *                        strtab;		/* The string table.  */
-  unsigned long                 strtab_size;	/* Size of string table.  */
+  uint64_t                      strtab_size;	/* Size of string table.  */
 };
 
 static bool
 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
 {
   struct ia64_unw_table_entry * tp;
-  unsigned long j, nfuns;
+  size_t j, nfuns;
   int in_body;
   bool res = true;
 
@@ -8726,15 +8732,15 @@ dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
 	  fputs (procname, stdout);
 
 	  if (offset)
-	    printf ("+%lx", (unsigned long) offset);
+	    printf ("+%" PRIx64, offset);
 	}
 
       fputs (">: [", stdout);
       print_vma (tp->start.offset, PREFIX_HEX);
       fputc ('-', stdout);
       print_vma (tp->end.offset, PREFIX_HEX);
-      printf ("], info at +0x%lx\n",
-	      (unsigned long) (tp->info.offset - aux->seg_base));
+      printf ("], info at +0x%" PRIx64 "\n",
+	      tp->info.offset - aux->seg_base);
 
       /* PR 17531: file: 86232b32.  */
       if (aux->info == NULL)
@@ -8745,8 +8751,8 @@ dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
 	{
 	  if (tp->info.section >= filedata->file_header.e_shnum)
 	    {
-	      warn (_("Invalid section %u in table entry %ld\n"),
-		    tp->info.section, (long) (tp - aux->table));
+	      warn (_("Invalid section %u in table entry %td\n"),
+		    tp->info.section, tp - aux->table);
 	      res = false;
 	      continue;
 	    }
@@ -8757,8 +8763,8 @@ dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
       if (offset >= aux->info_size
 	  || aux->info_size - offset < 8)
 	{
-	  warn (_("Invalid offset %lx in table entry %ld\n"),
-		(long) tp->info.offset, (long) (tp - aux->table));
+	  warn (_("Invalid offset %" PRIx64 " in table entry %td\n"),
+		tp->info.offset, tp - aux->table);
 	  res = false;
 	  continue;
 	}
@@ -8798,7 +8804,7 @@ slurp_ia64_unwind_table (Filedata *                  filedata,
 			 struct ia64_unw_aux_info *  aux,
 			 Elf_Internal_Shdr *         sec)
 {
-  unsigned long size, nrelas, i;
+  uint64_t size, nrelas, i;
   Elf_Internal_Phdr * seg;
   struct ia64_unw_table_entry * tep;
   Elf_Internal_Shdr * relsec;
@@ -8904,7 +8910,8 @@ slurp_ia64_unwind_table (Filedata *                  filedata,
 	  /* PR 17531: file: 5bc8d9bf.  */
 	  if (i >= aux->table_len)
 	    {
-	      warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
+	      warn (_("Skipping reloc with overlarge offset: %#" PRIx64 "\n"),
+		    i);
 	      continue;
 	    }
 
@@ -8947,7 +8954,7 @@ ia64_process_unwind (Filedata * filedata)
 {
   Elf_Internal_Shdr * sec;
   Elf_Internal_Shdr * unwsec = NULL;
-  unsigned long i, unwcount = 0, unwstart = 0;
+  uint64_t i, unwcount = 0, unwstart = 0;
   struct ia64_unw_aux_info aux;
   bool res = true;
 
@@ -9082,9 +9089,9 @@ ia64_process_unwind (Filedata * filedata)
 	  else
 	    printf ("'%s'", printable_section_name (filedata, unwsec));
 
-	  printf (_(" at offset 0x%lx contains %lu entries:\n"),
-		  (unsigned long) unwsec->sh_offset,
-		  (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
+	  printf (_(" at offset %#" PRIx64 " contains %" PRIu64 " entries:\n"),
+		  unwsec->sh_offset,
+		  unwsec->sh_size / (3 * eh_addr_size));
 
 	  if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
 	      && aux.table_len > 0)
@@ -9143,21 +9150,21 @@ struct hppa_unw_table_entry
 struct hppa_unw_aux_info
 {
   struct hppa_unw_table_entry *  table;		/* Unwind table.  */
-  unsigned long                  table_len;	/* Length of unwind table.  */
+  uint64_t                       table_len;	/* Length of unwind table.  */
   uint64_t                       seg_base;	/* Starting address of segment.  */
   Elf_Internal_Sym *             symtab;	/* The symbol table.  */
-  unsigned long                  nsyms;		/* Number of symbols.  */
+  uint64_t                       nsyms;		/* Number of symbols.  */
   Elf_Internal_Sym *             funtab;	/* Sorted table of STT_FUNC symbols.  */
-  unsigned long                  nfuns;		/* Number of entries in funtab.  */
+  uint64_t                       nfuns;		/* Number of entries in funtab.  */
   char *                         strtab;	/* The string table.  */
-  unsigned long                  strtab_size;	/* Size of string table.  */
+  uint64_t                       strtab_size;	/* Size of string table.  */
 };
 
 static bool
 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
 {
   struct hppa_unw_table_entry * tp;
-  unsigned long j, nfuns;
+  uint64_t j, nfuns;
   bool res = true;
 
   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
@@ -9183,7 +9190,7 @@ dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
 	  fputs (procname, stdout);
 
 	  if (offset)
-	    printf ("+%lx", (unsigned long) offset);
+	    printf ("+%" PRIx64, offset);
 	}
 
       fputs (">: [", stdout);
@@ -9237,7 +9244,7 @@ slurp_hppa_unwind_table (Filedata *                  filedata,
 			 struct hppa_unw_aux_info *  aux,
 			 Elf_Internal_Shdr *         sec)
 {
-  unsigned long size, unw_ent_size, nentries, nrelas, i;
+  uint64_t size, unw_ent_size, nentries, nrelas, i;
   Elf_Internal_Phdr * seg;
   struct hppa_unw_table_entry * tep;
   Elf_Internal_Shdr * relsec;
@@ -9372,7 +9379,8 @@ slurp_hppa_unwind_table (Filedata *                  filedata,
 	  i = rp->r_offset / unw_ent_size;
 	  if (i >= aux->table_len)
 	    {
-	      warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
+	      warn (_("Skipping reloc with overlarge offset: %#" PRIx64 "\n"),
+		    i);
 	      continue;
 	    }
 
@@ -9412,7 +9420,7 @@ hppa_process_unwind (Filedata * filedata)
   struct hppa_unw_aux_info aux;
   Elf_Internal_Shdr * unwsec = NULL;
   Elf_Internal_Shdr * sec;
-  unsigned long i;
+  size_t i;
   bool res = true;
 
   if (filedata->string_table == NULL)
@@ -9449,15 +9457,15 @@ hppa_process_unwind (Filedata * filedata)
       if (section_name_valid (filedata, sec)
 	  && streq (section_name (filedata, sec), ".PARISC.unwind"))
 	{
-	  unsigned long num_unwind = sec->sh_size / 16;
+	  uint64_t num_unwind = sec->sh_size / 16;
 
-	  printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
-			    "contains %lu entry:\n",
-			    "\nUnwind section '%s' at offset 0x%lx "
-			    "contains %lu entries:\n",
+	  printf (ngettext ("\nUnwind section '%s' at offset %#" PRIx64 " "
+			    "contains %" PRIu64 " entry:\n",
+			    "\nUnwind section '%s' at offset %#" PRIx64 " "
+			    "contains %" PRIu64 " entries:\n",
 			    num_unwind),
 		  printable_section_name (filedata, sec),
-		  (unsigned long) sec->sh_offset,
+		  sec->sh_offset,
 		  num_unwind);
 
           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
@@ -9485,7 +9493,7 @@ struct arm_section
   unsigned char *      data;		/* The unwind data.  */
   Elf_Internal_Shdr *  sec;		/* The cached unwind section header.  */
   Elf_Internal_Rela *  rela;		/* The cached relocations for this section.  */
-  unsigned long        nrelas;		/* The number of relocations.  */
+  uint64_t             nrelas;		/* The number of relocations.  */
   unsigned int         rel_type;	/* REL or RELA ?  */
   Elf_Internal_Rela *  next_rela;	/* Cyclic pointer to the next reloc to process.  */
 };
@@ -9494,11 +9502,11 @@ struct arm_unw_aux_info
 {
   Filedata *          filedata;		/* The file containing the unwind sections.  */
   Elf_Internal_Sym *  symtab;		/* The file's symbol table.  */
-  unsigned long       nsyms;		/* Number of symbols.  */
+  uint64_t            nsyms;		/* Number of symbols.  */
   Elf_Internal_Sym *  funtab;		/* Sorted table of STT_FUNC symbols.  */
-  unsigned long       nfuns;		/* Number of these symbols.  */
+  uint64_t            nfuns;		/* Number of these symbols.  */
   char *              strtab;		/* The file's string table.  */
-  unsigned long       strtab_size;	/* Size of string table.  */
+  uint64_t            strtab_size;	/* Size of string table.  */
 };
 
 static const char *
@@ -9525,7 +9533,7 @@ arm_print_vma_and_name (Filedata *                 filedata,
       fputs (procname, stdout);
 
       if (sym_offset)
-	printf ("+0x%lx", (unsigned long) sym_offset);
+	printf ("+0x%" PRIx64, sym_offset);
       fputc ('>', stdout);
     }
 
@@ -9656,8 +9664,8 @@ get_unwind_section_word (Filedata *                 filedata,
 
       if (rp->r_offset & 3)
 	{
-	  warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
-		(unsigned long) rp->r_offset);
+	  warn (_("Skipping unexpected relocation at offset %#" PRIx64 "\n"),
+		rp->r_offset);
 	  continue;
 	}
 
@@ -9686,8 +9694,9 @@ get_unwind_section_word (Filedata *                 filedata,
       /* PR 17531 file: 027-1241568-0.004.  */
       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
 	{
-	  error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
-		 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
+	  error (_("Bad symbol index in unwind relocation "
+		   "(%" PRIu64 " > %" PRIu64 ")\n"),
+		 ELF32_R_SYM (rp->r_info), aux->nsyms);
 	  break;
 	}
 
@@ -9930,7 +9939,7 @@ decode_arm_unwind_bytecode (Filedata *                 filedata,
 	{
 	  unsigned char buf[9];
 	  unsigned int i, len;
-	  unsigned long offset;
+	  uint64_t offset;
 
 	  for (i = 0; i < sizeof (buf); i++)
 	    {
@@ -9948,7 +9957,7 @@ decode_arm_unwind_bytecode (Filedata *                 filedata,
 	      offset = read_leb128 (buf, buf + i + 1, false, &len, NULL);
 	      assert (len == i + 1);
 	      offset = offset * 4 + 0x204;
-	      printf ("vsp = vsp + %ld", offset);
+	      printf ("vsp = vsp + %" PRId64, offset);
 	    }
 	}
       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
@@ -10153,7 +10162,7 @@ decode_tic6x_unwind_bytecode (Filedata *                 filedata,
 	{
 	  unsigned char buf[9];
 	  unsigned int i, len;
-	  unsigned long offset;
+	  uint64_t offset;
 
 	  for (i = 0; i < sizeof (buf); i++)
 	    {
@@ -10171,7 +10180,7 @@ decode_tic6x_unwind_bytecode (Filedata *                 filedata,
 	  offset = read_leb128 (buf, buf + i + 1, false, &len, NULL);
 	  assert (len == i + 1);
 	  offset = offset * 8 + 0x408;
-	  printf (_("sp = sp + %ld"), offset);
+	  printf (_("sp = sp + %" PRId64), offset);
 	}
       else if ((op & 0xf0) == 0xe0)
 	{
@@ -10382,7 +10391,7 @@ dump_arm_unwind (Filedata *                 filedata,
 {
   struct arm_section exidx_arm_sec, extab_arm_sec;
   unsigned int i, exidx_len;
-  unsigned long j, nfuns;
+  uint64_t j, nfuns;
   bool res = true;
 
   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
@@ -10459,8 +10468,8 @@ dump_arm_unwind (Filedata *                 filedata,
 	      /* PR 18879 */
 	      if (table_offset > table_sec->sh_size)
 		{
-		  warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
-			(unsigned long) table_offset,
+		  warn (_("Unwind entry contains corrupt offset (%#" PRIx64 ") into section %s\n"),
+			table_offset,
 			printable_section_name (filedata, table_sec));
 		  res = false;
 		  continue;
@@ -10475,8 +10484,8 @@ dump_arm_unwind (Filedata *                 filedata,
 
 	  if (table_sec == NULL)
 	    {
-	      warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
-		    (unsigned long) table);
+	      warn (_("Could not locate .ARM.extab section containing %#" PRIx64 ".\n"),
+		    table);
 	      res = false;
 	      continue;
 	    }
@@ -10504,7 +10513,7 @@ arm_process_unwind (Filedata * filedata)
   struct arm_unw_aux_info aux;
   Elf_Internal_Shdr *unwsec = NULL;
   Elf_Internal_Shdr *sec;
-  unsigned long i;
+  size_t i;
   unsigned int sec_type;
   bool res = true;
 
@@ -10557,14 +10566,14 @@ arm_process_unwind (Filedata * filedata)
       {
 	if (sec->sh_type == sec_type)
 	  {
-	    unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
-	    printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
-			      "contains %lu entry:\n",
-			      "\nUnwind section '%s' at offset 0x%lx "
-			      "contains %lu entries:\n",
+	    uint64_t num_unwind = sec->sh_size / (2 * eh_addr_size);
+	    printf (ngettext ("\nUnwind section '%s' at offset %#" PRIx64 " "
+			      "contains %" PRIu64 " entry:\n",
+			      "\nUnwind section '%s' at offset %#" PRIx64 " "
+			      "contains %" PRIu64 " entries:\n",
 			      num_unwind),
 		    printable_section_name (filedata, sec),
-		    (unsigned long) sec->sh_offset,
+		    sec->sh_offset,
 		    num_unwind);
 
 	    if (! dump_arm_unwind (filedata, &aux, sec))
@@ -10724,7 +10733,7 @@ dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
       {
 	static struct
 	{
-	  long int bit;
+	  unsigned int bit;
 	  const char * str;
 	}
 	flags[] =
@@ -10893,8 +10902,8 @@ get_32bit_dynamic_section (Filedata * filedata)
     = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
   if (filedata->dynamic_section == NULL)
     {
-      error (_("Out of memory allocating space for %lu dynamic entries\n"),
-	     (unsigned long) filedata->dynamic_nent);
+      error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"),
+	     filedata->dynamic_nent);
       free (edyn);
       return false;
     }
@@ -10944,8 +10953,8 @@ get_64bit_dynamic_section (Filedata * filedata)
     = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
   if (filedata->dynamic_section == NULL)
     {
-      error (_("Out of memory allocating space for %lu dynamic entries\n"),
-	     (unsigned long) filedata->dynamic_nent);
+      error (_("Out of memory allocating space for %" PRIu64 " dynamic entries\n"),
+	     filedata->dynamic_nent);
       free (edyn);
       return false;
     }
@@ -11066,10 +11075,10 @@ get_dynamic_data (Filedata * filedata, uint64_t number, unsigned int ent_size)
   return i_data;
 }
 
-static unsigned long
+static uint64_t
 get_num_dynamic_syms (Filedata * filedata)
 {
-  unsigned long num_of_syms = 0;
+  uint64_t num_of_syms = 0;
 
   if (!do_histogram && (!do_using_dynamic || do_dyn_syms))
     return num_of_syms;
@@ -11138,7 +11147,7 @@ get_num_dynamic_syms (Filedata * filedata)
       unsigned char nb[16];
       uint64_t i, maxchain = 0xffffffff, bitmaskwords;
       uint64_t buckets_vma;
-      unsigned long hn;
+      uint64_t hn;
 
       if (fseek64 (filedata->handle,
 		   (filedata->archive_file_offset
@@ -11327,7 +11336,7 @@ process_dynamic_section (Filedata * filedata)
   /* Find the appropriate symbol table.  */
   if (filedata->dynamic_symbols == NULL || do_histogram)
     {
-      unsigned long num_of_syms;
+      uint64_t num_of_syms;
 
       for (entry = filedata->dynamic_section;
 	   entry < filedata->dynamic_section + filedata->dynamic_nent;
@@ -11435,7 +11444,7 @@ the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n"));
 	if (filedata->dynamic_info[DT_STRTAB]
 	    && filedata->dynamic_info[DT_STRSZ])
 	  {
-	    unsigned long offset;
+	    uint64_t offset;
 	    uint64_t str_tab_len = filedata->dynamic_info[DT_STRSZ];
 
 	    offset = offset_from_vma (filedata,
@@ -11467,7 +11476,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
   /* And find the syminfo section if available.  */
   if (filedata->dynamic_syminfo == NULL)
     {
-      unsigned long syminsz = 0;
+      uint64_t syminsz = 0;
 
       for (entry = filedata->dynamic_section;
 	   entry < filedata->dynamic_section + filedata->dynamic_nent;
@@ -11511,9 +11520,9 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 	  filedata->dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
 	  if (filedata->dynamic_syminfo == NULL)
 	    {
-	      error (_("Out of memory allocating %lu bytes "
-		       "for dynamic symbol info\n"),
-		     (unsigned long) syminsz);
+	      error (_("Out of memory allocating %" PRIu64
+		       " bytes for dynamic symbol info\n"),
+		     syminsz);
 	      return false;
 	    }
 
@@ -11535,18 +11544,18 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
   if (do_dynamic && filedata->dynamic_addr)
     {
       if (filedata->is_separate)
-	printf (ngettext ("\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entry:\n",
-			  "\nIn linked file '%s' the dynamic section at offset 0x%lx contains %lu entries:\n",
-			  (unsigned long) filedata->dynamic_nent),
+	printf (ngettext ("\nIn linked file '%s' the dynamic section at offset %#" PRIx64 " contains %" PRIu64 " entry:\n",
+			  "\nIn linked file '%s' the dynamic section at offset %#" PRIx64 " contains %" PRIu64 " entries:\n",
+			  filedata->dynamic_nent),
 		filedata->file_name,
 		filedata->dynamic_addr,
-		(unsigned long) filedata->dynamic_nent);
+		filedata->dynamic_nent);
       else
-	printf (ngettext ("\nDynamic section at offset 0x%lx contains %lu entry:\n",
-			  "\nDynamic section at offset 0x%lx contains %lu entries:\n",
-			  (unsigned long) filedata->dynamic_nent),
+	printf (ngettext ("\nDynamic section at offset %#" PRIx64 " contains %" PRId64 " entry:\n",
+			  "\nDynamic section at offset %#" PRIx64 " contains %" PRIu64 " entries:\n",
+			  filedata->dynamic_nent),
 		filedata->dynamic_addr,
-		(unsigned long) filedata->dynamic_nent);
+		filedata->dynamic_nent);
     }
   if (do_dynamic)
     printf (_("  Tag        Type                         Name/Value\n"));
@@ -11624,7 +11633,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		printf (_(" None\n"));
 	      else
 		{
-		  unsigned long int val = entry->d_un.d_val;
+		  uint64_t val = entry->d_un.d_val;
 
 		  if (val & DTF_1_PARINIT)
 		    {
@@ -11637,7 +11646,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		      val ^= DTF_1_CONFEXP;
 		    }
 		  if (val != 0)
-		    printf (" %lx", val);
+		    printf (" %" PRIx64, val);
 		  puts ("");
 		}
 	    }
@@ -11652,7 +11661,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		printf (_(" None\n"));
 	      else
 		{
-		  unsigned long int val = entry->d_un.d_val;
+		  uint64_t val = entry->d_un.d_val;
 
 		  if (val & DF_P1_LAZYLOAD)
 		    {
@@ -11665,7 +11674,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		      val ^= DF_P1_GROUPPERM;
 		    }
 		  if (val != 0)
-		    printf (" %lx", val);
+		    printf (" %" PRIx64, val);
 		  puts ("");
 		}
 	    }
@@ -11679,7 +11688,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		printf (_(" None\n"));
 	      else
 		{
-		  unsigned long int val = entry->d_un.d_val;
+		  uint64_t val = entry->d_un.d_val;
 
 		  if (val & DF_1_NOW)
 		    {
@@ -11837,7 +11846,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		      val ^= DF_1_NOCOMMON;
 		    }
 		  if (val != 0)
-		    printf (" %lx", val);
+		    printf (" %" PRIx64, val);
 		  puts ("");
 		}
 	    }
@@ -11992,8 +12001,8 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 	      tmp = gmtime (&atime);
 	      /* PR 17533 file: 041-1244816-0.004.  */
 	      if (tmp == NULL)
-		printf (_("<corrupt time val: %lx"),
-			(unsigned long) atime);
+		printf (_("<corrupt time val: %" PRIx64),
+			(uint64_t) atime);
 	      else
 		printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
@@ -12019,7 +12028,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		printf (_(" None\n"));
 	      else
 		{
-		  unsigned long int val = entry->d_un.d_val;
+		  uint64_t val = entry->d_un.d_val;
 
 		  if (val & DF_GNU_1_UNIQUE)
 		    {
@@ -12027,7 +12036,7 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		      val ^= DF_GNU_1_UNIQUE;
 		    }
 		  if (val != 0)
-		    printf (" %lx", val);
+		    printf (" %" PRIx64, val);
 		  puts ("");
 		}
 	    }
@@ -12128,8 +12137,8 @@ process_version_sections (Filedata * filedata)
 	case SHT_GNU_verdef:
 	  {
 	    Elf_External_Verdef * edefs;
-	    unsigned long idx;
-	    unsigned long cnt;
+	    size_t idx;
+	    size_t cnt;
 	    char * endbuf;
 
 	    found = true;
@@ -12151,8 +12160,8 @@ process_version_sections (Filedata * filedata)
 		      section->sh_info);
 
 	    printf (_(" Addr: 0x%016" PRIx64), section->sh_addr);
-	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
-		    (unsigned long) section->sh_offset, section->sh_link,
+	    printf (_("  Offset: 0x%08" PRIx64 "  Link: %u (%s)\n"),
+		    section->sh_offset, section->sh_link,
 		    printable_section_name_from_index (filedata, section->sh_link));
 
 	    edefs = (Elf_External_Verdef *)
@@ -12169,7 +12178,7 @@ process_version_sections (Filedata * filedata)
 		Elf_Internal_Verdef ent;
 		Elf_External_Verdaux * eaux;
 		Elf_Internal_Verdaux aux;
-		unsigned long isum;
+		size_t isum;
 		int j;
 
 		vstart = ((char *) edefs) + idx;
@@ -12186,7 +12195,7 @@ process_version_sections (Filedata * filedata)
 		ent.vd_aux     = BYTE_GET (edef->vd_aux);
 		ent.vd_next    = BYTE_GET (edef->vd_next);
 
-		printf (_("  %#06lx: Rev: %d  Flags: %s"),
+		printf (_("  %#06zx: Rev: %d  Flags: %s"),
 			idx, ent.vd_version, get_ver_flags (ent.vd_flags));
 
 		printf (_("  Index: %d  Cnt: %d  "),
@@ -12238,11 +12247,11 @@ process_version_sections (Filedata * filedata)
 		    aux.vda_next = BYTE_GET (eaux->vda_next);
 
 		    if (valid_dynamic_name (filedata, aux.vda_name))
-		      printf (_("  %#06lx: Parent %d: %s\n"),
+		      printf (_("  %#06zx: Parent %d: %s\n"),
 			      isum, j,
 			      get_dynamic_name (filedata, aux.vda_name));
 		    else
-		      printf (_("  %#06lx: Parent %d, name index: %ld\n"),
+		      printf (_("  %#06zx: Parent %d, name index: %ld\n"),
 			      isum, j, aux.vda_name);
 		  }
 
@@ -12274,8 +12283,8 @@ process_version_sections (Filedata * filedata)
 	case SHT_GNU_verneed:
 	  {
 	    Elf_External_Verneed * eneed;
-	    unsigned long idx;
-	    unsigned long cnt;
+	    size_t idx;
+	    size_t cnt;
 	    char * endbuf;
 
 	    found = true;
@@ -12297,8 +12306,8 @@ process_version_sections (Filedata * filedata)
 		      section->sh_info);
 
 	    printf (_(" Addr: 0x%016" PRIx64), section->sh_addr);
-	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
-		    (unsigned long) section->sh_offset, section->sh_link,
+	    printf (_("  Offset: 0x%08" PRIx64 "  Link: %u (%s)\n"),
+		    section->sh_offset, section->sh_link,
 		    printable_section_name_from_index (filedata, section->sh_link));
 
 	    eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
@@ -12313,7 +12322,7 @@ process_version_sections (Filedata * filedata)
 	      {
 		Elf_External_Verneed * entry;
 		Elf_Internal_Verneed ent;
-		unsigned long isum;
+		size_t isum;
 		int j;
 		char * vstart;
 
@@ -12329,7 +12338,7 @@ process_version_sections (Filedata * filedata)
 		ent.vn_aux     = BYTE_GET (entry->vn_aux);
 		ent.vn_next    = BYTE_GET (entry->vn_next);
 
-		printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
+		printf (_("  %#06zx: Version: %d"), idx, ent.vn_version);
 
 		if (valid_dynamic_name (filedata, ent.vn_file))
 		  printf (_("  File: %s"),
@@ -12360,10 +12369,10 @@ process_version_sections (Filedata * filedata)
 		    aux.vna_next  = BYTE_GET (eaux->vna_next);
 
 		    if (valid_dynamic_name (filedata, aux.vna_name))
-		      printf (_("  %#06lx:   Name: %s"),
+		      printf (_("  %#06zx:   Name: %s"),
 			      isum, get_dynamic_name (filedata, aux.vna_name));
 		    else
-		      printf (_("  %#06lx:   Name index: %lx"),
+		      printf (_("  %#06zx:   Name index: %lx"),
 			      isum, aux.vna_name);
 
 		    printf (_("  Flags: %s  Version: %d\n"),
@@ -12409,15 +12418,15 @@ process_version_sections (Filedata * filedata)
 	case SHT_GNU_versym:
 	  {
 	    Elf_Internal_Shdr * link_section;
-	    size_t total;
+	    uint64_t total;
 	    unsigned int cnt;
 	    unsigned char * edata;
 	    unsigned short * data;
 	    char * strtab;
 	    Elf_Internal_Sym * symbols;
 	    Elf_Internal_Shdr * string_sec;
-	    unsigned long num_syms;
-	    long off;
+	    uint64_t num_syms;
+	    uint64_t off;
 
 	    if (section->sh_link >= filedata->file_header.e_shnum)
 	      break;
@@ -12446,24 +12455,24 @@ process_version_sections (Filedata * filedata)
 	      }
 
 	    if (filedata->is_separate)
-	      printf (ngettext ("\nIn linked file '%s' the version symbols section '%s' contains %lu entry:\n",
-				"\nIn linked file '%s' the version symbols section '%s' contains %lu entries:\n",
+	      printf (ngettext ("\nIn linked file '%s' the version symbols section '%s' contains %" PRIu64 " entry:\n",
+				"\nIn linked file '%s' the version symbols section '%s' contains %" PRIu64 " entries:\n",
 				total),
 		      filedata->file_name,
 		      printable_section_name (filedata, section),
-		      (unsigned long) total);
+		      total);
 	    else
 	      printf (ngettext ("\nVersion symbols section '%s' "
-				"contains %lu entry:\n",
+				"contains %" PRIu64 " entry:\n",
 				"\nVersion symbols section '%s' "
-				"contains %lu entries:\n",
+				"contains %" PRIu64 " entries:\n",
 				total),
 		      printable_section_name (filedata, section),
-		      (unsigned long) total);
+		      total);
 
 	    printf (_(" Addr: 0x%016" PRIx64), section->sh_addr);
-	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
-		    (unsigned long) section->sh_offset, section->sh_link,
+	    printf (_("  Offset: 0x%08" PRIx64 "  Link: %u (%s)\n"),
+		    section->sh_offset, section->sh_link,
 		    printable_section_name (filedata, link_section));
 
 	    off = offset_from_vma (filedata,
@@ -12512,7 +12521,7 @@ process_version_sections (Filedata * filedata)
 
 		      /* If this index value is greater than the size of the symbols
 		         array, break to avoid an out-of-bounds read.  */
-		      if ((unsigned long)(cnt + j) >= num_syms)
+		      if (cnt + j >= num_syms)
 		        {
 		          warn (_("invalid index into symbol array\n"));
 		          break;
@@ -12522,7 +12531,7 @@ process_version_sections (Filedata * filedata)
 		      if (filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
 			{
 			  Elf_Internal_Verneed ivn;
-			  unsigned long offset;
+			  uint64_t offset;
 
 			  offset = offset_from_vma
 			    (filedata,
@@ -12534,7 +12543,7 @@ process_version_sections (Filedata * filedata)
 			      Elf_Internal_Vernaux ivna;
 			      Elf_External_Verneed evn;
 			      Elf_External_Vernaux evna;
-			      unsigned long a_off;
+			      uint64_t a_off;
 
 			      if (get_data (&evn, filedata, offset, sizeof (evn), 1,
 					    _("version need")) == NULL)
@@ -12585,7 +12594,7 @@ process_version_sections (Filedata * filedata)
 			{
 			  Elf_Internal_Verdef ivd;
 			  Elf_External_Verdef evd;
-			  unsigned long offset;
+			  uint64_t offset;
 
 			  offset = offset_from_vma
 			    (filedata,
@@ -13017,18 +13026,18 @@ get_symbol_index_type (Filedata * filedata, unsigned int type)
 }
 
 static const char *
-get_symbol_version_string (Filedata *                   filedata,
-			   bool                         is_dynsym,
-			   const char *                 strtab,
-			   unsigned long int            strtab_size,
-			   unsigned int                 si,
-			   Elf_Internal_Sym *           psym,
-			   enum versioned_symbol_info * sym_info,
-			   unsigned short *             vna_other)
+get_symbol_version_string (Filedata *filedata,
+			   bool is_dynsym,
+			   const char *strtab,
+			   size_t strtab_size,
+			   unsigned int si,
+			   Elf_Internal_Sym *psym,
+			   enum versioned_symbol_info *sym_info,
+			   unsigned short *vna_other)
 {
   unsigned char data[2];
   unsigned short vers_data;
-  unsigned long offset;
+  uint64_t offset;
   unsigned short max_vd_ndx;
 
   if (!is_dynsym
@@ -13067,7 +13076,7 @@ get_symbol_version_string (Filedata *                   filedata,
       Elf_Internal_Verdef ivd;
       Elf_Internal_Verdaux ivda;
       Elf_External_Verdaux evda;
-      unsigned long off;
+      uint64_t off;
 
       off = offset_from_vma (filedata,
 			     filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
@@ -13131,7 +13140,7 @@ get_symbol_version_string (Filedata *                   filedata,
 				sizeof evn);
       do
 	{
-	  unsigned long vna_off;
+	  uint64_t vna_off;
 
 	  if (get_data (&evn, filedata, offset, sizeof (evn), 1,
 			_("version need")) == NULL)
@@ -13213,7 +13222,7 @@ print_dynamic_symbol_size (uint64_t vma, int base)
 }
 
 static void
-print_dynamic_symbol (Filedata *filedata, unsigned long si,
+print_dynamic_symbol (Filedata *filedata, uint64_t si,
 		      Elf_Internal_Sym *symtab,
 		      Elf_Internal_Shdr *section,
 		      char *strtab, size_t strtab_size)
@@ -13225,7 +13234,7 @@ print_dynamic_symbol (Filedata *filedata, unsigned long si,
   const char * sstr;
   Elf_Internal_Sym *psym = symtab + si;
 
-  printf ("%6ld: ", si);
+  printf ("%6" PRId64 ": ", si);
   print_vma (psym->st_value, LONG_HEX);
   putchar (' ');
   print_dynamic_symbol_size (psym->st_size, sym_base);
@@ -13306,7 +13315,7 @@ print_dynamic_symbol (Filedata *filedata, unsigned long si,
       /* Solaris binaries have been found to violate this requirement as
 	 well.  Not sure if this is a bug or an ABI requirement.  */
       && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
-    warn (_("local symbol %lu found at index >= %s's sh_info value of %u\n"),
+    warn (_("local symbol %" PRIu64 " found at index >= %s's sh_info value of %u\n"),
 	  si, printable_section_name (filedata, section), section->sh_info);
 }
 
@@ -13390,9 +13399,9 @@ display_lto_symtab (Filedata *           filedata,
 
   if (section->sh_size > filedata->file_size)
     {
-      error (_("Section %s has an invalid sh_size of 0x%lx\n"),
+      error (_("Section %s has an invalid sh_size of %#" PRIx64 "\n"),
 	     printable_section_name (filedata, section),
-	     (unsigned long) section->sh_size);
+	     section->sh_size);
       return false;
     }
 
@@ -13586,20 +13595,24 @@ process_symbol_table (Filedata * filedata)
       && filedata->dynamic_strings != NULL
       && filedata->dynamic_symbols != NULL)
     {
-      unsigned long si;
+      uint64_t si;
 
       if (filedata->is_separate)
 	{
-	  printf (ngettext ("\nIn linked file '%s' the dynamic symbol table contains %lu entry:\n",
-			    "\nIn linked file '%s' the dynamic symbol table contains %lu entries:\n",
+	  printf (ngettext ("\nIn linked file '%s' the dynamic symbol table"
+			    " contains %" PRIu64 " entry:\n",
+			    "\nIn linked file '%s' the dynamic symbol table"
+			    " contains %" PRIu64 " entries:\n",
 			    filedata->num_dynamic_syms),
 		  filedata->file_name,
 		  filedata->num_dynamic_syms);
 	}
       else
 	{
-	  printf (ngettext ("\nSymbol table for image contains %lu entry:\n",
-			    "\nSymbol table for image contains %lu entries:\n",
+	  printf (ngettext ("\nSymbol table for image contains %" PRIu64
+			    " entry:\n",
+			    "\nSymbol table for image contains %" PRIu64
+			    " entries:\n",
 			    filedata->num_dynamic_syms),
 		  filedata->num_dynamic_syms);
 	}
@@ -13623,9 +13636,9 @@ process_symbol_table (Filedata * filedata)
 	   i++, section++)
 	{
 	  char * strtab = NULL;
-	  unsigned long int strtab_size = 0;
+	  uint64_t strtab_size = 0;
 	  Elf_Internal_Sym * symtab;
-	  unsigned long si, num_syms;
+	  uint64_t si, num_syms;
 
 	  if ((section->sh_type != SHT_SYMTAB
 	       && section->sh_type != SHT_DYNSYM)
@@ -13643,15 +13656,19 @@ process_symbol_table (Filedata * filedata)
 	  num_syms = section->sh_size / section->sh_entsize;
 
 	  if (filedata->is_separate)
-	    printf (ngettext ("\nIn linked file '%s' symbol section '%s' contains %lu entry:\n",
-			      "\nIn linked file '%s' symbol section '%s' contains %lu entries:\n",
+	    printf (ngettext ("\nIn linked file '%s' symbol section '%s'"
+			      " contains %" PRIu64 " entry:\n",
+			      "\nIn linked file '%s' symbol section '%s'"
+			      " contains %" PRIu64 " entries:\n",
 			      num_syms),
 		    filedata->file_name,
 		    printable_section_name (filedata, section),
 		    num_syms);
 	  else
-	    printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
-			      "\nSymbol table '%s' contains %lu entries:\n",
+	    printf (ngettext ("\nSymbol table '%s' contains %" PRIu64
+			      " entry:\n",
+			      "\nSymbol table '%s' contains %" PRIu64
+			      " entries:\n",
 			      num_syms),
 		    printable_section_name (filedata, section),
 		    num_syms);
@@ -13697,24 +13714,23 @@ process_symbol_table (Filedata * filedata)
 
   if (do_histogram && filedata->buckets != NULL)
     {
-      unsigned long * lengths;
-      unsigned long * counts;
-      unsigned long hn;
+      uint64_t *lengths;
+      uint64_t *counts;
+      uint64_t hn;
       uint64_t si;
-      unsigned long maxlength = 0;
-      unsigned long nzero_counts = 0;
-      unsigned long nsyms = 0;
+      uint64_t maxlength = 0;
+      uint64_t nzero_counts = 0;
+      uint64_t nsyms = 0;
       char *visited;
 
       printf (ngettext ("\nHistogram for bucket list length "
-			"(total of %lu bucket):\n",
+			"(total of %" PRIu64 " bucket):\n",
 			"\nHistogram for bucket list length "
-			"(total of %lu buckets):\n",
-			(unsigned long) filedata->nbuckets),
-	      (unsigned long) filedata->nbuckets);
+			"(total of %" PRIu64 " buckets):\n",
+			filedata->nbuckets),
+	      filedata->nbuckets);
 
-      lengths = (unsigned long *) calloc (filedata->nbuckets,
-					  sizeof (*lengths));
+      lengths = calloc (filedata->nbuckets, sizeof (*lengths));
       if (lengths == NULL)
 	{
 	  error (_("Out of memory allocating space for histogram buckets\n"));
@@ -13741,7 +13757,7 @@ process_symbol_table (Filedata * filedata)
 	}
       free (visited);
 
-      counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
+      counts = calloc (maxlength + 1, sizeof (*counts));
       if (counts == NULL)
 	{
 	  free (lengths);
@@ -13754,13 +13770,13 @@ process_symbol_table (Filedata * filedata)
 
       if (filedata->nbuckets > 0)
 	{
-	  unsigned long i;
-	  printf ("      0  %-10lu (%5.1f%%)\n",
+	  uint64_t i;
+	  printf ("      0  %-10" PRIu64 " (%5.1f%%)\n",
 		  counts[0], (counts[0] * 100.0) / filedata->nbuckets);
 	  for (i = 1; i <= maxlength; ++i)
 	    {
 	      nzero_counts += counts[i] * i;
-	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
+	      printf ("%7" PRIu64 "  %-10" PRIu64 " (%5.1f%%)    %5.1f%%\n",
 		      i, counts[i], (counts[i] * 100.0) / filedata->nbuckets,
 		      (nzero_counts * 100.0) / nsyms);
 	    }
@@ -13778,23 +13794,22 @@ process_symbol_table (Filedata * filedata)
 
   if (do_histogram && filedata->gnubuckets != NULL)
     {
-      unsigned long * lengths;
-      unsigned long * counts;
-      unsigned long hn;
-      unsigned long maxlength = 0;
-      unsigned long nzero_counts = 0;
-      unsigned long nsyms = 0;
+      uint64_t *lengths;
+      uint64_t *counts;
+      uint64_t hn;
+      uint64_t maxlength = 0;
+      uint64_t nzero_counts = 0;
+      uint64_t nsyms = 0;
 
       printf (ngettext ("\nHistogram for `%s' bucket list length "
-			"(total of %lu bucket):\n",
+			"(total of %" PRIu64 " bucket):\n",
 			"\nHistogram for `%s' bucket list length "
-			"(total of %lu buckets):\n",
-			(unsigned long) filedata->ngnubuckets),
+			"(total of %" PRIu64 " buckets):\n",
+			filedata->ngnubuckets),
 	      GNU_HASH_SECTION_NAME (filedata),
-	      (unsigned long) filedata->ngnubuckets);
+	      filedata->ngnubuckets);
 
-      lengths = (unsigned long *) calloc (filedata->ngnubuckets,
-					  sizeof (*lengths));
+      lengths = calloc (filedata->ngnubuckets, sizeof (*lengths));
       if (lengths == NULL)
 	{
 	  error (_("Out of memory allocating space for gnu histogram buckets\n"));
@@ -13820,7 +13835,7 @@ process_symbol_table (Filedata * filedata)
 	    nsyms += length;
 	  }
 
-      counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
+      counts = calloc (maxlength + 1, sizeof (*counts));
       if (counts == NULL)
 	{
 	  free (lengths);
@@ -13833,13 +13848,13 @@ process_symbol_table (Filedata * filedata)
 
       if (filedata->ngnubuckets > 0)
 	{
-	  unsigned long j;
-	  printf ("      0  %-10lu (%5.1f%%)\n",
+	  uint64_t j;
+	  printf ("      0  %-10" PRIu64 " (%5.1f%%)\n",
 		  counts[0], (counts[0] * 100.0) / filedata->ngnubuckets);
 	  for (j = 1; j <= maxlength; ++j)
 	    {
 	      nzero_counts += counts[j] * j;
-	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
+	      printf ("%7" PRIu64 "  %-10" PRIu64 " (%5.1f%%)    %5.1f%%\n",
 		      j, counts[j], (counts[j] * 100.0) / filedata->ngnubuckets,
 		      (nzero_counts * 100.0) / nsyms);
 	    }
@@ -13890,17 +13905,17 @@ process_syminfo (Filedata * filedata)
     return false;
 
   if (filedata->is_separate)
-    printf (ngettext ("\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entry:\n",
-		      "\nIn linked file '%s: the dynamic info segment at offset 0x%lx contains %d entries:\n",
+    printf (ngettext ("\nIn linked file '%s: the dynamic info segment at offset %#" PRIx64 " contains %d entry:\n",
+		      "\nIn linked file '%s: the dynamic info segment at offset %#" PRIx64 " contains %d entries:\n",
 		      filedata->dynamic_syminfo_nent),
 	    filedata->file_name,
 	    filedata->dynamic_syminfo_offset,
 	    filedata->dynamic_syminfo_nent);
   else
-    printf (ngettext ("\nDynamic info segment at offset 0x%lx "
-		      "contains %d entry:\n",
-		      "\nDynamic info segment at offset 0x%lx "
-		      "contains %d entries:\n",
+    printf (ngettext ("\nDynamic info segment at offset %#" PRIx64
+		      " contains %d entry:\n",
+		      "\nDynamic info segment at offset %#" PRIx64
+		      " contains %d entries:\n",
 		      filedata->dynamic_syminfo_nent),
 	    filedata->dynamic_syminfo_offset,
 	    filedata->dynamic_syminfo_nent);
@@ -13974,15 +13989,15 @@ process_syminfo (Filedata * filedata)
    discarded.  */
 
 static bool
-target_specific_reloc_handling (Filedata *           filedata,
-				Elf_Internal_Rela *  reloc,
-				unsigned char *      start,
-				unsigned char *      end,
-				Elf_Internal_Sym *   symtab,
-				unsigned long        num_syms)
+target_specific_reloc_handling (Filedata *filedata,
+				Elf_Internal_Rela *reloc,
+				unsigned char *start,
+				unsigned char *end,
+				Elf_Internal_Sym *symtab,
+				uint64_t num_syms)
 {
   unsigned int reloc_type = 0;
-  unsigned long sym_index = 0;
+  uint64_t sym_index = 0;
 
   if (reloc)
     {
@@ -14014,8 +14029,8 @@ target_specific_reloc_handling (Filedata *           filedata,
 	  case 23: /* R_MSP430X_GNU_SUB_ULEB128 */
 	    /* PR 21139.  */
 	    if (sym_index >= num_syms)
-	      error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
-		     sym_index);
+	      error (_("MSP430 SYM_DIFF reloc contains invalid symbol index"
+		       " %" PRIu64 "\n"), sym_index);
 	    else
 	      saved_sym = symtab + sym_index;
 	    return true;
@@ -14061,11 +14076,12 @@ target_specific_reloc_handling (Filedata *           filedata,
 		  }
 
 		if (leb_ret != 0 || reloc_size == 0 || reloc_size > 8)
-		  error (_("MSP430 ULEB128 field at 0x%lx contains invalid "
-			   "ULEB128 value\n"),
-			 (long) reloc->r_offset);
+		  error (_("MSP430 ULEB128 field at %#" PRIx64
+			   " contains invalid ULEB128 value\n"),
+			 reloc->r_offset);
 		else if (sym_index >= num_syms)
-		  error (_("MSP430 reloc contains invalid symbol index %lu\n"),
+		  error (_("MSP430 reloc contains invalid symbol index "
+			   "%" PRIu64 "\n"),
 			 sym_index);
 		else
 		  {
@@ -14076,8 +14092,9 @@ target_specific_reloc_handling (Filedata *           filedata,
 		      byte_put (start + reloc->r_offset, value, reloc_size);
 		    else
 		      /* PR 21137 */
-		      error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
-			     (long) reloc->r_offset);
+		      error (_("MSP430 sym diff reloc contains invalid offset: "
+			       "%#" PRIx64 "\n"),
+			     reloc->r_offset);
 		  }
 
 		saved_sym = NULL;
@@ -14110,7 +14127,8 @@ target_specific_reloc_handling (Filedata *           filedata,
 	    return true;
 	  case 33: /* R_MN10300_SYM_DIFF */
 	    if (sym_index >= num_syms)
-	      error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
+	      error (_("MN10300_SYM_DIFF reloc contains invalid symbol index "
+		       "%" PRIu64 "\n"),
 		     sym_index);
 	    else
 	      saved_sym = symtab + sym_index;
@@ -14124,7 +14142,8 @@ target_specific_reloc_handling (Filedata *           filedata,
 		uint64_t value;
 
 		if (sym_index >= num_syms)
-		  error (_("MN10300 reloc contains invalid symbol index %lu\n"),
+		  error (_("MN10300 reloc contains invalid symbol index "
+			   "%" PRIu64 "\n"),
 			 sym_index);
 		else
 		  {
@@ -14134,8 +14153,9 @@ target_specific_reloc_handling (Filedata *           filedata,
 		    if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
 		      byte_put (start + reloc->r_offset, value, reloc_size);
 		    else
-		      error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
-			     (long) reloc->r_offset);
+		      error (_("MN10300 sym diff reloc contains invalid offset:"
+			       " %#" PRIx64 "\n"),
+			     reloc->r_offset);
 		  }
 
 		saved_sym = NULL;
@@ -14167,8 +14187,8 @@ target_specific_reloc_handling (Filedata *           filedata,
 	  case 0x80: /* R_RL78_SYM.  */
 	    saved_sym1 = saved_sym2;
 	    if (sym_index >= num_syms)
-	      error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
-		     sym_index);
+	      error (_("RL78_SYM reloc contains invalid symbol index "
+		       "%" PRIu64 "\n"), sym_index);
 	    else
 	      {
 		saved_sym2 = symtab[sym_index].st_value;
@@ -14186,8 +14206,9 @@ target_specific_reloc_handling (Filedata *           filedata,
 	    if (IN_RANGE (start, end, start + reloc->r_offset, 4))
 	      byte_put (start + reloc->r_offset, value, 4);
 	    else
-	      error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
-		     (long) reloc->r_offset);
+	      error (_("RL78 sym diff reloc contains invalid offset: "
+		       "%#" PRIx64 "\n"),
+		     reloc->r_offset);
 	    value = 0;
 	    return true;
 
@@ -14195,8 +14216,9 @@ target_specific_reloc_handling (Filedata *           filedata,
 	    if (IN_RANGE (start, end, start + reloc->r_offset, 2))
 	      byte_put (start + reloc->r_offset, value, 2);
 	    else
-	      error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
-		     (long) reloc->r_offset);
+	      error (_("RL78 sym diff reloc contains invalid offset: "
+		       "%#" PRIx64 "\n"),
+		     reloc->r_offset);
 	    value = 0;
 	    return true;
 
@@ -14965,7 +14987,7 @@ apply_relocations (Filedata *filedata,
 		   unsigned char *start,
 		   size_t size,
 		   void **relocs_return,
-		   unsigned long *num_relocs_return)
+		   uint64_t *num_relocs_return)
 {
   Elf_Internal_Shdr * relsec;
   unsigned char * end = start + size;
@@ -14986,12 +15008,12 @@ apply_relocations (Filedata *filedata,
        ++relsec)
     {
       bool is_rela;
-      unsigned long num_relocs;
+      uint64_t num_relocs;
       Elf_Internal_Rela * relocs;
       Elf_Internal_Rela * rp;
       Elf_Internal_Shdr * symsec;
       Elf_Internal_Sym * symtab;
-      unsigned long num_syms;
+      uint64_t num_syms;
       Elf_Internal_Sym * sym;
 
       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
@@ -15035,7 +15057,7 @@ apply_relocations (Filedata *filedata,
 	  bool reloc_inplace = false;
 	  bool reloc_subtract = false;
 	  unsigned char *rloc;
-	  unsigned long sym_index;
+	  uint64_t sym_index;
 
 	  reloc_type = get_reloc_type (filedata, rp->r_info);
 
@@ -15104,16 +15126,18 @@ apply_relocations (Filedata *filedata,
 	  rloc = start + rp->r_offset;
 	  if (!IN_RANGE (start, end, rloc, reloc_size))
 	    {
-	      warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
-		    (unsigned long) rp->r_offset,
+	      warn (_("skipping invalid relocation offset %#" PRIx64
+		      " in section %s\n"),
+		    rp->r_offset,
 		    printable_section_name (filedata, section));
 	      continue;
 	    }
 
-	  sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
+	  sym_index = get_reloc_symindex (rp->r_info);
 	  if (sym_index >= num_syms)
 	    {
-	      warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
+	      warn (_("skipping invalid relocation symbol index %#" PRIx64
+		      " in section %s\n"),
 		    sym_index, printable_section_name (filedata, section));
 	      continue;
 	    }
@@ -15136,10 +15160,10 @@ apply_relocations (Filedata *filedata,
 	      && ELF_ST_TYPE (sym->st_info) != STT_COMMON
 	      && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
 	    {
-	      warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
+	      warn (_("skipping unexpected symbol type %s in section %s relocation %tu\n"),
 		    get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
 		    printable_section_name (filedata, relsec),
-		    (long int)(rp - relocs));
+		    rp - relocs);
 	      continue;
 	    }
 
@@ -15443,7 +15467,7 @@ dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
 	    }
 	  else
 	    {
-	      printf ("  [%6lx]  ", (unsigned long) (data - start));
+	      printf ("  [%6tx]  ", data - start);
 	    }
 
 	  if (maxlen > 0)
@@ -15660,7 +15684,7 @@ dump_section_as_bytes (Elf_Internal_Shdr *section,
 
       lbytes = (bytes > 16 ? 16 : bytes);
 
-      printf ("  0x%8.8lx ", (unsigned long) addr);
+      printf ("  0x%8.8" PRIx64 " ", addr);
 
       for (j = 0; j < 16; j++)
 	{
@@ -16079,7 +16103,7 @@ get_build_id (void * data)
 {
   Filedata * filedata = (Filedata *) data;
   Elf_Internal_Shdr * shdr;
-  unsigned long i;
+  size_t i;
 
   /* Iterate through notes to find note.gnu.build-id.
      FIXME: Only the first note in any note section is examined.  */
@@ -16186,7 +16210,7 @@ malformed note encountered in section %s whilst scanning for build-id note\n"),
           && startswith (inote.namedata, "GNU")
           && inote.type == NT_GNU_BUILD_ID)
         {
-          unsigned long j;
+          size_t j;
           char * build_id;
 
           build_id = malloc (inote.descsz * 2 + 1);
@@ -16517,7 +16541,7 @@ display_tag_value (signed int tag,
 		   unsigned char * p,
 		   const unsigned char * const end)
 {
-  unsigned long val;
+  uint64_t val;
 
   if (tag > 0)
     printf ("  Tag_unknown_%d: ", tag);
@@ -16547,7 +16571,7 @@ display_tag_value (signed int tag,
   else
     {
       READ_ULEB (val, p, end);
-      printf ("%ld (0x%lx)\n", val, val);
+      printf ("%" PRId64 " (0x%" PRIx64 ")\n", val, val);
     }
 
   assert (p <= end);
@@ -17679,7 +17703,7 @@ display_tic6x_attribute (unsigned char * p,
 static void
 display_raw_attribute (unsigned char * p, unsigned char const * const end)
 {
-  unsigned long addr = 0;
+  uint64_t addr = 0;
   size_t bytes = end - p;
 
   assert (end >= p);
@@ -17689,7 +17713,7 @@ display_raw_attribute (unsigned char * p, unsigned char const * const end)
       int k;
       int lbytes = (bytes > 16 ? 16 : bytes);
 
-      printf ("  0x%8.8lx ", addr);
+      printf ("  0x%8.8" PRIx64 " ", addr);
 
       for (j = 0; j < 16; j++)
 	{
@@ -17723,10 +17747,10 @@ display_raw_attribute (unsigned char * p, unsigned char const * const end)
 
 static unsigned char *
 display_msp430_attribute (unsigned char * p,
-			   const unsigned char * const end)
+			  const unsigned char * const end)
 {
-  unsigned int val;
-  unsigned int tag;
+  uint64_t val;
+  uint64_t tag;
 
   READ_ULEB (tag, p, end);
 
@@ -17740,7 +17764,7 @@ display_msp430_attribute (unsigned char * p,
 	case 0: printf (_("None\n")); break;
 	case 1: printf (_("MSP430\n")); break;
 	case 2: printf (_("MSP430X\n")); break;
-	default: printf ("??? (%d)\n", val); break;
+	default: printf ("??? (%" PRId64 ")\n", val); break;
 	}
       break;
 
@@ -17752,7 +17776,7 @@ display_msp430_attribute (unsigned char * p,
 	case 0: printf (_("None\n")); break;
 	case 1: printf (_("Small\n")); break;
 	case 2: printf (_("Large\n")); break;
-	default: printf ("??? (%d)\n", val); break;
+	default: printf ("??? (%" PRId64 ")\n", val); break;
 	}
       break;
 
@@ -17765,12 +17789,12 @@ display_msp430_attribute (unsigned char * p,
 	case 1: printf (_("Small\n")); break;
 	case 2: printf (_("Large\n")); break;
 	case 3: printf (_("Restricted Large\n")); break;
-	default: printf ("??? (%d)\n", val); break;
+	default: printf ("??? (%" PRId64 ")\n", val); break;
 	}
       break;
 
     default:
-      printf (_("  <unknown tag %d>: "), tag);
+      printf (_("  <unknown tag %" PRId64 ">: "), tag);
 
       if (tag & 1)
 	{
@@ -17792,7 +17816,7 @@ display_msp430_attribute (unsigned char * p,
       else
 	{
 	  READ_ULEB (val, p, end);
-	  printf ("%d (0x%x)\n", val, val);
+	  printf ("%" PRId64 " (0x%" PRIx64 ")\n", val, val);
 	}
       break;
    }
@@ -17808,7 +17832,7 @@ display_msp430_gnu_attribute (unsigned char * p,
 {
   if (tag == Tag_GNU_MSP430_Data_Region)
     {
-      unsigned int val;
+      uint64_t val;
 
       printf ("  Tag_GNU_MSP430_Data_Region: ");
       READ_ULEB (val, p, end);
@@ -17822,7 +17846,7 @@ display_msp430_gnu_attribute (unsigned char * p,
 	  printf (_("Lower Region Only\n"));
 	  break;
 	default:
-	  printf ("??? (%u)\n", val);
+	  printf ("??? (%" PRIu64 ")\n", val);
 	}
       return p;
     }
@@ -17850,8 +17874,8 @@ static unsigned char *
 display_riscv_attribute (unsigned char *p,
 			 const unsigned char * const end)
 {
-  unsigned int val;
-  unsigned int tag;
+  uint64_t val;
+  uint64_t tag;
   struct riscv_attr_tag_t *attr = NULL;
   unsigned i;
 
@@ -17878,7 +17902,7 @@ display_riscv_attribute (unsigned char *p,
     case Tag_RISCV_priv_spec_minor:
     case Tag_RISCV_priv_spec_revision:
       READ_ULEB (val, p, end);
-      printf (_("%u\n"), val);
+      printf ("%" PRIu64 "\n", val);
       break;
     case Tag_RISCV_unaligned_access:
       READ_ULEB (val, p, end);
@@ -17894,7 +17918,7 @@ display_riscv_attribute (unsigned char *p,
       break;
     case Tag_RISCV_stack_align:
       READ_ULEB (val, p, end);
-      printf (_("%u-bytes\n"), val);
+      printf (_("%" PRIu64 "-bytes\n"), val);
       break;
     case Tag_RISCV_arch:
       p = display_tag_value (-1, p, end);
@@ -17910,8 +17934,8 @@ static unsigned char *
 display_csky_attribute (unsigned char * p,
 			const unsigned char * const end)
 {
-  unsigned int tag;
-  unsigned int val;
+  uint64_t tag;
+  uint64_t val;
   READ_ULEB (tag, p, end);
 
   if (tag >= Tag_CSKY_MAX)
@@ -17947,7 +17971,7 @@ display_csky_attribute (unsigned char * p,
     case Tag_CSKY_VDSP_VERSION:
       printf ("  Tag_CSKY_VDSP_VERSION:\t");
       READ_ULEB (val, p, end);
-      printf ("VDSP Version %d\n", val);
+      printf ("VDSP Version %" PRId64 "\n", val);
       break;
 
     case Tag_CSKY_FPU_VERSION:
@@ -18640,10 +18664,10 @@ process_mips_specific (Filedata * filedata)
 					      _("liblist section data"));
       if (elib)
 	{
-	  printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
-			    "\nSection '.liblist' contains %lu entries:\n",
-			    (unsigned long) liblistno),
-		  (unsigned long) liblistno);
+	  printf (ngettext ("\nSection '.liblist' contains %zu entry:\n",
+			    "\nSection '.liblist' contains %zu entries:\n",
+			    liblistno),
+		  liblistno);
 	  fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
 		 stdout);
 
@@ -18666,7 +18690,7 @@ process_mips_specific (Filedata * filedata)
 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
 
-	      printf ("%3lu: ", (unsigned long) cnt);
+	      printf ("%3zu: ", cnt);
 	      if (valid_dynamic_name (filedata, liblist.l_name))
 		print_symbol (20, get_dynamic_name (filedata, liblist.l_name));
 	      else
@@ -18978,8 +19002,8 @@ process_mips_specific (Filedata * filedata)
 	 if we are sure that the cmalloc will fail.  */
       if (conflictsno > filedata->file_size / sizeof (* iconf))
 	{
-	  error (_("Overlarge number of conflicts detected: %lx\n"),
-		 (long) conflictsno);
+	  error (_("Overlarge number of conflicts detected: %zx\n"),
+		 conflictsno);
 	  return false;
 	}
 
@@ -19027,15 +19051,15 @@ process_mips_specific (Filedata * filedata)
 	  free (econf64);
 	}
 
-      printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
-			"\nSection '.conflict' contains %lu entries:\n",
-			(unsigned long) conflictsno),
-	      (unsigned long) conflictsno);
+      printf (ngettext ("\nSection '.conflict' contains %zu entry:\n",
+			"\nSection '.conflict' contains %zu entries:\n",
+			conflictsno),
+	      conflictsno);
       puts (_("  Num:    Index       Value  Name"));
 
       for (cnt = 0; cnt < conflictsno; ++cnt)
 	{
-	  printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
+	  printf ("%5zu: %8lu  ", cnt, iconf[cnt]);
 
 	  if (iconf[cnt] >= filedata->num_dynamic_syms)
 	    printf (_("<corrupt symbol index>"));
@@ -19072,8 +19096,9 @@ process_mips_specific (Filedata * filedata)
       /* PR binutils/17533 file: 012-111227-0.004  */
       if (symtabno < gotsym)
 	{
-	  error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
-		 (unsigned long) gotsym, (unsigned long) symtabno);
+	  error (_("The GOT symbol offset (%" PRIu64
+		   ") is greater than the symbol table size (%" PRIu64 ")\n"),
+		 gotsym, symtabno);
 	  return false;
 	}
 
@@ -19081,7 +19106,7 @@ process_mips_specific (Filedata * filedata)
       /* PR 17531: file: 54c91a34.  */
       if (global_end < local_end)
 	{
-	  error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
+	  error (_("Too many GOT symbols: %" PRIu64 "\n"), symtabno);
 	  return false;
 	}
 
@@ -19178,8 +19203,8 @@ process_mips_specific (Filedata * filedata)
 		    printf (_("<corrupt: %14ld>"), psym->st_name);
 		}
 	      else
-		printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
-			(unsigned long) i);
+		printf (_("<symbol index %zu exceeds number of dynamic symbols>"),
+			i);
 
 	      printf ("\n");
 	      if (ent == (uint64_t) -1)
@@ -19195,8 +19220,8 @@ process_mips_specific (Filedata * filedata)
   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
     {
       uint64_t ent, end;
-      size_t offset, rel_offset;
-      unsigned long count, i;
+      uint64_t offset, rel_offset;
+      uint64_t count, i;
       unsigned char * data;
       int addr_size, sym_width;
       Elf_Internal_Rela * rels;
@@ -19244,13 +19269,13 @@ process_mips_specific (Filedata * filedata)
       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
       for (i = 0; i < count; i++)
 	{
-	  unsigned long idx = get_reloc_symindex (rels[i].r_info);
+	  uint64_t idx = get_reloc_symindex (rels[i].r_info);
 
 	  ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
 	  printf (" ");
 
 	  if (idx >= filedata->num_dynamic_syms)
-	    printf (_("<corrupt symbol index: %lu>"), idx);
+	    printf (_("<corrupt symbol index: %" PRIu64 ">"), idx);
 	  else
 	    {
 	      Elf_Internal_Sym * psym = filedata->dynamic_symbols + idx;
@@ -19325,7 +19350,7 @@ process_gnu_liblist (Filedata * filedata)
   char * strtab;
   size_t strtab_size;
   size_t cnt;
-  unsigned long num_liblist;
+  uint64_t num_liblist;
   unsigned i;
   bool res = true;
 
@@ -19367,8 +19392,10 @@ process_gnu_liblist (Filedata * filedata)
 	  strtab_size = string_sec->sh_size;
 
 	  num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
-	  printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
-			    "\nLibrary list section '%s' contains %lu entries:\n",
+	  printf (ngettext ("\nLibrary list section '%s' contains %" PRIu64
+			    " entries:\n",
+			    "\nLibrary list section '%s' contains %" PRIu64
+			    " entries:\n",
 			    num_liblist),
 		  printable_section_name (filedata, section),
 		  num_liblist);
@@ -19395,7 +19422,7 @@ process_gnu_liblist (Filedata * filedata)
 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
 
-	      printf ("%3lu: ", (unsigned long) cnt);
+	      printf ("%3zu: ", cnt);
 	      if (do_wide)
 		printf ("%-20s", liblist.l_name < strtab_size
 			? strtab + liblist.l_name : _("<corrupt>"));
@@ -20232,7 +20259,7 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
 	      if (datasz != size)
 		printf (_("<corrupt length: %#x> "), datasz);
 	      else
-		printf ("%#lx", (unsigned long) byte_get (ptr, size));
+		printf ("%#" PRIx64, byte_get (ptr, size));
 	      goto next;
 
 	    case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
@@ -20310,7 +20337,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
     {
     case NT_GNU_BUILD_ID:
       {
-	unsigned long i;
+	size_t i;
 
 	printf (_("    Build ID: "));
 	for (i = 0; i < pnote->descsz; ++i)
@@ -20321,7 +20348,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
 
     case NT_GNU_ABI_TAG:
       {
-	unsigned long os, major, minor, subminor;
+	unsigned int os, major, minor, subminor;
 	const char *osname;
 
 	/* PR 17531: file: 030-599401-0.004.  */
@@ -20364,14 +20391,14 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
 	    break;
 	  }
 
-	printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
+	printf (_("    OS: %s, ABI: %d.%d.%d\n"), osname,
 		major, minor, subminor);
       }
       break;
 
     case NT_GNU_GOLD_VERSION:
       {
-	unsigned long i;
+	size_t i;
 
 	printf (_("    Version: "));
 	for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
@@ -20382,7 +20409,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
 
     case NT_GNU_HWCAP:
       {
-	unsigned long num_entries, mask;
+	unsigned int num_entries, mask;
 
 	/* Hardware capabilities information.  Word 0 is the number of entries.
 	   Word 1 is a bitmask of enabled entries.  The rest of the descriptor
@@ -20397,7 +20424,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
 	  }
 	num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
 	mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
-	printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
+	printf (_("num entries: %d, enabled mask: %x\n"), num_entries, mask);
 	/* FIXME: Add code to display the entries... */
       }
       break;
@@ -20411,7 +20438,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
 	 created by get_gnu_elf_note_type(), so all that we need to do is to
 	 display the data.  */
       {
-	unsigned long i;
+	size_t i;
 
 	printf (_("    Description data: "));
 	for (i = 0; i < pnote->descsz; ++i)
@@ -20713,7 +20740,7 @@ static bool
 print_stapsdt_note (Elf_Internal_Note *pnote)
 {
   size_t len, maxlen;
-  unsigned long addr_size = is_32bit_elf ? 4 : 8;
+  size_t addr_size = is_32bit_elf ? 4 : 8;
   char *data = pnote->descdata;
   char *data_end = pnote->descdata + pnote->descsz;
   uint64_t pc, base_addr, semaphore;
@@ -20841,9 +20868,9 @@ get_ia64_vms_note_type (unsigned e_type)
 static bool
 print_ia64_vms_note (Elf_Internal_Note * pnote)
 {
-  int maxlen = pnote->descsz;
+  unsigned int maxlen = pnote->descsz;
 
-  if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
+  if (maxlen < 2 || maxlen != pnote->descsz)
     goto desc_size_fail;
 
   switch (pnote->type)
@@ -20852,7 +20879,7 @@ print_ia64_vms_note (Elf_Internal_Note * pnote)
       if (maxlen <= 36)
 	goto desc_size_fail;
 
-      int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
+      size_t l = strnlen (pnote->descdata + 34, maxlen - 34);
 
       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
@@ -20953,9 +20980,9 @@ print_ia64_vms_note (Elf_Internal_Note * pnote)
 struct build_attr_cache {
   Filedata *filedata;
   char *strtab;
-  unsigned long strtablen;
+  uint64_t strtablen;
   Elf_Internal_Sym *symtab;
-  unsigned long nsyms;
+  uint64_t nsyms;
 } ba_cache;
 
 /* Find the symbol associated with a build attribute that is attached
@@ -20965,7 +20992,7 @@ struct build_attr_cache {
 
 static Elf_Internal_Sym *
 get_symbol_for_build_attribute (Filedata *filedata,
-				unsigned long offset,
+				uint64_t offset,
 				bool is_open_attr,
 				const char **pname)
 {
@@ -21079,7 +21106,7 @@ get_symbol_for_build_attribute (Filedata *filedata,
 /* Returns true iff addr1 and addr2 are in the same section.  */
 
 static bool
-same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
+same_section (Filedata * filedata, uint64_t addr1, uint64_t addr2)
 {
   Elf_Internal_Shdr * a1;
   Elf_Internal_Shdr * a2;
@@ -21094,15 +21121,15 @@ static bool
 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
 				       Filedata *           filedata)
 {
-  static unsigned long global_offset = 0;
-  static unsigned long global_end = 0;
-  static unsigned long func_offset = 0;
-  static unsigned long func_end = 0;
+  static uint64_t global_offset = 0;
+  static uint64_t global_end = 0;
+  static uint64_t func_offset = 0;
+  static uint64_t func_end = 0;
 
   Elf_Internal_Sym *sym;
   const char *name;
-  unsigned long start;
-  unsigned long end;
+  uint64_t start;
+  uint64_t end;
   bool is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
 
   switch (pnote->descsz)
@@ -21113,17 +21140,20 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
       if (is_open_attr)
 	{
 	  if (global_end > global_offset)
-	    printf (_("    Applies to region from %#lx to %#lx\n"),
-		    global_offset, global_end);
+	    printf (_("    Applies to region from %#" PRIx64
+		      " to %#" PRIx64 "\n"), global_offset, global_end);
 	  else
-	    printf (_("    Applies to region from %#lx\n"), global_offset);
+	    printf (_("    Applies to region from %#" PRIx64
+		      "\n"), global_offset);
 	}
       else
 	{
 	  if (func_end > func_offset)
-	    printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
+	    printf (_("    Applies to region from %#" PRIx64
+		      " to %#" PRIx64 "\n"), func_offset, func_end);
 	  else
-	    printf (_("    Applies to region from %#lx\n"), func_offset);
+	    printf (_("    Applies to region from %#" PRIx64
+		      "\n"), func_offset);
 	}
       return true;
 
@@ -21170,26 +21200,27 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
 	     increasing address, but we should find the all of the notes
 	     for one section in the same place.  */
 	  && same_section (filedata, start, global_end))
-	warn (_("Gap in build notes detected from %#lx to %#lx\n"),
+	warn (_("Gap in build notes detected from %#" PRIx64
+		" to %#" PRIx64 "\n"),
 	      global_end + 1, start - 1);
 
-      printf (_("    Applies to region from %#lx"), start);
+      printf (_("    Applies to region from %#" PRIx64), start);
       global_offset = start;
 
       if (end)
 	{
-	  printf (_(" to %#lx"), end);
+	  printf (_(" to %#" PRIx64), end);
 	  global_end = end;
 	}
     }
   else
     {
-      printf (_("    Applies to region from %#lx"), start);
+      printf (_("    Applies to region from %#" PRIx64), start);
       func_offset = start;
 
       if (end)
 	{
-	  printf (_(" to %#lx"), end);
+	  printf (_(" to %#" PRIx64), end);
 	  func_end = end;
 	}
     }
@@ -21331,11 +21362,11 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
   if (strchr (expected_types, name_type) == NULL)
     warn (_("attribute does not have an expected type (%c)\n"), name_type);
 
-  if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
+  if ((size_t) (name - pnote->namedata) > pnote->namesz)
     {
-      error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
-	     (unsigned long) pnote->namesz,
-	     (long) (name - pnote->namedata));
+      error (_("corrupt name field: namesz: %lu but parsing gets to %td\n"),
+	     pnote->namesz,
+	     name - pnote->namedata);
       return false;
     }
 
@@ -21346,10 +21377,10 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
     {
     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
       {
-	unsigned int        bytes;
-	unsigned long long  val = 0;
-	unsigned int        shift = 0;
-	char *              decoded = NULL;
+	unsigned int bytes;
+	uint64_t val = 0;
+	unsigned int shift = 0;
+	char *decoded = NULL;
 
 	bytes = pnote->namesz - (name - pnote->namedata);
 	if (bytes > 0)
@@ -21369,7 +21400,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
 
 	while (bytes --)
 	  {
-	    unsigned long long byte = *name++ & 0xff;
+	    uint64_t byte = *name++ & 0xff;
 
 	    val |= byte << shift;
 	    shift += 8;
@@ -21417,9 +21448,9 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
 	else
 	  {
 	    if (do_wide)
-	      left -= printf ("0x%llx", val);
+	      left -= printf ("0x%" PRIx64, val);
 	    else
-	      left -= printf ("0x%-.*llx", left, val);
+	      left -= printf ("0x%-.*" PRIx64, left, val);
 	  }
       }
       break;
@@ -21447,7 +21478,7 @@ print_note_contents_hex (Elf_Internal_Note *pnote)
 {
   if (pnote->descsz)
     {
-      unsigned long i;
+      size_t i;
 
       printf (_("   description data: "));
       for (i = 0; i < pnote->descsz; i++)
@@ -21759,8 +21790,9 @@ process_notes_at (Filedata *           filedata,
   if (section)
     printf (_("Displaying notes found in: %s\n"), printable_section_name (filedata, section));
   else
-    printf (_("Displaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
-	    (unsigned long) offset, (unsigned long) length);
+    printf (_("Displaying notes found at file offset 0x%08" PRIx64
+	      " with length 0x%08" PRIx64 ":\n"),
+	    offset, length);
 
   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
      specifies that notes should be aligned to 4 bytes in 32-bit
@@ -21771,8 +21803,8 @@ process_notes_at (Filedata *           filedata,
     align = 4;
   else if (align != 4 && align != 8)
     {
-      warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
-	    (long) align);
+      warn (_("Corrupt note: alignment %" PRId64 ", expecting 4 or 8\n"),
+	    align);
       free (pnotes);
       return false;
     }
@@ -21795,12 +21827,12 @@ process_notes_at (Filedata *           filedata,
 	  min_notesz = offsetof (Elf_External_Note, name);
 	  if (data_remaining < min_notesz)
 	    {
-	      warn (ngettext ("Corrupt note: only %ld byte remains, "
+	      warn (ngettext ("Corrupt note: only %zd byte remains, "
 			      "not enough for a full note\n",
-			      "Corrupt note: only %ld bytes remain, "
+			      "Corrupt note: only %zd bytes remain, "
 			      "not enough for a full note\n",
 			      data_remaining),
-		    (long) data_remaining);
+		    data_remaining);
 	      break;
 	    }
 	  data_remaining -= min_notesz;
@@ -21824,12 +21856,12 @@ process_notes_at (Filedata *           filedata,
 	  min_notesz = offsetof (Elf64_External_VMS_Note, name);
 	  if (data_remaining < min_notesz)
 	    {
-	      warn (ngettext ("Corrupt note: only %ld byte remains, "
+	      warn (ngettext ("Corrupt note: only %zd byte remains, "
 			      "not enough for a full note\n",
-			      "Corrupt note: only %ld bytes remain, "
+			      "Corrupt note: only %zd bytes remain, "
 			      "not enough for a full note\n",
 			      data_remaining),
-		    (long) data_remaining);
+		    data_remaining);
 	      break;
 	    }
 	  data_remaining -= min_notesz;
@@ -21852,9 +21884,9 @@ process_notes_at (Filedata *           filedata,
 	  || ((size_t) (next - inote.descdata)
 	      > data_remaining - (size_t) (inote.descdata - inote.namedata)))
 	{
-	  warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
-		(unsigned long) ((char *) external - (char *) pnotes));
-	  warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
+	  warn (_("note with invalid namesz and/or descsz found at offset %#tx\n"),
+		(char *) external - (char *) pnotes);
+	  warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx, alignment: %u\n"),
 		inote.type, inote.namesz, inote.descsz, (int) align);
 	  break;
 	}
@@ -21937,8 +21969,9 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length)
   external = pnotes;
   end = (char*) pnotes + length;
 
-  printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
-	  (unsigned long) offset, (unsigned long) length);
+  printf (_("\nDisplaying contents of Renesas V850 notes section at offset"
+	    " %#" PRIx64 " with length %#" PRIx64 ":\n"),
+	  offset, length);
 
   while ((char *) external + sizeof (Elf_External_Note) < end)
     {
@@ -21964,9 +21997,9 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length)
       if (   ((char *) next > end)
 	  || ((char *) next <  (char *) pnotes))
 	{
-	  warn (_("corrupt descsz found in note at offset 0x%lx\n"),
-		(unsigned long) ((char *) external - (char *) pnotes));
-	  warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
+	  warn (_("corrupt descsz found in note at offset %#tx\n"),
+		(char *) external - (char *) pnotes);
+	  warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx\n"),
 		inote.type, inote.namesz, inote.descsz);
 	  break;
 	}
@@ -21977,9 +22010,9 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length)
       if (   inote.namedata + inote.namesz > end
 	  || inote.namedata + inote.namesz < inote.namedata)
         {
-          warn (_("corrupt namesz found in note at offset 0x%lx\n"),
-                (unsigned long) ((char *) external - (char *) pnotes));
-          warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
+          warn (_("corrupt namesz found in note at offset %#zx\n"),
+                (char *) external - (char *) pnotes);
+          warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx\n"),
                 inote.type, inote.namesz, inote.descsz);
           break;
         }
@@ -21989,7 +22022,7 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length)
       if (! print_v850_note (& inote))
 	{
 	  res = false;
-	  printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
+	  printf ("<corrupt sizes: namesz: %#lx, descsz: %#lx>\n",
 		  inote.namesz, inote.descsz);
 	}
     }
@@ -22003,7 +22036,7 @@ static bool
 process_note_sections (Filedata * filedata)
 {
   Elf_Internal_Shdr *section;
-  unsigned long i;
+  size_t i;
   unsigned int n = 0;
   bool res = true;
 
@@ -22572,12 +22605,12 @@ process_archive (Filedata * filedata, bool is_thin_archive)
 	       filedata->file_name);
       else
 	{
-	  unsigned long i, l;
-	  unsigned long current_pos;
+	  uint64_t i, l;
+	  uint64_t current_pos;
 
-	  printf (_("Index of archive %s: (%lu entries, 0x%lx bytes "
-		    "in the symbol table)\n"),
-		  filedata->file_name, (unsigned long) arch.index_num,
+	  printf (_("Index of archive %s: (%" PRIu64 " entries,"
+		    " %#" PRIx64 " bytes in the symbol table)\n"),
+		  filedata->file_name, arch.index_num,
 		  arch.sym_size);
 
 	  current_pos = ftell (filedata->handle);
@@ -22630,10 +22663,10 @@ process_archive (Filedata * filedata, bool is_thin_archive)
 
 	  if (l < arch.sym_size)
 	    {
-	      error (ngettext ("%s: %ld byte remains in the symbol table, "
+	      error (ngettext ("%s: %" PRId64 " byte remains in the symbol table, "
 			       "but without corresponding entries in "
 			       "the index table\n",
-			       "%s: %ld bytes remain in the symbol table, "
+			       "%s: %" PRId64 " bytes remain in the symbol table, "
 			       "but without corresponding entries in "
 			       "the index table\n",
 			       arch.sym_size - l),
