Skip to content
Snippets Groups Projects
Commit 59717b5e authored by Richard Mudgett's avatar Richard Mudgett
Browse files

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
parent 08e6cb64
No related branches found
No related tags found
No related merge requests found
...@@ -122,7 +122,7 @@ static void process_section(bfd *bfdobj, asection *section, void *obj) ...@@ -122,7 +122,7 @@ static void process_section(bfd *bfdobj, asection *section, void *obj)
char *fn; char *fn;
int inlined = 0; 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)) { if (!(bfd_get_section_flags(bfdobj, section) & SEC_ALLOC)) {
return; return;
...@@ -151,11 +151,11 @@ static void process_section(bfd *bfdobj, asection *section, void *obj) ...@@ -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 can possibly be null even with a success result from bfd_find_nearest_line */
file = file ? file : ""; file = file ? file : "";
fn = strrchr(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()" #define FMT_NOT_INLINED "[%p] %s %s:%u %s()"
snprintf(data->msg, MSG_BUFF_LEN, inlined ? FMT_INLINED : FMT_NOT_INLINED, 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, data->libname,
fn ? fn + 1 : file, fn ? fn + 1 : file,
line, S_OR(func, "???")); line, S_OR(func, "???"));
...@@ -192,14 +192,14 @@ struct ast_vector_string *__ast_bt_get_symbols(void **addresses, size_t num_fram ...@@ -192,14 +192,14 @@ struct ast_vector_string *__ast_bt_get_symbols(void **addresses, size_t num_fram
struct bfd_data data = { struct bfd_data data = {
.return_strings = return_strings, .return_strings = return_strings,
.msg = msg, .msg = msg,
.pc = (bfd_vma)addresses[stackfr], .pc = (bfd_vma)(uintptr_t) addresses[stackfr],
.found = 0, .found = 0,
.dynamic = 0, .dynamic = 0,
}; };
msg[0] = '\0'; msg[0] = '\0';
if (!dladdr((void *)data.pc, &data.dli)) { if (!dladdr((void *)(uintptr_t) data.pc, &data.dli)) {
continue; continue;
} }
data.libname = strrchr(data.dli.dli_fname, '/'); data.libname = strrchr(data.dli.dli_fname, '/');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment