* hppa-tdep.c (skip_trampoline_code): Handle shared library import
authorJeff Law <law@redhat.com>
Wed, 16 Nov 1994 07:21:06 +0000 (07:21 +0000)
committerJeff Law <law@redhat.com>
Wed, 16 Nov 1994 07:21:06 +0000 (07:21 +0000)
trampolines.

gdb/ChangeLog
gdb/hppa-tdep.c

index b4ba7c73d7a199029549b9aa4ddc7d9f21949f55..e9e7f1fe50e5e4dc91aa6b74f8b26858ade79a36 100644 (file)
@@ -1,3 +1,8 @@
+Wed Nov 16 00:12:21 1994  Jeff Law  (law@snake.cs.utah.edu)
+
+       * hppa-tdep.c (skip_trampoline_code): Handle shared library import
+       trampolines.
+
 Tue Nov 15 16:18:52 1994  Kung Hsu  (kung@mexican.cygnus.com)
 
        * c-exp.y (yylex): Fix a bug in template scanning.
index b503ed2793b03f3ebc1bc21d73f31565f621f88f..b372ff2a19084473ca286bdf834783d636e0874d 100644 (file)
@@ -1684,6 +1684,45 @@ skip_trampoline_code (pc, name)
            }
        }
 
+      /* Does it look like a be 0(sr0,%r21)?  That's the branch from an
+        import stub to an export stub.
+
+        It is impossible to determine the target of the branch via
+        simple examination of instructions and/or data (consider
+        that the address in the plabel may be the address of the
+        bind-on-reference routine in the dynamic loader).
+
+        So we have try an alternative approach.
+
+        Get the name of the symbol at our current location; it should
+        be a stub symbol with the same name as the symbol in the
+        shared library.
+
+        Then lookup a minimal symbol with the same name; we should
+        get the minimal symbol for the target routine in the shared
+        library as those take precedence of import/export stubs.  */
+      if (curr_inst == 0xe2a00000)
+       {
+         struct minimal_symbol *stubsym, *libsym;
+
+         stubsym = lookup_minimal_symbol_by_pc (loc);
+         if (stubsym == NULL)
+           {
+             warning ("Unable to find symbol for 0x%x", loc);
+             return orig_pc == pc ? 0 : pc & ~0x3;
+           }
+
+         libsym = lookup_minimal_symbol (SYMBOL_NAME (stubsym), NULL);
+         if (libsym == NULL)
+           {
+             warning ("Unable to find library symbol for %s\n",
+                      SYMBOL_NAME (stubsym));
+             return orig_pc == pc ? 0 : pc & ~0x3;
+           }
+
+         return SYMBOL_VALUE (libsym);
+       }
+
       /* Does it look like bl X,%rp or bl X,%r0?  Another way to do a
         branch from the stub to the actual function.  */
       else if ((curr_inst & 0xffe0e000) == 0xe8400000