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 }                                        

 

 

 

你可能感兴趣的:(C++)