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);