changed exclude_lib to mean shared object is not instrumentable
[dyninst.git] / dyninstAPI / src / sharedobject.C
1 #include "dyninstAPI/src/sharedobject.h"
2
3 // TODO: this should probably not be a shared_object method, but since
4 // for now it is only used by shared_objects it is
5 // from a string that is a complete path name to a function in a module
6 // (ie. "/usr/lib/libc.so.1/write") return a string with the function
7 // part removed.  return 0 on error
8 string *shared_object::getModulePart(string &full_path_name) {
9
10     char *whole_name = P_strdup(full_path_name.string_of());
11     char *next=0;
12     char *last=next;
13     if((last = P_strrchr(whole_name, '/'))){
14         next = whole_name;
15         for(u_int i=0;(next!=last)&&(i<full_path_name.length()); i++){
16             next++;
17             if(next == last){
18                 u_int size = i+2;
19                 char *temp_str = new char[size];
20                 if(P_strncpy(temp_str,whole_name,size-1)){
21                     temp_str[size-1] = '\0';
22                     string *temp = new string(temp_str);
23                     delete whole_name;
24                     delete [] temp_str;
25                     return temp;
26                     temp = 0;
27             } }
28         }
29     }
30     delete whole_name;
31     return 0;
32 }
33
34
35 // returns all the functions not excluded by exclude_lib or exclude_func
36 // mdl option
37 vector<pd_Function *> *shared_object::getSomeFunctions(){
38     if(objs_image) {
39       if(some_funcs) return some_funcs;
40       // return (&(objs_image->mdlNormal));
41       // check to see if this module occurs in the list of modules from
42       // exclude_funcs mdl option...if it does then we need to check
43       // function by function
44       some_funcs = new vector<pd_Function *>;
45       *some_funcs +=  *(getAllFunctions());
46       vector<string> func_constraints;
47       if(mdl_get_func_constraints(func_constraints)) {
48         for(u_int i=0; i < func_constraints.size(); i++) {
49             string *mod_name = getModulePart(func_constraints[i]);
50             if(mod_name && (*mod_name == name)){
51                 // find corresponding function in the list of
52                 // some_funcs and remove it
53                 char *temp = P_strdup(func_constraints[i].string_of());
54                 char *func_name = P_strrchr(temp,'/'); 
55                 func_name++;
56                 if(func_name){
57                    string blah(func_name);
58                    pd_Function *pf = findOneFunction(blah,false);
59                    if(pf) {
60                      u_int size = some_funcs->size();
61                      for(u_int j=0; j < size; j++) {
62                         if(pf == (*some_funcs)[j]){
63                           (*some_funcs)[j] = (*some_funcs)[size - 1];
64                           some_funcs->resize(size - 1);
65                           break;
66                    } } }
67                 }
68             }
69       } }
70       return some_funcs;
71     }
72     some_funcs = 0;
73     return 0;
74 }