@@ -33,8 +33,8 @@ struct sym_entry {
33
33
unsigned long long addr ;
34
34
unsigned int len ;
35
35
unsigned int start_pos ;
36
- unsigned char * sym ;
37
36
unsigned int percpu_absolute ;
37
+ unsigned char sym [0 ];
38
38
};
39
39
40
40
struct addr_range {
@@ -55,7 +55,7 @@ static struct addr_range percpu_range = {
55
55
"__per_cpu_start" , "__per_cpu_end" , -1ULL , 0
56
56
};
57
57
58
- static struct sym_entry * table ;
58
+ static struct sym_entry * * table ;
59
59
static unsigned int table_size , table_cnt ;
60
60
static int all_symbols ;
61
61
static int absolute_percpu ;
@@ -174,49 +174,55 @@ static void check_symbol_range(const char *sym, unsigned long long addr,
174
174
}
175
175
}
176
176
177
- static int read_symbol (FILE * in , struct sym_entry * s )
177
+ static struct sym_entry * read_symbol (FILE * in )
178
178
{
179
179
char name [500 ], type ;
180
+ unsigned long long addr ;
181
+ unsigned int len ;
182
+ struct sym_entry * sym ;
180
183
int rc ;
181
184
182
- rc = fscanf (in , "%llx %c %499s\n" , & s -> addr , & type , name );
185
+ rc = fscanf (in , "%llx %c %499s\n" , & addr , & type , name );
183
186
if (rc != 3 ) {
184
187
if (rc != EOF && fgets (name , 500 , in ) == NULL )
185
188
fprintf (stderr , "Read error or end of file.\n" );
186
- return -1 ;
189
+ return NULL ;
187
190
}
188
191
if (strlen (name ) >= KSYM_NAME_LEN ) {
189
192
fprintf (stderr , "Symbol %s too long for kallsyms (%zu >= %d).\n"
190
193
"Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n" ,
191
194
name , strlen (name ), KSYM_NAME_LEN );
192
- return -1 ;
195
+ return NULL ;
193
196
}
194
197
195
198
if (is_ignored_symbol (name , type ))
196
- return -1 ;
199
+ return NULL ;
197
200
198
201
/* Ignore most absolute/undefined (?) symbols. */
199
202
if (strcmp (name , "_text" ) == 0 )
200
- _text = s -> addr ;
203
+ _text = addr ;
201
204
202
- check_symbol_range (name , s -> addr , text_ranges , ARRAY_SIZE (text_ranges ));
203
- check_symbol_range (name , s -> addr , & percpu_range , 1 );
205
+ check_symbol_range (name , addr , text_ranges , ARRAY_SIZE (text_ranges ));
206
+ check_symbol_range (name , addr , & percpu_range , 1 );
204
207
205
208
/* include the type field in the symbol name, so that it gets
206
209
* compressed together */
207
- s -> len = strlen (name ) + 1 ;
208
- s -> sym = malloc (s -> len + 1 );
209
- if (!s -> sym ) {
210
+
211
+ len = strlen (name ) + 1 ;
212
+
213
+ sym = malloc (sizeof (* sym ) + len );
214
+ if (!sym ) {
210
215
fprintf (stderr , "kallsyms failure: "
211
216
"unable to allocate required amount of memory\n" );
212
217
exit (EXIT_FAILURE );
213
218
}
214
- strcpy (sym_name (s ), name );
215
- s -> sym [0 ] = type ;
216
-
217
- s -> percpu_absolute = 0 ;
219
+ sym -> addr = addr ;
220
+ sym -> len = len ;
221
+ sym -> sym [0 ] = type ;
222
+ memcpy (sym_name (sym ), name , len );
223
+ sym -> percpu_absolute = 0 ;
218
224
219
- return 0 ;
225
+ return sym ;
220
226
}
221
227
222
228
static int symbol_in_range (const struct sym_entry * s ,
@@ -268,12 +274,12 @@ static void shrink_table(void)
268
274
269
275
pos = 0 ;
270
276
for (i = 0 ; i < table_cnt ; i ++ ) {
271
- if (symbol_valid (& table [i ])) {
277
+ if (symbol_valid (table [i ])) {
272
278
if (pos != i )
273
279
table [pos ] = table [i ];
274
280
pos ++ ;
275
281
} else {
276
- free (table [i ]. sym );
282
+ free (table [i ]);
277
283
}
278
284
}
279
285
table_cnt = pos ;
@@ -287,7 +293,15 @@ static void shrink_table(void)
287
293
288
294
static void read_map (FILE * in )
289
295
{
296
+ struct sym_entry * sym ;
297
+
290
298
while (!feof (in )) {
299
+ sym = read_symbol (in );
300
+ if (!sym )
301
+ continue ;
302
+
303
+ sym -> start_pos = table_cnt ;
304
+
291
305
if (table_cnt >= table_size ) {
292
306
table_size += 10000 ;
293
307
table = realloc (table , sizeof (* table ) * table_size );
@@ -296,10 +310,8 @@ static void read_map(FILE *in)
296
310
exit (1 );
297
311
}
298
312
}
299
- if (read_symbol (in , & table [table_cnt ]) == 0 ) {
300
- table [table_cnt ].start_pos = table_cnt ;
301
- table_cnt ++ ;
302
- }
313
+
314
+ table [table_cnt ++ ] = sym ;
303
315
}
304
316
}
305
317
@@ -387,27 +399,27 @@ static void write_src(void)
387
399
int overflow ;
388
400
389
401
if (!absolute_percpu ) {
390
- offset = table [i ]. addr - relative_base ;
402
+ offset = table [i ]-> addr - relative_base ;
391
403
overflow = (offset < 0 || offset > UINT_MAX );
392
- } else if (symbol_absolute (& table [i ])) {
393
- offset = table [i ]. addr ;
404
+ } else if (symbol_absolute (table [i ])) {
405
+ offset = table [i ]-> addr ;
394
406
overflow = (offset < 0 || offset > INT_MAX );
395
407
} else {
396
- offset = relative_base - table [i ]. addr - 1 ;
408
+ offset = relative_base - table [i ]-> addr - 1 ;
397
409
overflow = (offset < INT_MIN || offset >= 0 );
398
410
}
399
411
if (overflow ) {
400
412
fprintf (stderr , "kallsyms failure: "
401
413
"%s symbol value %#llx out of range in relative mode\n" ,
402
- symbol_absolute (& table [i ]) ? "absolute" : "relative" ,
403
- table [i ]. addr );
414
+ symbol_absolute (table [i ]) ? "absolute" : "relative" ,
415
+ table [i ]-> addr );
404
416
exit (EXIT_FAILURE );
405
417
}
406
418
printf ("\t.long\t%#x\n" , (int )offset );
407
- } else if (!symbol_absolute (& table [i ])) {
408
- output_address (table [i ]. addr );
419
+ } else if (!symbol_absolute (table [i ])) {
420
+ output_address (table [i ]-> addr );
409
421
} else {
410
- printf ("\tPTR\t%#llx\n" , table [i ]. addr );
422
+ printf ("\tPTR\t%#llx\n" , table [i ]-> addr );
411
423
}
412
424
}
413
425
printf ("\n" );
@@ -437,12 +449,12 @@ static void write_src(void)
437
449
if ((i & 0xFF ) == 0 )
438
450
markers [i >> 8 ] = off ;
439
451
440
- printf ("\t.byte 0x%02x" , table [i ]. len );
441
- for (k = 0 ; k < table [i ]. len ; k ++ )
442
- printf (", 0x%02x" , table [i ]. sym [k ]);
452
+ printf ("\t.byte 0x%02x" , table [i ]-> len );
453
+ for (k = 0 ; k < table [i ]-> len ; k ++ )
454
+ printf (", 0x%02x" , table [i ]-> sym [k ]);
443
455
printf ("\n" );
444
456
445
- off += table [i ]. len + 1 ;
457
+ off += table [i ]-> len + 1 ;
446
458
}
447
459
printf ("\n" );
448
460
@@ -496,7 +508,7 @@ static void build_initial_tok_table(void)
496
508
unsigned int i ;
497
509
498
510
for (i = 0 ; i < table_cnt ; i ++ )
499
- learn_symbol (table [i ]. sym , table [i ]. len );
511
+ learn_symbol (table [i ]-> sym , table [i ]-> len );
500
512
}
501
513
502
514
static unsigned char * find_token (unsigned char * str , int len ,
@@ -520,15 +532,15 @@ static void compress_symbols(const unsigned char *str, int idx)
520
532
521
533
for (i = 0 ; i < table_cnt ; i ++ ) {
522
534
523
- len = table [i ]. len ;
524
- p1 = table [i ]. sym ;
535
+ len = table [i ]-> len ;
536
+ p1 = table [i ]-> sym ;
525
537
526
538
/* find the token on the symbol */
527
539
p2 = find_token (p1 , len , str );
528
540
if (!p2 ) continue ;
529
541
530
542
/* decrease the counts for this symbol's tokens */
531
- forget_symbol (table [i ]. sym , len );
543
+ forget_symbol (table [i ]-> sym , len );
532
544
533
545
size = len ;
534
546
@@ -547,10 +559,10 @@ static void compress_symbols(const unsigned char *str, int idx)
547
559
548
560
} while (p2 );
549
561
550
- table [i ]. len = len ;
562
+ table [i ]-> len = len ;
551
563
552
564
/* increase the counts for this symbol's new tokens */
553
- learn_symbol (table [i ]. sym , len );
565
+ learn_symbol (table [i ]-> sym , len );
554
566
}
555
567
}
556
568
@@ -606,8 +618,8 @@ static void insert_real_symbols_in_table(void)
606
618
unsigned int i , j , c ;
607
619
608
620
for (i = 0 ; i < table_cnt ; i ++ ) {
609
- for (j = 0 ; j < table [i ]. len ; j ++ ) {
610
- c = table [i ]. sym [j ];
621
+ for (j = 0 ; j < table [i ]-> len ; j ++ ) {
622
+ c = table [i ]-> sym [j ];
611
623
best_table [c ][0 ]= c ;
612
624
best_table_len [c ]= 1 ;
613
625
}
@@ -660,13 +672,10 @@ static int may_be_linker_script_provide_symbol(const struct sym_entry *se)
660
672
661
673
static int compare_symbols (const void * a , const void * b )
662
674
{
663
- const struct sym_entry * sa ;
664
- const struct sym_entry * sb ;
675
+ const struct sym_entry * sa = * ( const struct sym_entry * * ) a ;
676
+ const struct sym_entry * sb = * ( const struct sym_entry * * ) b ;
665
677
int wa , wb ;
666
678
667
- sa = a ;
668
- sb = b ;
669
-
670
679
/* sort by address first */
671
680
if (sa -> addr > sb -> addr )
672
681
return 1 ;
@@ -697,22 +706,22 @@ static int compare_symbols(const void *a, const void *b)
697
706
698
707
static void sort_symbols (void )
699
708
{
700
- qsort (table , table_cnt , sizeof (struct sym_entry ), compare_symbols );
709
+ qsort (table , table_cnt , sizeof (table [ 0 ] ), compare_symbols );
701
710
}
702
711
703
712
static void make_percpus_absolute (void )
704
713
{
705
714
unsigned int i ;
706
715
707
716
for (i = 0 ; i < table_cnt ; i ++ )
708
- if (symbol_in_range (& table [i ], & percpu_range , 1 )) {
717
+ if (symbol_in_range (table [i ], & percpu_range , 1 )) {
709
718
/*
710
719
* Keep the 'A' override for percpu symbols to
711
720
* ensure consistent behavior compared to older
712
721
* versions of this tool.
713
722
*/
714
- table [i ]. sym [0 ] = 'A' ;
715
- table [i ]. percpu_absolute = 1 ;
723
+ table [i ]-> sym [0 ] = 'A' ;
724
+ table [i ]-> percpu_absolute = 1 ;
716
725
}
717
726
}
718
727
@@ -722,12 +731,12 @@ static void record_relative_base(void)
722
731
unsigned int i ;
723
732
724
733
for (i = 0 ; i < table_cnt ; i ++ )
725
- if (!symbol_absolute (& table [i ])) {
734
+ if (!symbol_absolute (table [i ])) {
726
735
/*
727
736
* The table is sorted by address.
728
737
* Take the first non-absolute symbol value.
729
738
*/
730
- relative_base = table [i ]. addr ;
739
+ relative_base = table [i ]-> addr ;
731
740
return ;
732
741
}
733
742
}
0 commit comments