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

gdb and dynamic loader namespaces


hi,

While playing a bit with the dlmopen (this is the stock glibc coming
with a FC5 system) function, it occured to me that gdb 6.6 does not seem
to be able to deal with code loaded in a process through this function.
The attached test program shows that, indeed an extra binary is loaded
in my process address space but gdb seems unable to place a breakpoint
in any of the functions defined in this binary (something like "b
gtk_window_new"). 

So, I tried to figure out how I could fix this in gdb: a bit of
debugging shows that gdb is notified of dlmopen calls through the
r_debug structure since "set stop-on-solib-events 1" triggers correctly
an event upon dlmopen. The question then is why gdb does not add the new
binary to its map. Maybe someone more knowledgeable than me about the
layout of the gdb code source could point me to the piece of code which
updates and manipulates the gdb map of binaries used during symbol
lookup ? (I am using an x86 linux system)

I apologize before hand if this email is off-topic,

regards,
Mathieu
-- 
#define _GNU_SOURCE

#include <dlfcn.h>
#include <link.h>
#include <stdio.h>

static void print_map (struct link_map *map)
{
  struct link_map *tmp;
  for (tmp = map; tmp != 0; tmp = tmp->l_next)
    {
      printf ("  0x%lx: \"%s\"\n", tmp->l_addr, tmp->l_name?tmp->l_name:"null");
    }
}

int main (int argc, char *argv[])
{
  void * handle;
  struct link_map *map;
  dlerror ();
  handle = dlopen (NULL, RTLD_LAZY);
  if (handle == NULL) 
    {
      printf ("error getting handle for main binary: %s\n", dlerror ());
      goto error;
    }
  if (dlinfo (handle, RTLD_DI_LINKMAP, &map) == -1) 
    {
      printf ("error getting link map: %s\n", dlerror ());
      goto error;
    }

  printf ("map before dlmopen\n");
  print_map (map);

  void *module = dlmopen (LM_ID_NEWLM, "/usr/lib/libgtk-x11-2.0.so", RTLD_NOW);	
  if (module == 0) {
    printf ("error=\"%s\"", dlerror ());
    return;
  }


  printf ("default map after dlmopen\n");
  print_map (map);


  if (dlinfo (module, RTLD_DI_LINKMAP, &map) == -1) 
    {
      printf ("error getting 2nd link map: %s\n", dlerror ());
      goto error;
    }

  printf ("2nd map after dlmopen\n");
  print_map (map);


  return 0;
 error:
  return -1;
}

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