[Ltrace-devel] [PATCH] Fix libunwind support for MIPS

Vicente Olivert Riera Vincent.Riera at imgtec.com
Thu Oct 22 09:43:29 UTC 2015


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 <Vincent.Riera at imgtec.com>
> ---
>  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)
> 



More information about the Ltrace-devel mailing list