+ /* Damn. The symbol is in a dynamic library. Let's get wild */
+ char *maps_name;
+ FILE *maps;
+ char maps_buff[512];
+
+ long int addr,offset=0;
+ char *p,*p2;
+
+ char *subcmd;
+ FILE *subpipe;
+ int found=0;
+
+ /* let's look for the offset of this library in our addressing space */
+ maps_name=bprintf("/proc/%d/maps",(int)getpid());
+ maps=fopen(maps_name,"r");
+
+ sscanf(addrs[i],"%lx",&addr);
+ sprintf(maps_buff,"%#lx",addr);
+
+ if (strcmp(addrs[i],maps_buff)) {
+ CRITICAL2("Cannot parse backtrace address '%s' (addr=%#lx)",
+ addrs[i], addr);
+ }
+ DEBUG2("addr=%s (as string) =%#lx (as number)",addrs[i],addr);
+
+ while (!found) {
+ long int first, last;
+ if (fgets(maps_buff,512,maps) == NULL)
+ break;
+ if (i==0) {
+ maps_buff[strlen(maps_buff) -1]='\0';
+ DEBUG1("map line: %s", maps_buff);
+ }
+ sscanf(maps_buff,"%lx",&first);
+ p=strchr(maps_buff,'-')+1;
+ sscanf(p,"%lx",&last);
+ if (first < addr && addr < last) {
+ offset = first;
+ found=1;
+ }
+ DEBUG4("%#lx %s [%#lx-%#lx]",
+ addr, found? "in":"out of",first,last);
+ }
+ fclose(maps);
+ free(maps_name);
+
+ if (!found) {
+ WARN0("Problem while reading the maps file");
+ e->bt_strings[i] = bprintf("** In ?? (%s)", backtrace[i]);
+ continue;
+ }
+
+ /* Ok, Found the offset of the maps line containing the searched symbol.
+ We now need to substract this from the address we got from backtrace.
+ */
+
+ free(addrs[i]);
+ addrs[i] = bprintf("0x%0*lx",addr_len-2,addr-offset);
+ DEBUG2("offset=%#lx new addr=%s",offset,addrs[i]);
+
+ /* Got it. We have our new address. Let's get the library path and we
+ are set */
+ p = xbt_strdup(backtrace[i]);
+ p2 = strrchr(p,'(');
+ if (p2) *p2= '\0';
+ p2 = strrchr(p,' ');
+ if (p2) *p2= '\0';
+
+ /* Here we go, fire an addr2line up */
+ subcmd = bprintf("%s -f -e %s %s",ADDR2LINE,p, addrs[i]);