This is the mail archive of the gdb-patches@sourceware.org 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]

[ia64] [patch] Support recent libunwind-ia64.so.8 (1.0.1+)


Hi,

libunwind.so - GDB used it before, I have changed it in 2007 to .so.7 as .so
               is only link-time name while .so.7 is its runtime DT_SONAME.
libunwind.so.7 - it was always available but it no longer is since 2011-09.
libunwind.so.8 - it is a new major version since libunwind-1.0.1:
                 http://lists.nongnu.org/archive/html/libunwind-devel/2011-09/msg00031.html
                 libunwind.so.7 is no longer distributed.

I have asked about reverting back to libunwind.so.7 bit it was declined:
	http://lists.nongnu.org/archive/html/libunwind-devel/2012-02/msg00017.html

As there are already both libunwind.so.8 and libunwind.so.7 stable builds out
there proposing the patch below.


Thanks,
Jan


gdb/
2012-03-03  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* libunwind-frame.c (LIBUNWIND_SO): Change .7 to .8.
	[!LIBUNWIND_SO] (LIBUNWIND_SO_7): New #define.
	(libunwind_load): New variable so_error, use it for dlerror.  Try to
	load also LIBUNWIND_SO_7.

--- a/gdb/libunwind-frame.c
+++ b/gdb/libunwind-frame.c
@@ -95,7 +95,11 @@ struct libunwind_frame_cache
 #ifndef LIBUNWIND_SO
 /* Use the stable ABI major version number.  `libunwind-ia64.so' is a link time
    only library, not a runtime one.  */
-#define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
+#define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so.8"
+
+/* Provide also compatibility with older .so.  The two APIs are compatible, .8
+   is only extended a bit, GDB does not use the extended API at all.  */
+#define LIBUNWIND_SO_7 "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
 #endif
 
 static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
@@ -513,14 +517,28 @@ static int
 libunwind_load (void)
 {
   void *handle;
+  char *so_error = NULL;
 
   handle = dlopen (LIBUNWIND_SO, RTLD_NOW);
   if (handle == NULL)
     {
+      so_error = xstrdup (dlerror ());
+#ifdef LIBUNWIND_SO_7
+      handle = dlopen (LIBUNWIND_SO_7, RTLD_NOW);
+#endif /* LIBUNWIND_SO_7 */
+    }
+  if (handle == NULL)
+    {
       fprintf_unfiltered (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
-                          LIBUNWIND_SO, dlerror ());
-      return 0;
+			  LIBUNWIND_SO, so_error);
+#ifdef LIBUNWIND_SO_7
+      fprintf_unfiltered (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
+			  LIBUNWIND_SO_7, dlerror ());
+#endif /* LIBUNWIND_SO_7 */
     }
+  xfree (so_error);
+  if (handle == NULL)
+    return 0;
 
   /* Initialize pointers to the dynamic library functions we will use.  */
 


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