From 314782e874c70fd10257629e48b2d1582e660227 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 19 Dec 2018 12:39:08 -0600 Subject: [PATCH] backtrace.c: Fix casting pointer to/from integral type. The backtrace library bfd.h include file does not get the sizes of pointers and ints right on some platforms. On my old test box the size of bfd_vma is 8 while the size of a pointer is 4. gcc on the box complains of the integer casting to/from pointers size mismatch. * uintptr_t to the rescue by doing an appropriate two stage cast. Change-Id: Icb2621583f50c8728de08a3c824d95fe53cc45d0 --- main/backtrace.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main/backtrace.c b/main/backtrace.c index 16f5a562d3..2623d7ff87 100644 --- a/main/backtrace.c +++ b/main/backtrace.c @@ -122,7 +122,7 @@ static void process_section(bfd *bfdobj, asection *section, void *obj) char *fn; int inlined = 0; - offset = data->pc - (data->dynamic ? (bfd_vma) data->dli.dli_fbase : 0); + offset = data->pc - (data->dynamic ? (bfd_vma)(uintptr_t) data->dli.dli_fbase : 0); if (!(bfd_get_section_flags(bfdobj, section) & SEC_ALLOC)) { return; @@ -151,11 +151,11 @@ static void process_section(bfd *bfdobj, asection *section, void *obj) /* file can possibly be null even with a success result from bfd_find_nearest_line */ file = file ? file : ""; fn = strrchr(file, '/'); -#define FMT_INLINED "[%s] %s %s:%u %s()" +#define FMT_INLINED "[%s] %s %s:%u %s()" #define FMT_NOT_INLINED "[%p] %s %s:%u %s()" snprintf(data->msg, MSG_BUFF_LEN, inlined ? FMT_INLINED : FMT_NOT_INLINED, - inlined ? "inlined" : (char *)data->pc, + inlined ? "inlined" : (char *)(uintptr_t) data->pc, data->libname, fn ? fn + 1 : file, line, S_OR(func, "???")); @@ -192,14 +192,14 @@ struct ast_vector_string *__ast_bt_get_symbols(void **addresses, size_t num_fram struct bfd_data data = { .return_strings = return_strings, .msg = msg, - .pc = (bfd_vma)addresses[stackfr], + .pc = (bfd_vma)(uintptr_t) addresses[stackfr], .found = 0, .dynamic = 0, }; msg[0] = '\0'; - if (!dladdr((void *)data.pc, &data.dli)) { + if (!dladdr((void *)(uintptr_t) data.pc, &data.dli)) { continue; } data.libname = strrchr(data.dli.dli_fname, '/');