diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 26c343291a3f9bcda8a60b9d26f502877b0ced7e..f7f7cb0bda563d4d1a052024536978831be62e0a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2004-02-21 Mark Kettenis <kettenis@gnu.org> + + * solib-svr4.h: Update copyright year. + (svr4_ilp32_fetch_link_map_offsets) + (svr4_lp64_fetch_link_map_offsets): New prototype. + * solib-svr4.c: Update copyright year. + (svr4_ilp32_fetch_link_map_offsets) + (svr4_lp64_fetch_link_map_offsets): New function. + 2004-02-20 Daniel Jacobowitz <drow@mvista.com> * dwarf2read.c (add_partial_symbol): Fix typo in adding enumerators diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 48fb6cb94f12d297233ebdc1028f4da4dd7db102..4f4664cc017ba0398431c03f90f2b3fe619a19e4 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1,7 +1,8 @@ /* Handle SVR4 shared libraries for GDB, the GNU Debugger. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2003 Free Software Foundation, Inc. + 2000, 2001, 2003, 2004 + Free Software Foundation, Inc. This file is part of GDB. @@ -1508,6 +1509,77 @@ init_fetch_link_map_offsets (struct gdbarch *gdbarch) return legacy_fetch_link_map_offsets; } +/* Most OS'es that have SVR4-style ELF dynamic libraries define a + `struct r_debug' and a `struct link_map' that are binary compatible + with the origional SVR4 implementation. */ + +/* Fetch (and possibly build) an appropriate `struct link_map_offsets' + for an ILP32 SVR4 system. */ + +struct link_map_offsets * +svr4_ilp32_fetch_link_map_offsets (void) +{ + static struct link_map_offsets lmo; + static struct link_map_offsets *lmp = NULL; + + if (lmp == NULL) + { + lmp = &lmo; + + /* Everything we need is in the first 8 bytes. */ + lmo.r_debug_size = 8; + lmo.r_map_offset = 4; + lmo.r_map_size = 4; + + /* Everything we need is in the first 20 bytes. */ + lmo.link_map_size = 20; + lmo.l_addr_offset = 0; + lmo.l_addr_size = 4; + lmo.l_name_offset = 4; + lmo.l_name_size = 4; + lmo.l_next_offset = 12; + lmo.l_next_size = 4; + lmo.l_prev_offset = 16; + lmo.l_prev_size = 4; + } + + return lmp; +} + +/* Fetch (and possibly build) an appropriate `struct link_map_offsets' + for an LP64 SVR4 system. */ + +struct link_map_offsets * +svr4_lp64_fetch_link_map_offsets (void) +{ + static struct link_map_offsets lmo; + static struct link_map_offsets *lmp = NULL; + + if (lmp == NULL) + { + lmp = &lmo; + + /* Everything we need is in the first 16 bytes. */ + lmo.r_debug_size = 16; + lmo.r_map_offset = 8; + lmo.r_map_size = 8; + + /* Everything we need is in the first 40 bytes. */ + lmo.link_map_size = 40; + lmo.l_addr_offset = 0; + lmo.l_addr_size = 8; + lmo.l_name_offset = 8; + lmo.l_name_size = 8; + lmo.l_next_offset = 24; + lmo.l_next_size = 8; + lmo.l_prev_offset = 32; + lmo.l_prev_size = 8; + } + + return lmp; +} + + static struct target_so_ops svr4_so_ops; extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */ diff --git a/gdb/solib-svr4.h b/gdb/solib-svr4.h index d9d321771a3ffd0ada1339ef2f5edb187bd16b26..d76c7f51459ca0078eadcdfcc00f93d989dcea6e 100644 --- a/gdb/solib-svr4.h +++ b/gdb/solib-svr4.h @@ -1,5 +1,6 @@ /* Handle shared libraries for GDB, the GNU Debugger. - Copyright 2000 + + Copyright 2000, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -82,3 +83,8 @@ extern CORE_ADDR svr4_fetch_objfile_link_map (struct objfile *objfile); which is used to fetch link map offsets. It will only be set by solib-legacy.c, if at all. */ extern struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook)(void); + +/* Fetch (and possibly build) an appropriate `struct link_map_offsets' + for ILP32 and LP64 SVR4 systems. */ +extern struct link_map_offsets *svr4_ilp32_fetch_link_map_offsets (void); +extern struct link_map_offsets *svr4_lp64_fetch_link_map_offsets (void);