- if (dyld_all_image_infos_addr)
- macho_info->dbg_hdr_addr = (unsigned long)dyld_all_image_infos_addr;
- else
- ret = FALSE;
- TRACE("dbg_hdr_addr = 0x%08lx\n", macho_info->dbg_hdr_addr);
+ if (!ret)
+ {
+ static void* dyld_all_image_infos_addr;
+
+ /* Our next best guess is that dyld was loaded at its base address
+ and we can find the dyld image infos address by looking up its symbol. */
+ if (!dyld_all_image_infos_addr)
+ {
+ struct nlist nl[2];
+ memset(nl, 0, sizeof(nl));
+ nl[0].n_un.n_name = (char*)"_dyld_all_image_infos";
+ if (!nlist("/usr/lib/dyld", nl))
+ dyld_all_image_infos_addr = (void*)nl[0].n_value;
+ }
+
+ if (dyld_all_image_infos_addr)
+ {
+ TRACE("got dyld_image_info %p from /usr/lib/dyld symbol table\n",
+ dyld_all_image_infos_addr);
+ macho_info->dbg_hdr_addr = (unsigned long)dyld_all_image_infos_addr;
+ ret = TRUE;
+ }
+ }