ping On 10/08/2015 04:59 PM, Vicente Olivert Riera wrote: > /* Verify that we can safely cast arch_addr_t* to unw_word_t*. */ > (void)sizeof(char[1 - 2*(sizeof(unw_word_t) != sizeof(arch_addr_t))]); > > This check will always fail for MIPS 32-bit architectures (the only ones > supported by ltrace) because unw_word_t is 64-bit sized (it's actually a > uint64_t) and arch_add_t (which is void*) is 32-bit sized: > > output.c:784:3: error: size of unnamed array is negative > > So do the check in a different way that works for all architectures. > > Signed-off-by: Vicente Olivert Riera <[email protected]> > --- > output.c | 24 +++++++++++++++--------- > 1 files changed, 15 insertions(+), 9 deletions(-) > > diff --git a/output.c b/output.c > index b63befe..e166554 100644 > --- a/output.c > +++ b/output.c > @@ -773,27 +773,28 @@ output_right(enum tof type, struct process *proc, > struct library_symbol *libsym, > && proc->unwind_as != NULL) { > unw_cursor_t cursor; > arch_addr_t ip, function_offset; > + unw_word_t uw_ip, uw_function_offset; > struct library *lib = NULL; > int unwind_depth = options.bt_depth; > char fn_name[100]; > const char *lib_name; > size_t distance; > > - /* Verify that we can safely cast arch_addr_t* to > - * unw_word_t*. */ > - (void)sizeof(char[1 - 2*(sizeof(unw_word_t) > - != sizeof(arch_addr_t))]); > unw_init_remote(&cursor, proc->unwind_as, proc->unwind_priv); > while (unwind_depth) { > > - int rc = unw_get_reg(&cursor, UNW_REG_IP, > - (unw_word_t *) &ip); > + int rc = unw_get_reg(&cursor, UNW_REG_IP, &uw_ip); > + > if (rc < 0) { > fprintf(options.output, " > Error: %s\n", > unw_strerror(rc)); > goto cont; > } > > + // Verify that we can safely cast arch_addr_t* to > unw_word_t*. > + ip = (arch_addr_t) uw_ip; > + assert(uw_ip == (unw_word_t) ip); > + > /* We are looking for the library with the base address > * closest to the current ip. */ > lib_name = "unmapped_area"; > @@ -814,13 +815,18 @@ output_right(enum tof type, struct process *proc, > struct library_symbol *libsym, > > rc = unw_get_proc_name(&cursor, fn_name, > sizeof(fn_name), > - (unw_word_t *) &function_offset); > - if (rc == 0 || rc == -UNW_ENOMEM) > + &uw_function_offset); > + if (rc == 0 || rc == -UNW_ENOMEM) { > + // Verify that we can safely cast arch_addr_t* > to unw_word_t*. > + function_offset = (arch_addr_t) > uw_function_offset; > + assert(uw_function_offset == (unw_word_t) > function_offset); > + > fprintf(options.output, " > %s(%s+%p) [%p]\n", > lib_name, fn_name, function_offset, ip); > - else > + } else { > fprintf(options.output, " > %s(??\?) [%p]\n", > lib_name, ip); > + } > > cont: > if (unw_step(&cursor) <= 0) >
_______________________________________________ Ltrace-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/ltrace-devel
