From e4bbbda840451028a06dd72904663e5f9a6ad3f2 Mon Sep 17 00:00:00 2001
From: Mark Kettenis <kettenis@gnu.org>
Date: Sat, 21 Feb 2004 18:34:45 +0000
Subject: [PATCH] * 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.

---
 gdb/ChangeLog    |  9 ++++++
 gdb/solib-svr4.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-
 gdb/solib-svr4.h |  8 +++++-
 3 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 26c343291a3..f7f7cb0bda5 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 48fb6cb94f1..4f4664cc017 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 d9d321771a3..d76c7f51459 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);
-- 
GitLab