This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Fixes problem setting breakpoint in dynamic loader
- From: PAUL GILLIAM <pgilliam at us dot ibm dot com>
- To: Mark Kettenis <mark dot kettenis at xs4all dot nl>
- Cc: drow at false dot org, gdb-patches at sources dot redhat dot com
- Date: Mon, 26 Jun 2006 14:23:41 -0700
- Subject: Re: [patch] Fixes problem setting breakpoint in dynamic loader
- References: <1148513171.315.104.camel@dufur.beaverton.ibm.com> <20060525022635.GA15026@nevyn.them.org> <1148593970.315.131.camel@dufur.beaverton.ibm.com> <20060525225827.GA13498@nevyn.them.org> <1148594987.315.137.camel@dufur.beaverton.ibm.com> <1151094553.7608.89.camel@dufur.beaverton.ibm.com> <200606232148.k5NLm0Wx009049@elgar.sibelius.xs4all.nl>
- Reply-to: pgilliam at us dot ibm dot com
Here is the new patch, with out deleting the 'dot' symbol. I included a
copy of the rs6000 patch as well, just for completeness.
OK to commit?
-=# Paul #=-
2006-05-25 Paul Gilliam <pgilliam@us.ibm.com
* solib-svr4.c (enable_break): Resolve break address when the symbol
is found in the data section.
Index: solib-svr4.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-svr4.c,v
retrieving revision 1.58
diff -a -u -r1.58 solib-svr4.c
--- solib-svr4.c 18 May 2006 20:38:56 -0000 1.58
+++ solib-svr4.c 26 Jun 2006 22:08:43 -0000
@@ -1043,20 +1043,45 @@
/* Now try to set a breakpoint in the dynamic linker. */
for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
{
- /* On ABI's that use function descriptors, there are usually
- two linker symbols associated with each C function: one
- pointing at the actual entry point of the machine code,
- and one pointing at the function's descriptor. The
- latter symbol has the same name as the C function.
-
- What we're looking for here is the machine code entry
- point, so we are only interested in symbols in code
- sections. */
+ /* What we're looking for here is the machine code entry point,
+ so we are only interested in symbols in code sections.
+
+ On ABI's that use function descriptors, the linker symbol with
+ the same name as a C funtion points to that functions descriptor.
+ When those function descriptors are in the code section, they
+ contain executable code and we can set a breakpoint there. */
sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep, SEC_CODE);
if (sym_addr != 0)
break;
}
+ if (sym_addr == 0)
+ {
+ CORE_ADDR sect_offset;
+
+ /* No symbol was found in a code section, so look in the data
+ sections. This will only happen when the linker symbol points
+ to a function descriptor that is in a data section. */
+ for (bkpt_namep = solib_break_names; *bkpt_namep!=NULL; bkpt_namep++)
+ {
+ /* On ABI's that use function descriptors that are in the data
+ section, */
+ sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep, SEC_DATA);
+ if (sym_addr != 0)
+ break;
+ }
+ if (sym_addr == 0)
+ {
+ target_close (tmp_bfd_target, 0);
+ goto bkpt_at_symbol;
+ }
+
+ /* Convert 'sym_addr' from a function pointer to an address. */
+ sym_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+ sym_addr,
+ tmp_bfd_target);
+ }
+
/* We're done with both the temporary bfd and target. Remember,
closing the target closes the underlying bfd. */
target_close (tmp_bfd_target, 0);