235 std::string commandLine =
"objdump -p " +
NAME;
240 bool matched =
false;
241 while(objdump.output())
250 std::getline(objdump.output(),
line);
252 if(!objdump.output())
break;
253 if(line.empty())
continue;
254 const char *lineptr = line.c_str();
256 if(!
skipString(
"LOAD", lineptr, &lineptr))
continue;
258 if(!
skipString(
"off", lineptr, &lineptr))
continue;
260 int initialBase = strtol(lineptr, &endptr, 16);
261 if(lineptr == endptr)
continue;
264 if(!
skipString(
"vaddr", lineptr, &lineptr))
continue;
266 int finalBase = strtol(lineptr, &endptr, 16);
267 if(lineptr == endptr)
continue;
268 vmbase=finalBase - initialBase;
274 fprintf(stderr,
"Cannot determine VM base address for %s\n",
NAME.c_str());
275 fprintf(stderr,
"Error while running `objdump -p %s`\n",
NAME.c_str());
278 std::string commandLine2 =
"nm -t d -n " +
NAME;
283 std::getline(nm.output(),
line);
284 if(!nm.output())
break;
285 if(line.empty())
continue;
287 const char *begin = line.c_str();
289 int address = strtol(begin, &endptr, 10);
290 if(endptr == begin)
continue;
291 if(*endptr++ !=
' ')
continue;
292 if(isspace(*endptr++))
continue;
293 if(*endptr++ !=
' ')
continue;
294 char *symbolName = endptr;
295 while(*endptr && !isspace(*endptr)) endptr++;
296 if(*endptr != 0)
continue;
298 if(symbolName[0] ==
'.')
continue;
303 int offset = address-vmbase;
305 else m_symbolCache.push_back(CacheItem(address-vmbase, symbolName));
bool skipString(const char *strptr, const char *srcbuffer, const char **dstbuffer)
SymbolCache m_symbolCache
bool skipWhitespaces(const char *srcbuffer, const char **destbuffer)