Tracing ELF shared libs with GDB (Linux)
Andre Oliveira da Costa
costa@tecgraf.puc-rio.br
Mon Nov 9 15:48:00 GMT 1998
Hi there,
sorry for bringing this subject "back to life" (I found some references
to it in the May-1998 archives), but I'm having some problems I couldn't
solve with the instructions found in those messages.
My Linux configuration is:
kernel: 2.0.34
GCC: 2.7.2.2
GDB: 4.17
ld: 2.8.1
ldconfig: 1.9.5
What happens here is: I am unable to set a breakpoint at a function
which is in a dynamic lib, although gdb "thinks" it is actually doing it
right. I will put below a session grab, just to (hopefully) make things
easier to understand:
------------------------------------------------------
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb) info shared
No shared libraries loaded at this time.
(gdb) dir ~/prj/iup/motif
Source directories searched: /home/j/costa/prj/iup/motif:$cdir:$cwd
(gdb) b main
Breakpoint 1 at 0x804efe6: file text.c, line 16.
(gdb) r
Starting program:
/tmp_mnt/marc/home/j/costa/prj/iup/motif/test/bin/Linux/text
Breakpoint 1, main () at text.c:16
16 IupOpen();
(gdb) info shared
>From To Syms Read Shared Object Library
0x4000a000 0x400325cc Yes
/home/j/costa/prj/iup/lib/Linux/libiupmot.so
0x40033000 0x4004fd44 Yes
/home/j/costa/prj/iup/lib/Linux/libiup.so
0x40050000 0x40061914 Yes /usr/X11R6/lib/libXmu.so.6
0x40062000 0x400a416c Yes /usr/X11R6/lib/libXt.so.6
0x400a5000 0x40141fd8 Yes /usr/X11R6/lib/libX11.so.6
0x40142000 0x4014c1a0 Yes /usr/X11R6/lib/libXext.so.6
0x4014d000 0x4020e9b8 Yes /lib/libc.so.5
0x4020f000 0x40217220 Yes /usr/X11R6/lib/libSM.so.6
0x40218000 0x4022c9b4 Yes /usr/X11R6/lib/libICE.so.6
0x40000000 0x40006324 Yes /lib/ld-linux.so.1
(gdb) b drvcb_text
Breakpoint 2 at 0x40025653: file motproc.c, line 441.
(gdb) l motproc.c:441
436 {
437 fill[0] = 0;
438 info->status = 2;
439 }
440 }
441 }
442
443
444 void drvcb_button (Widget w, XtPointer client_data, XtPointer
call_data)
445 {
------------------------------------------------------
That's the problem: GDB put the breakpoint at a completely different
line of the source code (in this particular case, at the end of a
function!), therefore making it impossible to trace into this lib. What
is really annoying is that things go out just fine under IRIX 5.3 (GDB
v4.17, gcc v2.8.1):
------------------------------------------------------
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "mips-sgi-irix5.3"...
(gdb) info shared
No shared libraries loaded at this time.
(gdb) dir ~/prj/iup/motif
Source directories searched: /home/j/costa/prj/iup/motif:$cdir:$cwd
(gdb) b main
Breakpoint 1 at 0x400dbc: file text.c, line 16.
(gdb) r
Starting program:
/tmp_mnt/nethome/j/costa/prj/iup/motif/test/bin/IRIX/text
Breakpoint 1, main () at text.c:16
16 IupOpen();
(gdb) info shared
>From To Syms Read Shared Object Library
0x5ffa0000 0x5fff2dd0 Yes
/home/j/costa/prj/iup/lib/IRIX/libiupmot.so
0x00440000 0x0046a1d0 Yes
/home/j/costa/prj/iup/lib/IRIX/libiup.so
0x0e220000 0x0e3fb3e0 Yes /usr/lib/libXm.so.1
0x0f620000 0x0f640b90 Yes /usr/lib/libXmu.so
0x0f650000 0x0f6d5a40 Yes /usr/lib/libXt.so
0x0f710000 0x0f7f7440 Yes /usr/lib/libX11.so.1
0x0fa90000 0x0fb566d0 Yes /usr/lib/libc.so.1
0x0f6e0000 0x0f700550 Yes /usr/lib/libXext.so
(gdb) b drvcb_text
Breakpoint 2 at 0x5ffc43ac: file motproc.c, line 286.
(gdb) l motproc.c:286
281 }
282
283 void drvcb_text (Widget w, XtPointer client_data, XtPointer
call_data)
284 {
285 Itextcb cb;
286 WidgetData *d = NULL;
287 Ihandle *n;
288 XmTextVerifyPtr text = (XmTextVerifyPtr)call_data;
289 char *tmpStr, *oldText = NULL, *newText = NULL;
290
------------------------------------------------------
However, the scenario is slightly different: the application is compiled
with gcc, but the libs are compiled with the native compiler cc. The
dynamic linker/loader are the ones supplied with IRIX 5.3.
Who is the one to blame here? The dynamic linker/loader? The compiler?
Me?!? =) Anyone else has this problem?
TIA for any help, and sorry for the long post.
--
Andre Oliveira da Costa
(costa@tecgraf.puc-rio.br)
More information about the Gdb
mailing list