From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29733 invoked by alias); 3 Feb 2002 01:29:59 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29690 invoked from network); 3 Feb 2002 01:29:58 -0000 Received: from unknown (HELO zwingli.cygnus.com) (208.245.165.35) by sources.redhat.com with SMTP; 3 Feb 2002 01:29:58 -0000 Received: by zwingli.cygnus.com (Postfix, from userid 442) id C26295E9DE; Sat, 2 Feb 2002 20:31:31 -0500 (EST) From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: RFA: Do solib address arithmetic with appropriate truncation Message-Id: <20020203013131.C26295E9DE@zwingli.cygnus.com> Date: Sat, 02 Feb 2002 17:29:00 -0000 X-SW-Source: 2002-02/txt/msg00030.txt.bz2 Sat Feb 2 17:03:26 2002 Jim Blandy * solib-svr4.c (svr4_truncate_ptr): New function. (svr4_relocate_section_addresses): Do the address arithmetic with the appropriate truncation for target addresses, even when CORE_ADDR is larger than a target address. Index: gdb/solib-svr4.c =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/solib-svr4.c,v retrieving revision 1.20 diff -c -r1.20 solib-svr4.c *** gdb/solib-svr4.c 2001/11/01 21:05:46 1.20 --- gdb/solib-svr4.c 2002/02/03 01:03:04 *************** *** 1228,1240 **** xfree (so->lm_info); } static void svr4_relocate_section_addresses (struct so_list *so, struct section_table *sec) { ! sec->addr += LM_ADDR (so); ! sec->endaddr += LM_ADDR (so); } /* Fetch a link_map_offsets structure for native targets using struct definitions from link.h. See solib-legacy.c for the function --- 1228,1259 ---- xfree (so->lm_info); } + + /* Clear any bits of ADDR that wouldn't fit in a target-format + data pointer. "Data pointer" here refers to whatever sort of + address the dynamic linker uses to manage its sections. At the + moment, we don't support shared libraries on any processors where + code and data pointers are different sizes. */ + static CORE_ADDR + svr4_truncate_ptr (CORE_ADDR addr) + { + if (TARGET_PTR_BIT == sizeof (CORE_ADDR) * 8) + /* We don't need to truncate anything, and the bit twiddling below + will fail due to overflow problems. */ + return addr; + else + return addr & (((CORE_ADDR) 1 << TARGET_PTR_BIT) - 1); + } + + static void svr4_relocate_section_addresses (struct so_list *so, struct section_table *sec) { ! sec->addr = svr4_truncate_ptr (sec->addr + LM_ADDR (so)); ! sec->endaddr = svr4_truncate_ptr (sec->endaddr + LM_ADDR (so)); } + /* Fetch a link_map_offsets structure for native targets using struct definitions from link.h. See solib-legacy.c for the function