diff options
author | Jeff Law <law@redhat.com> | 1994-11-16 07:21:06 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1994-11-16 07:21:06 +0000 |
commit | f32fc5f9790cdab127622f3a3f3bdc2474fe9da5 (patch) | |
tree | 42c08399ff878d2d8a4fcf80e5b646c254dfa6a2 /gdb/hppa-tdep.c | |
parent | 2df1ea3d5b0d4f7cb0f0e2ffc035bcd68ea9b6b8 (diff) | |
download | gdb-f32fc5f9790cdab127622f3a3f3bdc2474fe9da5.zip gdb-f32fc5f9790cdab127622f3a3f3bdc2474fe9da5.tar.gz gdb-f32fc5f9790cdab127622f3a3f3bdc2474fe9da5.tar.bz2 |
* hppa-tdep.c (skip_trampoline_code): Handle shared library import
trampolines.
Diffstat (limited to 'gdb/hppa-tdep.c')
-rw-r--r-- | gdb/hppa-tdep.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index b503ed2..b372ff2 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -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 |