From ed4e1efc810e1223549301022f539f869a66cf87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vivek=20Das=C2=A0Mohapatra?= <vivek@collabora.co.uk>
Date: Wed, 24 May 2017 00:33:18 +0100
Subject: [PATCH] Can't use the same printf format specs on 32 and 64 bit
 models

Define and use some per-word-size printf format macros so our
debug functions can be -Wall -Werror clean on both models.
---
 capsule/capsule-dlmopen.c  |  2 +-
 utils/dump.c               | 29 +++++++++++++++--------------
 utils/elf-dump.c           | 25 +++++++++++++------------
 utils/process-pt-dynamic.c |  4 ++--
 utils/utils.h              | 18 ++++++++++++++++++
 5 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/capsule/capsule-dlmopen.c b/capsule/capsule-dlmopen.c
index ae0678dea..f9a3c0138 100644
--- a/capsule/capsule-dlmopen.c
+++ b/capsule/capsule-dlmopen.c
@@ -1279,7 +1279,7 @@ dump_ld_entry (ldlibs_t *ldlibs,
              osv & 0xff,
              osv );
 
-    fprintf( stderr, "  hwcaps: %0lx\n", hwcap );
+    fprintf( stderr, "  hwcaps: %0"FMT_XU64"\n", hwcap );
     return 0;
 }
 
diff --git a/utils/dump.c b/utils/dump.c
index 37bbbba0c..f5a24be79 100644
--- a/utils/dump.c
+++ b/utils/dump.c
@@ -28,6 +28,7 @@
 #include <limits.h>
 
 #include <link.h>
+#include "utils.h"
 
 // this file is a home for the various ways of parsing the ELF layout
 // of a program or library from within the executable itself, ie
@@ -489,7 +490,7 @@ dump_symtab (const char *indent,
         symbol_version( entry, x, strtab, versym, verdef, verdefnum,
                         &defversym, &version, &vs );
 
-        fprintf(stderr, "%s    // %02d [%-8s %-8s] size:%lu %s%s%s%s %04x %p\n",
+        fprintf(stderr, "%s    // %02d [%-8s %-8s] size:%"FMT_SWORD" %s%s%s%s %04x %p\n",
                 indent,
                 x,
                 st_type( ELFW_ST_TYPE(entry->st_info) ),
@@ -514,7 +515,7 @@ dump_interp (const char *indent, void *start, size_t size, ElfW(Addr) base)
 
     strncpy( &interpreter[0], start + base, PATH_MAX );
 
-    fprintf( stderr, "%s// %p %lu %p %s", indent, start, size, (void *)base,
+    fprintf( stderr, "%s// %p %"FMT_SIZE" %p %s", indent, start, size, (void *)base,
              &interpreter[0] );
     return;
 }
@@ -723,14 +724,14 @@ dump_rel (const char *indent,
 
         symbol = find_symbol( sym, symtab, strtab, &name );
         if( symbol )
-            fprintf( stderr, "%s    // [%03d] %16s off: %lx; %s;\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %"FMT_XADDR"; %s;\n",
                      indent,
                      x++,
                      reloc_type(chr),
                      entry->r_offset,
                      name );
         else
-            fprintf( stderr, "%s    // [%03d] %16s off: %lx; sym[%d];\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %"FMT_XADDR"; sym[%d];\n",
                      indent,
                      x++,
                      reloc_type(chr),
@@ -775,7 +776,7 @@ dump_rela (const char *indent,
 
         symbol = find_symbol( sym, symtab, strtab, &name );
         if( symbol )
-            fprintf( stderr, "%s    // [%03d] %16s off: %lx; %s; add: 0x%ld\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %"FMT_XADDR"; %s; add: 0x%"FMT_XADDR"\n",
                      indent,
                      x++,
                      reloc_type(chr),
@@ -783,7 +784,7 @@ dump_rela (const char *indent,
                      name,
                      entry->r_addend );
         else
-            fprintf( stderr, "%s    // [%03d] %16s off: %lx; sym: %d; add: %ld\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %"FMT_XADDR"; sym: %d; add: %"FMT_XADDR"\n",
                      indent,
                      x++,
                      reloc_type(chr),
@@ -910,7 +911,7 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
         switch( tag_type )
         {
           case TTYPE_VAL:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = val:%ld }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = val:%"FMT_WORD" }\n",
                      indent,
                      x++,
                      tag,
@@ -918,14 +919,14 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
                      entry->d_un.d_val );
             break;
           case TTYPE_PTR:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = ptr:%p }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = ptr:%p }\n",
                      indent, x++,
                      tag,
                      entry->d_tag,
                      (void *)addr( base, entry->d_un.d_ptr ) );
             break;
           case TTYPE_STR:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = str:%s }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = str:%s }\n",
                      indent,
                      x++,
                      tag,
@@ -933,7 +934,7 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
                      strtab + entry->d_un.d_ptr );
             break;
           default:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = ???:%p }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = ???:%p }\n",
                      indent,
                      x++,
                      tag,
@@ -1059,13 +1060,13 @@ struct dl_phdr_info                  \n\
     {
         fprintf(stderr, "    { // #%03d @ ( %p + %p ) %p\n\
         ElfW(Word)  p_type;    %d %s   \n\
-        ElfW(Off)   p_offset;  %ld     \n\
+        ElfW(Off)   p_offset;  %"FMT_OFF"\n\
         ElfW(Addr)  p_vaddr;   %p      \n\
         ElfW(Addr)  p_paddr;   %p      \n\
-        ElfW(Word)  p_filesz;  0x%lx    \n\
-        ElfW(Word)  p_memsz;   0x%lx    \n\
+        ElfW(Word)  p_filesz;  0x%"FMT_XADDR" \n\
+        ElfW(Word)  p_memsz;   0x%"FMT_XADDR" \n\
         ElfW(Word)  p_flags;   0x%x %s \n\
-        ElfW(Word)  p_align;   %lu \n",
+        ElfW(Word)  p_align;   %"FMT_WORD" \n",
                 j,
                 (void *)info->dlpi_addr             ,
                 (void *)info->dlpi_phdr[j].p_vaddr  ,
diff --git a/utils/elf-dump.c b/utils/elf-dump.c
index 4295640ae..6a1a1e025 100644
--- a/utils/elf-dump.c
+++ b/utils/elf-dump.c
@@ -28,6 +28,7 @@
 #include <limits.h>
 
 #include <link.h>
+#include "utils.h"
 
 // this file is a home for the various ways of parsing the ELF layout
 // of a program or library from within the executable itself, ie
@@ -489,7 +490,7 @@ dump_symtab (const char *indent,
         symbol_version( entry, x, strtab, versym, verdef, verdefnum,
                         &defversym, &version, &vs );
 
-        fprintf(stderr, "%s    // %02d [%-8s %-8s] size:%ld %s%s%s%s %04x %p\n",
+        fprintf(stderr, "%s    // %02d [%-8s %-8s] size:%"FMT_WORD" %s%s%s%s %04x %p\n",
                 indent,
                 x,
                 st_type( ELFW_ST_TYPE(entry->st_info) ),
@@ -513,7 +514,7 @@ void dump_interp (const char *indent, void *start, size_t size, ElfW(Addr) base)
 
     strncpy( &interpreter[0], start + base, PATH_MAX );
 
-    fprintf( stderr, "%s// %p %lu %p %s", indent, start, size, (void *)base,
+    fprintf( stderr, "%s// %p %"FMT_SIZE" %p %s", indent, start, size, (void *)base,
              interpreter );
     return;
 }
@@ -774,7 +775,7 @@ dump_rela (const char *indent,
 
         symbol = find_symbol( sym, symtab, strtab, &name );
         if( symbol )
-            fprintf( stderr, "%s    // [%03d] %16s off: %p; %s; add: %ld\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %p; %s; add: %"FMT_SWORD"\n",
                      indent,
                      x++,
                      reloc_type(chr),
@@ -782,7 +783,7 @@ dump_rela (const char *indent,
                      name,
                      entry->r_addend );
         else
-            fprintf( stderr, "%s    // [%03d] %16s off: %p; sym: %d; add: %ld\n",
+            fprintf( stderr, "%s    // [%03d] %16s off: %p; sym: %d; add: %"FMT_SWORD"\n",
                      indent,
                      x++,
                      reloc_type(chr),
@@ -909,7 +910,7 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
         switch( tag_type )
         {
           case TTYPE_VAL:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = val:%ld }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = val:%"FMT_WORD" }\n",
                      indent,
                      x++,
                      tag,
@@ -917,14 +918,14 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
                      entry->d_un.d_val );
             break;
           case TTYPE_PTR:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = ptr:%p }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_SWORD") = ptr:%p }\n",
                      indent, x++,
                      tag,
                      entry->d_tag,
                      addr( base, entry->d_un.d_ptr ) );
             break;
           case TTYPE_STR:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = str:%s }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_WORD") = str:%s }\n",
                      indent,
                      x++,
                      tag,
@@ -932,7 +933,7 @@ dump_dynamic (const char *indent, void *start, size_t size, ElfW(Addr) base)
                      strtab + entry->d_un.d_ptr );
             break;
           default:
-            fprintf( stderr, "%s    { #%03d %20s(%ld) = ???:%p }\n",
+            fprintf( stderr, "%s    { #%03d %20s(%"FMT_WORD") = ???:%p }\n",
                      indent,
                      x++,
                      tag,
@@ -1061,13 +1062,13 @@ struct dl_phdr_info                  \n\
     {
         fprintf(stderr, "    { // #%03d @ ( %p + %p ) %p\n\
         ElfW(Word)  p_type;    %d %s   \n\
-        ElfW(Off)   p_offset;  %ld     \n\
+        ElfW(Off)   p_offset;  %"FMT_OFF" \n\
         ElfW(Addr)  p_vaddr;   %p      \n\
         ElfW(Addr)  p_paddr;   %p      \n\
-        ElfW(Word)  p_filesz;  %lu    \n\
-        ElfW(Word)  p_memsz;   %lu    \n\
+        ElfW(Word)  p_filesz;  %"FMT_WORD" \n\
+        ElfW(Word)  p_memsz;   %"FMT_WORD" \n\
         ElfW(Word)  p_flags;   0x%x %s \n\
-        ElfW(Word)  p_align;   %ld \n",
+        ElfW(Word)  p_align;   %"FMT_WORD" \n",
                 j,
                 (void *)info->dlpi_addr             ,
                 (void *)info->dlpi_phdr[j].p_vaddr  ,
diff --git a/utils/process-pt-dynamic.c b/utils/process-pt-dynamic.c
index 7511a0d1e..0e0d31334 100644
--- a/utils/process-pt-dynamic.c
+++ b/utils/process-pt-dynamic.c
@@ -269,7 +269,7 @@ process_dt_rela (const void *start,
           case R_X86_64_JUMP_SLOT:
             slot = addr( base, entry->r_offset, entry->r_addend );
             DEBUG( DEBUG_ELF,
-                   "R_X86_64_JUMP_SLOT: %p ← { offset: %lu; addend: %ld }",
+                   "R_X86_64_JUMP_SLOT: %p ← { offset: %"FMT_ADDR"; addend: %"FMT_SIZE" }",
                    slot, entry->r_offset, entry->r_addend );
             try_relocation( slot, name, data );
             break;
@@ -466,7 +466,7 @@ process_pt_dynamic (void *start,
     const char *strtab = find_strtab( base, start, size, &strsiz );
 
     DEBUG( DEBUG_ELF,
-           "start: %p; size: %lu; base: %p; handlers: %p %p; …",
+           "start: %p; size: %"FMT_SIZE"; base: %p; handlers: %p %p; …",
            start, size, (void *)base, process_rela, process_rel );
     DEBUG( DEBUG_ELF, "dyn entry: %p", start + base );
 
diff --git a/utils/utils.h b/utils/utils.h
index 068e8dd4a..e2fc79d41 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -19,5 +19,23 @@
 
 #include "debug.h"
 
+#if __ELF_NATIVE_CLASS == 64
+#define FMT_OFF   "lu"
+#define FMT_SWORD "lu"
+#define FMT_WORD  "ld"
+#define FMT_SIZE  "lu"
+#define FMT_ADDR  "ld"
+#define FMT_XADDR "lx"
+#define FMT_XU64  "lx"
+#else
+#define FMT_OFF   "u"
+#define FMT_SWORD "u"
+#define FMT_WORD  "d"
+#define FMT_SIZE  "u"
+#define FMT_ADDR  "d"
+#define FMT_XADDR "x"
+#define FMT_XU64  "llx"
+#endif
+
 char *safe_strncpy (char *dest, const char *src, size_t n);
 int   resolve_link (const char *prefix, char *path, char *dir);
-- 
GitLab