From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12869 invoked by alias); 14 Sep 2008 21:27:48 -0000 Received: (qmail 12859 invoked by uid 22791); 14 Sep 2008 21:27:48 -0000 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 14 Sep 2008 21:27:13 +0000 Received: from brahms.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by brahms.sibelius.xs4all.nl (8.14.3/8.14.3) with ESMTP id m8ELR9vu023744 for ; Sun, 14 Sep 2008 23:27:09 +0200 (CEST) Received: (from kettenis@localhost) by brahms.sibelius.xs4all.nl (8.14.3/8.14.3/Submit) id m8ELR9eX025288; Sun, 14 Sep 2008 23:27:09 +0200 (CEST) Date: Sun, 14 Sep 2008 21:27:00 -0000 Message-Id: <200809142127.m8ELR9eX025288@brahms.sibelius.xs4all.nl> From: Mark Kettenis To: gdb-patches@sourceware.org Subject: [PATCH/RFC] auxv entries Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-09/txt/msg00321.txt.bz2 Many, if not all, processor-specific ELF ABI documents have the following definition of auxv entries: typedef struct { int a_type; union { long a_val; void *a_ptr; void (*a_fcn)(); } a_un; } auxv_t; This is not the layout that default_auxv_parse() uses though, which is wrong for big-endian 64-bit systems. The attached diff fixes this, making the assumption that a_val is "naturally" aligned. I have some slight worries though about how this ever worked on big-endian 64-bit Linux systems, hence the RFC. Index: ChangeLog from Mark Kettenis * auxv.c (default_auxv_parse): Change code to reflect standard auxv_t layout. Index: auxv.c =================================================================== RCS file: /cvs/src/src/gdb/auxv.c,v retrieving revision 1.14 diff -u -p -r1.14 auxv.c --- auxv.c 11 Sep 2008 14:29:21 -0000 1.14 +++ auxv.c 14 Sep 2008 21:20:03 -0000 @@ -82,20 +82,22 @@ int default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { - const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch) - / TARGET_CHAR_BIT; + struct type *builtin_int = builtin_type (target_gdbarch)->builtin_int; + struct type *builtin_long = builtin_type (target_gdbarch)->builtin_long; + const int sizeof_auxv_type = TYPE_LENGTH(builtin_int); + const int sizeof_auxv_val = TYPE_LENGTH(builtin_long); gdb_byte *ptr = *readptr; if (endptr == ptr) return 0; - if (endptr - ptr < sizeof_auxv_field * 2) + if (endptr - ptr < sizeof_auxv_val * 2) return -1; - *typep = extract_unsigned_integer (ptr, sizeof_auxv_field); - ptr += sizeof_auxv_field; - *valp = extract_unsigned_integer (ptr, sizeof_auxv_field); - ptr += sizeof_auxv_field; + *typep = extract_unsigned_integer (ptr, sizeof_auxv_type); + ptr += sizeof_auxv_val; /* Alignment. */ + *valp = extract_unsigned_integer (ptr, sizeof_auxv_val); + ptr += sizeof_auxv_val; *readptr = ptr; return 1;