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