~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/recordmcount.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /scripts/recordmcount.c (Version linux-6.11.5) and /scripts/recordmcount.c (Version linux-2.6.0)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  * recordmcount.c: construct a table of the lo    
  4  * so that ftrace can find them quickly.          
  5  * Copyright 2009 John F. Reiser <jreiser@BitW    
  6  *                                                
  7  * Restructured to fit Linux format, as well a    
  8  *  Copyright 2010 Steven Rostedt <srostedt@re    
  9  */                                               
 10                                                   
 11 /*                                                
 12  * Strategy: alter the .o file in-place.          
 13  *                                                
 14  * Append a new STRTAB that has the new sectio    
 15  * ElfXX_Shdr[] that has the new section heade    
 16  * contents for __mcount_loc and its relocatio    
 17  * and the old ElfXX_Shdr[] array, remain as "    
 18  * kilobytes.)  Subsequent processing by /bin/    
 19  * will ignore the garbage regions, because th    
 20  * new .e_shoff nor the new ElfXX_Shdr[].  [In    
 21  * then use "ld -r" to create a new file that     
 22  */                                               
 23                                                   
 24 #include <sys/types.h>                            
 25 #include <sys/mman.h>                             
 26 #include <sys/stat.h>                             
 27 #include <getopt.h>                               
 28 #include <elf.h>                                  
 29 #include <fcntl.h>                                
 30 #include <stdio.h>                                
 31 #include <stdlib.h>                               
 32 #include <string.h>                               
 33 #include <unistd.h>                               
 34                                                   
 35 #ifndef EM_AARCH64                                
 36 #define EM_AARCH64      183                       
 37 #define R_AARCH64_NONE          0                 
 38 #define R_AARCH64_ABS64 257                       
 39 #endif                                            
 40                                                   
 41 #ifndef EM_LOONGARCH                              
 42 #define EM_LOONGARCH            258               
 43 #define R_LARCH_32                      1         
 44 #define R_LARCH_64                      2         
 45 #define R_LARCH_MARK_LA                 20        
 46 #define R_LARCH_SOP_PUSH_PLT_PCREL      29        
 47 #endif                                            
 48                                                   
 49 #define R_ARM_PC24              1                 
 50 #define R_ARM_THM_CALL          10                
 51 #define R_ARM_CALL              28                
 52                                                   
 53 #define R_AARCH64_CALL26        283               
 54                                                   
 55 static int fd_map;      /* File descriptor for    
 56 static int mmap_failed; /* Boolean flag. */       
 57 static char gpfx;       /* prefix for global s    
 58 static struct stat sb;  /* Remember .st_size,     
 59 static const char *altmcount;   /* alternate m    
 60 static int warn_on_notrace_sect; /* warn when     
 61 static void *file_map;  /* pointer of the mapp    
 62 static void *file_end;  /* pointer to the end     
 63 static int file_updated; /* flag to state file    
 64 static void *file_ptr;  /* current file pointe    
 65                                                   
 66 static void *file_append; /* added to the end     
 67 static size_t file_append_size; /* how much is    
 68                                                   
 69 /* Per-file resource cleanup when multiple fil    
 70 static void file_append_cleanup(void)             
 71 {                                                 
 72         free(file_append);                        
 73         file_append = NULL;                       
 74         file_append_size = 0;                     
 75         file_updated = 0;                         
 76 }                                                 
 77                                                   
 78 static void mmap_cleanup(void)                    
 79 {                                                 
 80         if (!mmap_failed)                         
 81                 munmap(file_map, sb.st_size);     
 82         else                                      
 83                 free(file_map);                   
 84         file_map = NULL;                          
 85 }                                                 
 86                                                   
 87 /* ulseek, uwrite, ...:  Check return value fo    
 88                                                   
 89 static off_t ulseek(off_t const offset, int co    
 90 {                                                 
 91         switch (whence) {                         
 92         case SEEK_SET:                            
 93                 file_ptr = file_map + offset;     
 94                 break;                            
 95         case SEEK_CUR:                            
 96                 file_ptr += offset;               
 97                 break;                            
 98         case SEEK_END:                            
 99                 file_ptr = file_map + (sb.st_s    
100                 break;                            
101         }                                         
102         if (file_ptr < file_map) {                
103                 fprintf(stderr, "lseek: seek b    
104                 return -1;                        
105         }                                         
106         return file_ptr - file_map;               
107 }                                                 
108                                                   
109 static ssize_t uwrite(void const *const buf, s    
110 {                                                 
111         size_t cnt = count;                       
112         off_t idx = 0;                            
113         void *p = NULL;                           
114                                                   
115         file_updated = 1;                         
116                                                   
117         if (file_ptr + count >= file_end) {       
118                 off_t aoffset = (file_ptr + co    
119                                                   
120                 if (aoffset > file_append_size    
121                         p = realloc(file_appen    
122                         if (!p)                   
123                                 free(file_appe    
124                         file_append = p;          
125                         file_append_size = aof    
126                 }                                 
127                 if (!file_append) {               
128                         perror("write");          
129                         file_append_cleanup();    
130                         mmap_cleanup();           
131                         return -1;                
132                 }                                 
133                 if (file_ptr < file_end) {        
134                         cnt = file_end - file_    
135                 } else {                          
136                         cnt = 0;                  
137                         idx = aoffset - count;    
138                 }                                 
139         }                                         
140                                                   
141         if (cnt)                                  
142                 memcpy(file_ptr, buf, cnt);       
143                                                   
144         if (cnt < count)                          
145                 memcpy(file_append + idx, buf     
146                                                   
147         file_ptr += count;                        
148         return count;                             
149 }                                                 
150                                                   
151 static void * umalloc(size_t size)                
152 {                                                 
153         void *const addr = malloc(size);          
154         if (addr == 0) {                          
155                 fprintf(stderr, "malloc failed    
156                 file_append_cleanup();            
157                 mmap_cleanup();                   
158                 return NULL;                      
159         }                                         
160         return addr;                              
161 }                                                 
162                                                   
163 /*                                                
164  * Get the whole file as a programming conveni    
165  * malloc+lseek+read+free of many pieces.  If     
166  * avoids copying unused pieces; else just rea    
167  * Open for both read and write; new info will    
168  * Use MAP_PRIVATE so that a few changes to th    
169  * do not propagate to the file until an expli    
170  * This preserves most aspects of consistency     
171  * for simultaneous readers of the file while     
172  * However, multiple writers still are bad.  W    
173  * locking because it is expensive and the use    
174  * makes multiple writers unlikely.               
175  */                                               
176 static void *mmap_file(char const *fname)         
177 {                                                 
178         /* Avoid problems if early cleanup() *    
179         fd_map = -1;                              
180         mmap_failed = 1;                          
181         file_map = NULL;                          
182         file_ptr = NULL;                          
183         file_updated = 0;                         
184         sb.st_size = 0;                           
185                                                   
186         fd_map = open(fname, O_RDONLY);           
187         if (fd_map < 0) {                         
188                 perror(fname);                    
189                 return NULL;                      
190         }                                         
191         if (fstat(fd_map, &sb) < 0) {             
192                 perror(fname);                    
193                 goto out;                         
194         }                                         
195         if (!S_ISREG(sb.st_mode)) {               
196                 fprintf(stderr, "not a regular    
197                 goto out;                         
198         }                                         
199         file_map = mmap(0, sb.st_size, PROT_RE    
200                         fd_map, 0);               
201         if (file_map == MAP_FAILED) {             
202                 mmap_failed = 1;                  
203                 file_map = umalloc(sb.st_size)    
204                 if (!file_map) {                  
205                         perror(fname);            
206                         goto out;                 
207                 }                                 
208                 if (read(fd_map, file_map, sb.    
209                         perror(fname);            
210                         free(file_map);           
211                         file_map = NULL;          
212                         goto out;                 
213                 }                                 
214         } else                                    
215                 mmap_failed = 0;                  
216 out:                                              
217         close(fd_map);                            
218         fd_map = -1;                              
219                                                   
220         file_end = file_map + sb.st_size;         
221                                                   
222         return file_map;                          
223 }                                                 
224                                                   
225                                                   
226 static unsigned char ideal_nop5_x86_64[5] = {     
227 static unsigned char ideal_nop5_x86_32[5] = {     
228 static unsigned char *ideal_nop;                  
229                                                   
230 static char rel_type_nop;                         
231                                                   
232 static int (*make_nop)(void *map, size_t const    
233                                                   
234 static int make_nop_x86(void *map, size_t cons    
235 {                                                 
236         uint32_t *ptr;                            
237         unsigned char *op;                        
238                                                   
239         /* Confirm we have 0xe8 0x0 0x0 0x0 0x    
240         ptr = map + offset;                       
241         if (*ptr != 0)                            
242                 return -1;                        
243                                                   
244         op = map + offset - 1;                    
245         if (*op != 0xe8)                          
246                 return -1;                        
247                                                   
248         /* convert to nop */                      
249         if (ulseek(offset - 1, SEEK_SET) < 0)     
250                 return -1;                        
251         if (uwrite(ideal_nop, 5) < 0)             
252                 return -1;                        
253         return 0;                                 
254 }                                                 
255                                                   
256 static unsigned char ideal_nop4_arm_le[4] = {     
257 static unsigned char ideal_nop4_arm_be[4] = {     
258 static unsigned char *ideal_nop4_arm;             
259                                                   
260 static unsigned char bl_mcount_arm_le[4] = { 0    
261 static unsigned char bl_mcount_arm_be[4] = { 0    
262 static unsigned char *bl_mcount_arm;              
263                                                   
264 static unsigned char push_arm_le[4] = { 0x04,     
265 static unsigned char push_arm_be[4] = { 0xe5,     
266 static unsigned char *push_arm;                   
267                                                   
268 static unsigned char ideal_nop2_thumb_le[2] =     
269 static unsigned char ideal_nop2_thumb_be[2] =     
270 static unsigned char *ideal_nop2_thumb;           
271                                                   
272 static unsigned char push_bl_mcount_thumb_le[6    
273 static unsigned char push_bl_mcount_thumb_be[6    
274 static unsigned char *push_bl_mcount_thumb;       
275                                                   
276 static int make_nop_arm(void *map, size_t cons    
277 {                                                 
278         char *ptr;                                
279         int cnt = 1;                              
280         int nop_size;                             
281         size_t off = offset;                      
282                                                   
283         ptr = map + offset;                       
284         if (memcmp(ptr, bl_mcount_arm, 4) == 0    
285                 if (memcmp(ptr - 4, push_arm,     
286                         off -= 4;                 
287                         cnt = 2;                  
288                 }                                 
289                 ideal_nop = ideal_nop4_arm;       
290                 nop_size = 4;                     
291         } else if (memcmp(ptr - 2, push_bl_mco    
292                 cnt = 3;                          
293                 nop_size = 2;                     
294                 off -= 2;                         
295                 ideal_nop = ideal_nop2_thumb;     
296         } else                                    
297                 return -1;                        
298                                                   
299         /* Convert to nop */                      
300         if (ulseek(off, SEEK_SET) < 0)            
301                 return -1;                        
302                                                   
303         do {                                      
304                 if (uwrite(ideal_nop, nop_size    
305                         return -1;                
306         } while (--cnt > 0);                      
307                                                   
308         return 0;                                 
309 }                                                 
310                                                   
311 static unsigned char ideal_nop4_arm64[4] = {0x    
312 static int make_nop_arm64(void *map, size_t co    
313 {                                                 
314         uint32_t *ptr;                            
315                                                   
316         ptr = map + offset;                       
317         /* bl <_mcount> is 0x94000000 before r    
318         if (*ptr != 0x94000000)                   
319                 return -1;                        
320                                                   
321         /* Convert to nop */                      
322         if (ulseek(offset, SEEK_SET) < 0)         
323                 return -1;                        
324         if (uwrite(ideal_nop, 4) < 0)             
325                 return -1;                        
326         return 0;                                 
327 }                                                 
328                                                   
329 static int write_file(const char *fname)          
330 {                                                 
331         char tmp_file[strlen(fname) + 4];         
332         size_t n;                                 
333                                                   
334         if (!file_updated)                        
335                 return 0;                         
336                                                   
337         sprintf(tmp_file, "%s.rc", fname);        
338                                                   
339         /*                                        
340          * After reading the entire file into     
341          * and write it back, to prevent weird    
342          * an object file in place.               
343          */                                       
344         fd_map = open(tmp_file, O_WRONLY | O_T    
345         if (fd_map < 0) {                         
346                 perror(fname);                    
347                 return -1;                        
348         }                                         
349         n = write(fd_map, file_map, sb.st_size    
350         if (n != sb.st_size) {                    
351                 perror("write");                  
352                 close(fd_map);                    
353                 return -1;                        
354         }                                         
355         if (file_append_size) {                   
356                 n = write(fd_map, file_append,    
357                 if (n != file_append_size) {      
358                         perror("write");          
359                         close(fd_map);            
360                         return -1;                
361                 }                                 
362         }                                         
363         close(fd_map);                            
364         if (rename(tmp_file, fname) < 0) {        
365                 perror(fname);                    
366                 return -1;                        
367         }                                         
368         return 0;                                 
369 }                                                 
370                                                   
371 /* w8rev, w8nat, ...: Handle endianness. */       
372                                                   
373 static uint64_t w8rev(uint64_t const x)           
374 {                                                 
375         return   ((0xff & (x >> (0 * 8))) << (    
376                | ((0xff & (x >> (1 * 8))) << (    
377                | ((0xff & (x >> (2 * 8))) << (    
378                | ((0xff & (x >> (3 * 8))) << (    
379                | ((0xff & (x >> (4 * 8))) << (    
380                | ((0xff & (x >> (5 * 8))) << (    
381                | ((0xff & (x >> (6 * 8))) << (    
382                | ((0xff & (x >> (7 * 8))) << (    
383 }                                                 
384                                                   
385 static uint32_t w4rev(uint32_t const x)           
386 {                                                 
387         return   ((0xff & (x >> (0 * 8))) << (    
388                | ((0xff & (x >> (1 * 8))) << (    
389                | ((0xff & (x >> (2 * 8))) << (    
390                | ((0xff & (x >> (3 * 8))) << (    
391 }                                                 
392                                                   
393 static uint32_t w2rev(uint16_t const x)           
394 {                                                 
395         return   ((0xff & (x >> (0 * 8))) << (    
396                | ((0xff & (x >> (1 * 8))) << (    
397 }                                                 
398                                                   
399 static uint64_t w8nat(uint64_t const x)           
400 {                                                 
401         return x;                                 
402 }                                                 
403                                                   
404 static uint32_t w4nat(uint32_t const x)           
405 {                                                 
406         return x;                                 
407 }                                                 
408                                                   
409 static uint32_t w2nat(uint16_t const x)           
410 {                                                 
411         return x;                                 
412 }                                                 
413                                                   
414 static uint64_t (*w8)(uint64_t);                  
415 static uint32_t (*w)(uint32_t);                   
416 static uint32_t (*w2)(uint16_t);                  
417                                                   
418 /* Names of the sections that could contain ca    
419 static int is_mcounted_section_name(char const    
420 {                                                 
421         return strncmp(".text",          txtna    
422                 strcmp(".init.text",     txtna    
423                 strcmp(".ref.text",      txtna    
424                 strcmp(".sched.text",    txtna    
425                 strcmp(".spinlock.text", txtna    
426                 strcmp(".irqentry.text", txtna    
427                 strcmp(".softirqentry.text", t    
428                 strcmp(".kprobes.text", txtnam    
429                 strcmp(".cpuidle.text", txtnam    
430 }                                                 
431                                                   
432 static char const *already_has_rel_mcount = "s    
433                                                   
434 /* 32 bit and 64 bit are very similar */          
435 #include "recordmcount.h"                         
436 #define RECORD_MCOUNT_64                          
437 #include "recordmcount.h"                         
438                                                   
439 static int arm_is_fake_mcount(Elf32_Rel const     
440 {                                                 
441         switch (ELF32_R_TYPE(w(rp->r_info))) {    
442         case R_ARM_THM_CALL:                      
443         case R_ARM_CALL:                          
444         case R_ARM_PC24:                          
445                 return 0;                         
446         }                                         
447                                                   
448         return 1;                                 
449 }                                                 
450                                                   
451 static int arm64_is_fake_mcount(Elf64_Rel cons    
452 {                                                 
453         return ELF64_R_TYPE(w8(rp->r_info)) !=    
454 }                                                 
455                                                   
456 static int LARCH32_is_fake_mcount(Elf32_Rel co    
457 {                                                 
458         switch (ELF64_R_TYPE(w(rp->r_info))) {    
459         case R_LARCH_MARK_LA:                     
460         case R_LARCH_SOP_PUSH_PLT_PCREL:          
461                 return 0;                         
462         }                                         
463                                                   
464         return 1;                                 
465 }                                                 
466                                                   
467 static int LARCH64_is_fake_mcount(Elf64_Rel co    
468 {                                                 
469         switch (ELF64_R_TYPE(w(rp->r_info))) {    
470         case R_LARCH_MARK_LA:                     
471         case R_LARCH_SOP_PUSH_PLT_PCREL:          
472                 return 0;                         
473         }                                         
474                                                   
475         return 1;                                 
476 }                                                 
477                                                   
478 /* 64-bit EM_MIPS has weird ELF64_Rela.r_info.    
479  * http://techpubs.sgi.com/library/manuals/400    
480  * We interpret Table 29 Relocation Operation     
481  * to imply the order of the members; the spec    
482  *      typedef unsigned char Elf64_Byte;         
483  * fails on MIPS64 because their <elf.h> alrea    
484  */                                               
485                                                   
486 typedef uint8_t myElf64_Byte;           /* Typ    
487                                                   
488 union mips_r_info {                               
489         Elf64_Xword r_info;                       
490         struct {                                  
491                 Elf64_Word r_sym;                 
492                 myElf64_Byte r_ssym;              
493                 myElf64_Byte r_type3;             
494                 myElf64_Byte r_type2;             
495                 myElf64_Byte r_type;              
496         } r_mips;                                 
497 };                                                
498                                                   
499 static uint64_t MIPS64_r_sym(Elf64_Rel const *    
500 {                                                 
501         return w(((union mips_r_info){ .r_info    
502 }                                                 
503                                                   
504 static void MIPS64_r_info(Elf64_Rel *const rp,    
505 {                                                 
506         rp->r_info = ((union mips_r_info){        
507                 .r_mips = { .r_sym = w(sym), .    
508         }).r_info;                                
509 }                                                 
510                                                   
511 static int do_file(char const *const fname)       
512 {                                                 
513         unsigned int reltype = 0;                 
514         Elf32_Ehdr *ehdr;                         
515         int rc = -1;                              
516                                                   
517         ehdr = mmap_file(fname);                  
518         if (!ehdr)                                
519                 goto out;                         
520                                                   
521         w = w4nat;                                
522         w2 = w2nat;                               
523         w8 = w8nat;                               
524         switch (ehdr->e_ident[EI_DATA]) {         
525                 static unsigned int const endi    
526         default:                                  
527                 fprintf(stderr, "unrecognized     
528                         ehdr->e_ident[EI_DATA]    
529                 goto out;                         
530         case ELFDATA2LSB:                         
531                 if (*(unsigned char const *)&e    
532                         /* main() is big endia    
533                         w = w4rev;                
534                         w2 = w2rev;               
535                         w8 = w8rev;               
536                 }                                 
537                 ideal_nop4_arm = ideal_nop4_ar    
538                 bl_mcount_arm = bl_mcount_arm_    
539                 push_arm = push_arm_le;           
540                 ideal_nop2_thumb = ideal_nop2_    
541                 push_bl_mcount_thumb = push_bl    
542                 break;                            
543         case ELFDATA2MSB:                         
544                 if (*(unsigned char const *)&e    
545                         /* main() is little en    
546                         w = w4rev;                
547                         w2 = w2rev;               
548                         w8 = w8rev;               
549                 }                                 
550                 ideal_nop4_arm = ideal_nop4_ar    
551                 bl_mcount_arm = bl_mcount_arm_    
552                 push_arm = push_arm_be;           
553                 ideal_nop2_thumb = ideal_nop2_    
554                 push_bl_mcount_thumb = push_bl    
555                 break;                            
556         }  /* end switch */                       
557         if (memcmp(ELFMAG, ehdr->e_ident, SELF    
558             w2(ehdr->e_type) != ET_REL ||         
559             ehdr->e_ident[EI_VERSION] != EV_CU    
560                 fprintf(stderr, "unrecognized     
561                 goto out;                         
562         }                                         
563                                                   
564         gpfx = '_';                               
565         switch (w2(ehdr->e_machine)) {            
566         default:                                  
567                 fprintf(stderr, "unrecognized     
568                         w2(ehdr->e_machine), f    
569                 goto out;                         
570         case EM_386:                              
571                 reltype = R_386_32;               
572                 rel_type_nop = R_386_NONE;        
573                 make_nop = make_nop_x86;          
574                 ideal_nop = ideal_nop5_x86_32;    
575                 mcount_adjust_32 = -1;            
576                 gpfx = 0;                         
577                 break;                            
578         case EM_ARM:                              
579                 reltype = R_ARM_ABS32;            
580                 altmcount = "__gnu_mcount_nc";    
581                 make_nop = make_nop_arm;          
582                 rel_type_nop = R_ARM_NONE;        
583                 is_fake_mcount32 = arm_is_fake    
584                 gpfx = 0;                         
585                 break;                            
586         case EM_AARCH64:                          
587                 reltype = R_AARCH64_ABS64;        
588                 make_nop = make_nop_arm64;        
589                 rel_type_nop = R_AARCH64_NONE;    
590                 ideal_nop = ideal_nop4_arm64;     
591                 is_fake_mcount64 = arm64_is_fa    
592                 break;                            
593         case EM_MIPS:   /* reltype: e_class       
594         case EM_LOONGARCH:      /* reltype: e_    
595         case EM_PPC:    reltype = R_PPC_ADDR32    
596         case EM_PPC64:  reltype = R_PPC64_ADDR    
597         case EM_S390:   /* reltype: e_class       
598         case EM_SH:     reltype = R_SH_DIR32;     
599         case EM_SPARCV9: reltype = R_SPARC_64;    
600         case EM_X86_64:                           
601                 make_nop = make_nop_x86;          
602                 ideal_nop = ideal_nop5_x86_64;    
603                 reltype = R_X86_64_64;            
604                 rel_type_nop = R_X86_64_NONE;     
605                 mcount_adjust_64 = -1;            
606                 gpfx = 0;                         
607                 break;                            
608         }  /* end switch */                       
609                                                   
610         switch (ehdr->e_ident[EI_CLASS]) {        
611         default:                                  
612                 fprintf(stderr, "unrecognized     
613                         ehdr->e_ident[EI_CLASS    
614                 goto out;                         
615         case ELFCLASS32:                          
616                 if (w2(ehdr->e_ehsize) != size    
617                 ||  w2(ehdr->e_shentsize) != s    
618                         fprintf(stderr,           
619                                 "unrecognized     
620                         goto out;                 
621                 }                                 
622                 if (w2(ehdr->e_machine) == EM_    
623                         reltype = R_MIPS_32;      
624                         is_fake_mcount32 = MIP    
625                 }                                 
626                 if (w2(ehdr->e_machine) == EM_    
627                         reltype = R_LARCH_32;     
628                         is_fake_mcount32 = LAR    
629                 }                                 
630                 if (do32(ehdr, fname, reltype)    
631                         goto out;                 
632                 break;                            
633         case ELFCLASS64: {                        
634                 Elf64_Ehdr *const ghdr = (Elf6    
635                 if (w2(ghdr->e_ehsize) != size    
636                 ||  w2(ghdr->e_shentsize) != s    
637                         fprintf(stderr,           
638                                 "unrecognized     
639                         goto out;                 
640                 }                                 
641                 if (w2(ghdr->e_machine) == EM_    
642                         reltype = R_390_64;       
643                         mcount_adjust_64 = -14    
644                 }                                 
645                 if (w2(ghdr->e_machine) == EM_    
646                         reltype = R_MIPS_64;      
647                         Elf64_r_sym = MIPS64_r    
648                         Elf64_r_info = MIPS64_    
649                         is_fake_mcount64 = MIP    
650                 }                                 
651                 if (w2(ghdr->e_machine) == EM_    
652                         reltype = R_LARCH_64;     
653                         is_fake_mcount64 = LAR    
654                 }                                 
655                 if (do64(ghdr, fname, reltype)    
656                         goto out;                 
657                 break;                            
658         }                                         
659         }  /* end switch */                       
660                                                   
661         rc = write_file(fname);                   
662 out:                                              
663         file_append_cleanup();                    
664         mmap_cleanup();                           
665         return rc;                                
666 }                                                 
667                                                   
668 int main(int argc, char *argv[])                  
669 {                                                 
670         const char ftrace[] = "/ftrace.o";        
671         int ftrace_size = sizeof(ftrace) - 1;     
672         int n_error = 0;  /* gcc-4.3.0 false p    
673         int c;                                    
674         int i;                                    
675                                                   
676         while ((c = getopt(argc, argv, "w")) >    
677                 switch (c) {                      
678                 case 'w':                         
679                         warn_on_notrace_sect =    
680                         break;                    
681                 default:                          
682                         fprintf(stderr, "usage    
683                         return 0;                 
684                 }                                 
685         }                                         
686                                                   
687         if ((argc - optind) < 1) {                
688                 fprintf(stderr, "usage: record    
689                 return 0;                         
690         }                                         
691                                                   
692         /* Process each file in turn, allowing    
693         for (i = optind; i < argc; i++) {         
694                 char *file = argv[i];             
695                 int len;                          
696                                                   
697                 /*                                
698                  * The file kernel/trace/ftrac    
699                  * function but does not call     
700                  * not be traced anyway, we ju    
701                  */                               
702                 len = strlen(file);               
703                 if (len >= ftrace_size &&         
704                     strcmp(file + (len - ftrac    
705                         continue;                 
706                                                   
707                 if (do_file(file)) {              
708                         fprintf(stderr, "%s: f    
709                         ++n_error;                
710                 }                                 
711         }                                         
712         return !!n_error;                         
713 }                                                 
714                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php