From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18371 invoked by alias); 11 May 2012 19:30:05 -0000 Received: (qmail 18351 invoked by uid 22791); 11 May 2012 19:30:04 -0000 X-SWARE-Spam-Status: No, hits=-4.8 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,NO_DNS_FOR_FROM,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,TW_AV,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 May 2012 19:29:50 +0000 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 11 May 2012 12:29:49 -0700 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.135]) by fmsmga002.fm.intel.com with ESMTP; 11 May 2012 12:29:49 -0700 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id B5BA5C18B6; Fri, 11 May 2012 12:29:49 -0700 (PDT) Date: Fri, 11 May 2012 19:30:00 -0000 From: "H.J. Lu" To: GDB Subject: PATCH: Check bfd_mach_x64_32 to set tdesc for x32 binary Message-ID: <20120511192949.GA5070@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) 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: 2012-05/txt/msg00437.txt.bz2 Hi, This patch checks bfd_mach_x64_32 to set tdesc for x32 binary. Tested on Linux/x86-64. OK to install? Thanks. H.J. --- * amd64-linux-tdep.c: Include features/i386/x32-linux.c and features/i386/x32-avx-linux.c. (amd64_linux_init_abi): Check bfd_mach_x64_32 for x32 process. (_initialize_amd64_linux_tdep): Register bfd_mach_x64_32. Call initialize_tdesc_x32_linux and initialize_tdesc_x32_avx_linux. * amd64-linux-tdep.h (tdesc_x32_linux): New. (tdesc_x32_avx_linux): Likewise. diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index acc7303..601ce20 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -42,6 +42,8 @@ #include "features/i386/amd64-linux.c" #include "features/i386/amd64-avx-linux.c" +#include "features/i386/x32-linux.c" +#include "features/i386/x32-avx-linux.c" /* The syscall's XML filename for i386. */ #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml" @@ -1273,9 +1290,15 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch, switch ((xcr0 & I386_XSTATE_AVX_MASK)) { case I386_XSTATE_AVX_MASK: - return tdesc_amd64_avx_linux; + if (gdbarch_ptr_bit (gdbarch) == 32) + return tdesc_x32_avx_linux; + else + return tdesc_amd64_avx_linux; default: - return tdesc_amd64_linux; + if (gdbarch_ptr_bit (gdbarch) == 32) + return tdesc_x32_linux; + else + return tdesc_amd64_linux; } } @@ -1302,7 +1325,13 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS); if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_amd64_linux; + { + if (info.abfd != NULL + && (info.bfd_arch_info->mach & bfd_mach_x64_32)) + tdesc = tdesc_x32_linux; + else + tdesc = tdesc_amd64_linux; + } tdep->tdesc = tdesc; feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux"); @@ -1323,8 +1352,12 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET; /* GNU/Linux uses SVR4-style shared libraries. */ - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_lp64_fetch_link_map_offsets); + if (tdesc_architecture (tdesc)->mach & bfd_mach_x64_32) + set_solib_svr4_fetch_link_map_offsets + (gdbarch, svr4_ilp32_fetch_link_map_offsets); + else + set_solib_svr4_fetch_link_map_offsets + (gdbarch, svr4_lp64_fetch_link_map_offsets); /* Add the %orig_rax register used for syscall restarting. */ set_gdbarch_write_pc (gdbarch, amd64_linux_write_pc); @@ -1545,8 +1578,12 @@ _initialize_amd64_linux_tdep (void) { gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_LINUX, amd64_linux_init_abi); + gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32, + GDB_OSABI_LINUX, amd64_linux_init_abi); /* Initialize the Linux target description. */ initialize_tdesc_amd64_linux (); initialize_tdesc_amd64_avx_linux (); + initialize_tdesc_x32_linux (); + initialize_tdesc_x32_avx_linux (); } diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h index 0338b6e..49bb95e 100644 --- a/gdb/amd64-linux-tdep.h +++ b/gdb/amd64-linux-tdep.h @@ -34,6 +34,8 @@ /* Linux target description. */ extern struct target_desc *tdesc_amd64_linux; extern struct target_desc *tdesc_amd64_avx_linux; +extern struct target_desc *tdesc_x32_linux; +extern struct target_desc *tdesc_x32_avx_linux; /* Enum that defines the syscall identifiers for amd64 linux. Used for process record/replay, these will be translated into