{
std::string commandLine =
"objdump -p " +
NAME;
std::string oldname;
std::string suffix;
int vmbase = 0;
bool matched = false;
while(objdump.output())
{
std::getline(objdump.output(),
line);
if(!objdump.output()) break;
if(line.empty()) continue;
const char *lineptr = line.c_str();
if(!
skipString(
"LOAD", lineptr, &lineptr))
continue;
if(!
skipString(
"off", lineptr, &lineptr))
continue;
char *endptr = 0;
int initialBase = strtol(lineptr, &endptr, 16);
if(lineptr == endptr) continue;
lineptr = endptr;
if(!
skipString(
"vaddr", lineptr, &lineptr))
continue;
int finalBase = strtol(lineptr, &endptr, 16);
if(lineptr == endptr) continue;
vmbase=finalBase - initialBase;
matched = true;
break;
}
if(!matched)
{
fprintf(stderr,
"Cannot determine VM base address for %s\n",
NAME.c_str());
fprintf(stderr,
"Error while running `objdump -p %s`\n",
NAME.c_str());
exit(1);
}
std::string commandLine2 =
"nm -t d -n " +
NAME;
{
std::getline(
nm.output(),
line);
if(line.empty()) continue;
const char *begin = line.c_str();
char *endptr = 0;
int address = strtol(begin, &endptr, 10);
if(endptr == begin) continue;
if(*endptr++ != ' ') continue;
if(isspace(*endptr++)) continue;
if(*endptr++ != ' ') continue;
char *symbolName = endptr;
while(*endptr && !isspace(*endptr)) endptr++;
if(*endptr != 0) continue;
if(symbolName[0] == '.') continue;
int offset = address-vmbase;
else m_symbolCache.push_back(CacheItem(address-vmbase, symbolName));
}
}