Fix problems with parsing seperate debug files on Linux when the base address of...
[dyninst.git] / symtabAPI / tests / dynNM.C
1 /*
2  * Test program: nm equivalent (prints all symbol data)
3  *
4  * Usage: ./dynNM <object file>
5  */
6
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include <iomanip>
11 #include <iostream>
12
13 #include "Symtab.h"
14 #include "Archive.h"
15 #define logerror printf
16
17 using namespace Dyninst;
18 using namespace SymtabAPI;
19 static int mutatorTest(Symtab *symtab)
20 {
21   vector <Symbol *>syms;
22   /*********************************************************************************
23                 Symtab::getAllSymbolsByType: ST_FUNCTION
24   *********************************************************************************/    
25   if(!symtab->getAllSymbolsByType(syms,Symbol::ST_FUNCTION))
26   {
27      logerror("unable to get all Functions\n");
28      logerror("%s\n", Symtab::printError(Symtab::getLastSymtabError()).c_str());
29      return -1;
30   }
31   printf("%s[%d]: found %lu functions.\n", __FILE__, __LINE__, syms.size());
32   
33   for (unsigned i = 0; i < syms.size(); i++) {
34      if (syms[i]->getPrettyName() != std::string(""))
35         cout << syms[i]->getPrettyName() << ": " << setbase(16) << syms[i]->getAddr() << endl;
36      else
37         cout << syms[i]->getName() << ": " << setbase(16) << syms[i]->getAddr() << endl;
38   }
39
40   syms.clear();
41
42
43   syms.clear();
44   return 0;
45 }
46
47 int main(int argc, char **argv)
48 {
49   string s = argv[1];
50   cerr << "Checking file " << s << endl;
51   Symtab *symtab = NULL;
52   bool result = Symtab::openFile(symtab,s);
53   if (!result) {
54     cerr << "Error: problem with opening file: " << 
55        Symtab::printError(Symtab::getLastSymtabError()) << endl;
56     cerr << s << "/" << symtab << endl;
57     exit(-1);
58   }
59   return mutatorTest(symtab);
60 }