296 info.m_filename = desc.filename;
297 info.m_text_start = desc.tstart;
298 info.m_text_end = desc.tend;
299 info.m_data_start = desc.dstart;
300 info.m_data_end = desc.dend;
301 info.m_bss_start = 0;
308# if !HAVE_LINK_MAP_L_MAP_START
309# define l_map_start l_addr
310# define l_map_end l_addr
312# if !HAVE_PROGRAM_INVOCATION_NAME
313 static const char *program_invocation_name =
"(unknown program name)";
316 link_map *p = _r_debug.r_map;
347 for (
ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
348 if (dyn->d_tag == DT_DEBUG && dyn->d_un.d_ptr)
350 p = (link_map *) *((
unsigned long *) dyn->d_un.d_ptr + 1);
363 memset (exe, 0,
sizeof (exe));
364 if (::stat (
"/proc/self/exe", &sbuf) == 0)
365 ::readlink (
"/proc/self/exe", exe,
sizeof (exe)-1);
367 STDC::strncpy (exe, program_invocation_name,
sizeof (exe)-1);
370 for ( ; p; p = p->l_next)
391 info.m_filename = (p->l_name && p->l_name[0] ? p->l_name : exe);
392 info.m_text_start = p->l_addr ? p->l_addr : p->l_map_start;
393 info.m_text_end = p->l_addr ? p->l_addr : p->l_map_end;
394 info.m_data_start = 0;
396 info.m_bss_start = 0;
422 extern ElfW(Obj_Info) *__rld_obj_head;
423 ElfW(Obj_Info) *p = __rld_obj_head;
425 for ( ; p; p = (
ElfW(Obj_Info) *) p->oi_next)
429# if defined _MIPS_SIM_ABI32 && _MIPS_SIM == _MIPS_SIM_ABI32
430 info.m_filename = (
const char *) p->o_path;
431 info.m_text_start = p->o_praw;
432 info.m_text_end = p->o_praw;
433# elif (defined _MIPS_SIM_NABI32 && _MIPS_SIM == _MIPS_SIM_NABI32) \
434 || (defined _MIPS_SIM_ABI64 && _MIPS_SIM == _MIPS_SIM_ABI64)
435 info.m_filename = (
const char *) p->oi_pathname;
436 info.m_text_start = p->oi_ehdr;
437 info.m_text_end = p->oi_ehdr;
439# error "Unsupported ABI: not o32, n32 or 64"
441 info.m_data_start = 0;
443 info.m_bss_start = 0;
449#elif HAVE_LOADER_H && HAVE_LDR_NEXT_MODULE_DECL
450 ldr_process_t proc = ldr_my_process ();
451 ldr_module_t mod = LDR_NULL_MODULE;
452 int ret = ldr_next_module (proc, &mod);
454 for (; ret == 0 && mod != LDR_NULL_MODULE; ret = ldr_next_module (proc, &mod))
456 ldr_module_info_t info;
460 if (ldr_inq_module(proc, mod, &info,
sizeof(info), &
size) < 0)
471 for (
int i = 0; i < info.lmi_nregion; ++i)
473 ldr_region_info_t rinfo;
477 if (ldr_inq_region(proc, mod, i, &rinfo,
sizeof(rinfo), &
size) < 0)
480 low = (
unsigned long) rinfo.lri_mapaddr;
481 high = ((
unsigned long) rinfo.lri_mapaddr) + rinfo.lri_size;
483 if (!strcmp(rinfo.lri_name,
".text")) {
486 }
else if (!strcmp(rinfo.lri_name,
".data")) {
489 }
else if (!strcmp(rinfo.lri_name,
".bss")) {
501#elif HAVE_LOAD && HAVE_LOAD_DECL
503 void *buffer =
new ld_info [
size];
504 int error = ::loadquery (L_GETINFO, buffer,
size);
507 while (
error == -1 && errno == ENOMEM)
509 delete [] (ld_info *) buffer;
510 buffer =
new ld_info [
size *= 2];
511 error = ::loadquery (L_GETINFO, buffer,
size);
520 ld_info *ld = (ld_info *) ((
char *) buffer + offset);
521 const char *
path = ld->ldinfo_filename;
522 const char *member =
path + strlen (
path) + 1;
523 std::string filename;
533 info.m_filename = filename.c_str ();
534 info.m_text_start = (
unsigned long) ld->ldinfo_textorg;
535 info.m_text_end = info.m_text_start + ld->ldinfo_textsize;
536 info.m_data_start = (
unsigned long) ld->ldinfo_dataorg;
537 info.m_data_end = info.m_data_start + ld->ldinfo_datasize;
538 info.m_bss_start = 0;
544 offset += ld->ldinfo_next;
549 delete [] (ld_info *) buffer;
551#elif HAVE_MACH_O_DYLD_H
552 unsigned long images = _dyld_image_count ();
553 for (
unsigned long i = 0; i < images; ++i)
555 const mach_header *hdr = _dyld_get_image_header (i);
556 unsigned long slide = _dyld_get_image_vmaddr_slide (i);
561 info.m_filename = _dyld_get_image_name (i);
563 sect = getsectdatafromheader (hdr, SEG_TEXT, SECT_TEXT, &
size);
564 info.m_text_start = sect ? (
unsigned long) sect + slide : 0;
565 info.m_text_end = sect ? (
unsigned long) sect + slide +
size : 0;
566 sect = getsectdatafromheader (hdr, SEG_DATA, SECT_DATA, &
size);
567 info.m_data_start = sect ? (
unsigned long) sect + slide : 0;
568 info.m_data_end = sect ? (
unsigned long) sect + slide +
size : 0;
569 sect = getsectdatafromheader (hdr, SEG_DATA, SECT_BSS, &
size);
570 info.m_bss_start = sect ? (
unsigned long) sect + slide : 0;
571 info.m_bss_end = sect ? (
unsigned long) sect + slide +
size : 0;
577 if (! SymInitialize (GetCurrentProcess (), NULL, TRUE)
578 || ! SymEnumerateModules (GetCurrentProcess (), &enumModules, (
void *) &
handler)
579 || ! SymCleanup (GetCurrentProcess ()))