This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: Do solib address arithmetic with appropriate truncation



Sat Feb  2 17:03:26 2002  Jim Blandy  <jimb@seadog.cygnus.com>

	* 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]