C++函数签名解析

2013-11-29实际上不同这么烦锁,直接用objdump -C 或者c++file sourcefile就行了

 

 

orgmangle

首选

 1 #! /bin/sh                                                                                                         
 2 
 3 elfname=$1
 4 objname=$2
 5 targetname=""
 6 
 7 thispid=$$
 8 
 9 filename=/tmp/jerry.${thispid}
10 
11 rm -f $filename
12 
13 case $elfname in
14     *.[sS]) 
15         targetname=$elfname;
16         ;;      
17     *)
18         objdump -D -z $elfname > ${elfname}.s;
19         targetname=${elfname}.s;
20         ;;      
21     esac    
22 
23 sed -n -e '/'${objname}'/p' $targetname | awk '{print $NF}' | sed -n -e 's/<\(.*\)>\(.*\)/\1/p' | sort -d | uniq >> $filename
24 
25 for line in `sed -n -e 'p' $filename`
26 do
27     dename=`c++filt $line`
28     sed -i -e 's/'"${line}"'/'"${line}"'\t'"${dename}"'/' ${targetname} 
29 done
30 
31 rm -f $filename

vtable重构,使用下个脚本

 1 #! /bin/bash                                                                                                       
 2 
 3 filename=$1
 4 startline=$2
 5 endline=$3
 6 
 7 #vtable_parse自己写了二进制程序,参见下边
 8 temp=`./vtable_parse $filename $startline $endline`
 9 
10 mv $temp $filename

1 //Makefile
2 PPFLAGS = -I./include                                                                                             
3 
4 vtable_parse: vtable.cpp vfile.cpp basic_info.cpp
5     g++ $(CPPFLAGS) -g $^ -o $@


 1 // ./include/basic_info.h
 2 #ifndef __JERRY_BASIC_INFO
 3 #define __JERRY_BASIC_INFO
 4 
 5 
 6 #include <iostream>
 7 #include <fstream>                                                                                                 
 8 #include <unistd.h>
 9 #include <sys/types.h>
10 #include <string.h>
11 #include <stdlib.h>
12 
13 using namespace std;
14 
15 class BASIC_INFO
16 {
17     private:
18         char *strpid;
19         char *infilename;
20         char *outfilename;
21         unsigned int start_line;
22         unsigned int end_line;
23 
24         BASIC_INFO(const BASIC_INFO&);
25         BASIC_INFO& operator= (const BASIC_INFO&);
26 
27         void pid_str(char **thiz, int value, int base);
28 
29     public: 
30         BASIC_INFO(void);
31 
32         BASIC_INFO(const char *myinfile, const char* mystartline, const char *myendline);
33 
34         ~BASIC_INFO(void);
35 
36         void str_new(char **thiz, int length);
37 
38         void int_to_str(char *thiz, int value, int base);
39 
40         unsigned int str_to_int(const char *thiz, int base);
41                                                                                                                    
42         char *getinfilename(void)const;
43 
44         unsigned int getstart_line(void)const;
45 
46         unsigned int getend_line(void)const;
47 
48         char *getoutfilename(void)const;
49 };
50 
51 #endif

 1 // ./include/vfile.h
 2 
 3 #ifndef __JERRY_VFILE                                                                                              
 4 #define __JERRY_VFILE
 5 
 6 #include <basic_info.h>
 7 
 8 class VFILE:public BASIC_INFO
 9 {
10 #define infile_open_mode  (std::ios_base::in)
11 #define outfile_open_mode (std::ios_base::out)
12     private:
13         ifstream infile; 
14         ofstream outfile;
15 
16         char *alloc_pool;
17         char *alloc_use_end;
18         unsigned int pool_last;
19         unsigned int start_label;
20         unsigned int start_line;
21         unsigned int end_line;
22 
23         void infile_read(void);
24 
25         void outfile_write(void);
26 
27         void file_fix_changed(int line_num);
28 
29         int get_label(void);
30 
31         void skip_blank(char **ptr); 
32 
33         unsigned int length_to_blank(const char *src);
34 
35         void copy_to_blank(char **src); 
36 
37         void skip_to_punc(char **ptr, char value); 
38 
39         int is_line_end(char *ptr);
40 
41         VFILE(void);
42         VFILE(const VFILE&);
43     public:
44         
45         VFILE(const char *myinfilename, const char *mystartline, 
46               const char *myendline);
47              
48 
49         void parse_file(void);
50 
51         void format_alloc(void);
52 
53         void parse_write(void);
54 
55         void last_write(void);
56 
57         ~VFILE(void);
58 };
59 
60 #endif  
 1 // vtable.cpp
 2 #include <basic_info.h>                                                                                            
 3 #include <vfile.h>
 4 int main(int argc, char *argv[])
 5 {
 6 
 7     VFILE vtable(argv[1], argv[2], argv[3]);
 8 
 9     vtable.parse_file();
10     vtable.format_alloc();
11     vtable.parse_write();
12     vtable.last_write();
13 
14     cout << vtable.getoutfilename() << endl;
15 
16     return 0;
17 }
  1 // basic_info.cpp
  2 #include <basic_info.h>                                                                                            
  3 
  4 BASIC_INFO::BASIC_INFO(void):
  5     strpid(NULL), infilename(NULL), outfilename(NULL),
  6     start_line(0), end_line(0){}
  7 
  8 BASIC_INFO::BASIC_INFO(const char *myinfile, const char* mystartline, const char* myendline):
  9     strpid(NULL), infilename(NULL), outfilename(NULL),
 10     start_line(0), end_line(0)
 11 {
 12     str_new(&strpid, 32);
 13     pid_str(&strpid, getpid(), 10);
 14 
 15     str_new(&infilename, strlen(myinfile) + 1);
 16     strcpy(infilename, myinfile);
 17 
 18     str_new(&outfilename, strlen("/tmp/") + strlen(infilename) + strlen(strpid) + 1);
 19     strcpy(outfilename, "/tmp/");
 20     strcat(outfilename, infilename);
 21     strcat(outfilename, strpid);
 22 
 23     start_line = str_to_int(mystartline, 10);
 24     end_line = str_to_int(myendline, 10);
 25 }
 26 
 27 BASIC_INFO::~BASIC_INFO(void)
 28 {
 29     delete []strpid;
 30     delete []infilename;
 31     delete []outfilename;
 32 
 33     strpid = NULL;
 34     infilename = NULL;
 35     outfilename = NULL;
 36     start_line = 0;
 37     end_line = 0;
 38 }
 39 
 40 void BASIC_INFO::pid_str(char **thiz, int value, int base)
 41 {
 42     int pid_seq = getpid();
 43 
 44     int_to_str(*thiz, value, base);
 45 }
 46 
 47 void BASIC_INFO::str_new(char **thiz, int length)
 48 {
 49     if(*thiz != NULL)
 50         delete[](*thiz);
 51 
 52     *thiz = new char[length];
 53 
 54     if(*thiz == NULL)
 55     {
 56         cout << "allocate failed" << endl;
 57         exit(1);
 58     }
 59 }
 60 
 61 
 62 void BASIC_INFO::int_to_str(char *thiz, int value, int base)
 63 {
 64     char *temp  = NULL;
 65     str_new(&temp, 32);
 66 
 67     char *start = temp;
 68 
 69     while(value)
 70     {
 71         *temp++ ="0123456789abcdef"[value % base]; 
 72         value = value / base;
 73     }
 74 
 75     *temp = 0;
 76 
 77     while(--temp >= start)
 78     {
 79         *thiz++ = *temp; 
 80     }
 81 
 82     *thiz = 0;
 83 
 84     delete[]start;
 85 }
 86 
 87 unsigned int BASIC_INFO::str_to_int(const char *thiz, int base)
 88 {
 89     unsigned int temp = 0;
 90     while(*thiz)
 91     {
 92         if(!isalnum(*thiz))
 93             break;
 94 
 95         if(0 <= *thiz && *thiz <= '9')
 96             temp = (*thiz - '0') + temp * base;
 97 
 98         if('a'<= *thiz && *thiz <= 'f')
 99             temp = (*thiz - 'a' + 10) + temp * base;
100 
101         if('A'<= *thiz && *thiz <= 'F')
102             temp = (*thiz - 'A' + 10) + temp * base;
103 
104         thiz++;
105     }
106 
107     return temp;
108 }
109 
110 char * BASIC_INFO::getinfilename(void)const
111 {
112     return infilename;
113 }
114 
115 unsigned int BASIC_INFO::getstart_line(void)const
116 {
117     return start_line;
118 }
119 
120 unsigned int BASIC_INFO::getend_line(void)const
121 {
122     return end_line;
123 }
124 
125 char * BASIC_INFO::getoutfilename(void)const
126 {
127     return outfilename;
128 }            
  1 // vtable.cpp
  2 
  3 #include "vfile.h"                                                                                                 
  4 
  5 VFILE::VFILE(void){} 
  6 
  7 VFILE::VFILE(const VFILE&){}
  8 
  9 VFILE::VFILE(const char *myinfilename, const char *mystartline, const char *myendline): 
 10              BASIC_INFO(myinfilename, mystartline, myendline),
 11              alloc_pool(NULL), start_label(0)
 12 {
 13     infile.open(getinfilename(), infile_open_mode);
 14     outfile.open(getoutfilename(), outfile_open_mode);
 15     if(NULL == infile || NULL == outfile)
 16     {
 17         cout << "open file failed" << endl;
 18         exit(1);
 19     }
 20     infile.unsetf(ios::skipws);
 21 
 22     start_line = getstart_line();
 23     end_line = getend_line();
 24 
 25     start_label = get_label();
 26 }
 27 
 28 VFILE::~VFILE(void)
 29 {
 30     if(infile)
 31         infile.close();
 32     if(outfile)
 33         outfile.close();
 34     if(alloc_pool)
 35         delete[]alloc_pool;
 36 
 37     alloc_pool = NULL; 
 38 }
 39 
 40 void VFILE::infile_read(void)
 41 {
 42     infile.getline(alloc_pool, 300);
 43 }
 44 
 45 void VFILE::outfile_write(void)
 46 {
 47     outfile << alloc_pool ;
 48 }
 49 
 50 void VFILE::file_fix_changed(int line_num)
 51 {
 52     if(line_num)
 53     {
 54         int i = 0;
 55         for(i = 0; i < line_num; i++)
 56         {
 57             if(!infile.eof())
 58             {
 59                 infile_read();
 60                 outfile_write();
 61                 outfile << '\n';
 62             }
 63         }
 64     }
 65 
 66     else
 67     {
 68         while(!infile.eof())
 69         {
 70             infile_read();
 71             outfile_write();
 72             outfile << '\n';
 73         }   
 74     }
 75 
 76 }
 77 
 78 int VFILE::get_label(void)
 79 {
 80     str_new(&alloc_pool, 300);
 81     file_fix_changed(start_line);
 82     int temp = str_to_int(alloc_pool, 16);
 83     delete[]alloc_pool;
 84     alloc_pool = NULL;
 85     return temp;
 86 }
 87 
 88 void VFILE::skip_blank(char **ptr)
 89 {
 90     char *temp = *ptr;
 91 
 92     while(isblank(*temp++))
 93         *ptr = *ptr + 1;
 94 }
 95 
 96 unsigned int VFILE::length_to_blank(const char *src)
 97 {
 98     unsigned int length = 0;
 99 
100     while((!isblank(*src)) && (*src != 0))
101     {
102         length++;
103         src++;
104     }
105 
106 //  while(!isblank(*src++))
107 //      length++;
108 
109     return length;
110 
111 }
112 
113 void VFILE::copy_to_blank(char **src)
114 {
115     unsigned int length = length_to_blank(*src);
116 
117     if(length > pool_last)
118     {
119         char *temp = new char[strlen(alloc_pool) + 1 + 50]; 
120         strcpy(temp, alloc_pool);
121         delete[]alloc_pool;
122         alloc_pool = temp;
123         alloc_use_end = alloc_pool + strlen(alloc_pool) + 1;
124         pool_last = pool_last + 50;
125     }
126 
127     pool_last = pool_last - length;
128 
129     for(int i = 0; i < length; i++)
130     {
131         *alloc_use_end++ = **src;
132         *src = *src + 1;
133     }
134 
135     *alloc_use_end = 0;
136 }
137 
138 void VFILE::skip_to_punc(char **ptr, char value)
139 {
140     char *temp = *ptr;
141 
142     while(*temp++ != value)
143         *ptr = *ptr + 1;
144 
145     *ptr = *ptr + 1;
146 }
147 
148 int VFILE::is_line_end(char *ptr)
149 {
150     char *temp = ptr;
151     if(isblank(*temp) && isblank(*(temp+1)))
152         return 1;
153     return 0;
154 }
155 
156 void VFILE::parse_file(void)
157 {
158     pool_last = 300;  
159     str_new(&alloc_pool, pool_last + 1);
160     *alloc_pool = 0;
161     alloc_use_end = alloc_pool;
162 
163 
164     char *temp = NULL;
165     str_new(&temp, 300);
166     char *temp_start = temp;
167     for(unsigned int line = start_line + 1; line <= end_line; line++)
168     {
169         infile.getline(temp, 300);
170         skip_blank(&temp);
171         skip_to_punc(&temp,':');
172 
173         do
174         {
175             skip_blank(&temp);
176             copy_to_blank(&temp);
177 
178             if(*temp == 0 || *(temp + 1) == 0)
179                 break;
180             if(*temp == '\n' || *(temp + 1) == '\n')
181                 break;
182 
183         }while(!is_line_end(temp));
184     }
185 
186     delete[]temp_start;
187     temp = NULL;
188 }
189 
190 void VFILE::format_alloc(void)
191 {
192     unsigned int alloc_used = alloc_use_end - alloc_pool;
193     alloc_use_end = alloc_pool;
194     int add_line= (alloc_used / 8);
195 
196     char *temp = NULL;
197     str_new (&temp, alloc_used + add_line * 11 + 2);     
198     *temp = 0;
199     *(temp + alloc_used + add_line * 11 ) = '\n';
200     *(temp + alloc_used + add_line * 11 + 1) = 0;
201 
202     int label = start_label;
203 
204     for(int i = 0; i < add_line; i++)
205     {
206         char *str_label = NULL;
207         str_new(&str_label, 32);
208         *str_label = 0;
209         int_to_str(str_label, label, 16);
210 
211         strcat(temp, " ");
212         strcat(temp,str_label);
213         strcat(temp,":\t");
214 
215         {
216             char str_array[8];
217 
218             for(int k = 3; k >=0; --k)
219             {
220                 ((short*)str_array)[3-k] = ((short*)alloc_use_end)[k];
221             }
222             strncpy(str_label, str_array, 8);
223         }
224         alloc_use_end += 8;
225         *(str_label + 8) = '\n';
226         *(str_label + 9) = 0;
227 
228         strcat(temp, str_label);
229         delete[]str_label;
230 
231         label = label + 4;
232     }
233 
234     delete[]alloc_pool;
235     alloc_pool = temp;
236 }         
237 void VFILE::parse_write(void)
238 {
239     outfile_write();
240 }
241 
242 void VFILE::last_write(void)
243 {
244     str_new(&alloc_pool, 300);
245     file_fix_changed(0);
246     delete[]alloc_pool;
247     alloc_pool = NULL;
248 
249 }                                        

 

 

 

posted on 2013-06-05 22:55  阿加  阅读(3221)  评论(0编辑  收藏  举报

导航