@@ -445,7 +445,7 @@ static int find_num_syms(kallsym_t *info, char *img, int32_t imglen)
445
445
return 0 ;
446
446
}
447
447
448
- static int find_markers (kallsym_t * info , char * img , int32_t imglen )
448
+ static int find_markers_1 (kallsym_t * info , char * img , int32_t imglen )
449
449
{
450
450
int32_t elem_size = get_markers_elem_size (info );
451
451
int32_t cand = info -> kallsyms_token_table_offset - elem_size ;
@@ -472,6 +472,48 @@ static int find_markers(kallsym_t *info, char *img, int32_t imglen)
472
472
return 0 ;
473
473
}
474
474
475
+ static int find_markers_2 (kallsym_t * info , char * img , int32_t imglen )
476
+ {
477
+ int32_t elem_size = get_markers_elem_size (info );
478
+ int32_t cand = info -> kallsyms_token_table_offset - KSYM_MIN_MARKER * elem_size ;
479
+
480
+ int64_t marker , last_marker = 0x7fffffff ;
481
+ int count = 0 ;
482
+ while (cand > 0x1000 ) {
483
+ marker = int_unpack (img + cand , elem_size , info -> is_be );
484
+ if (last_marker > marker ) {
485
+ count ++ ;
486
+ if (!marker && count > KSYM_MIN_MARKER ) break ;
487
+ } else {
488
+ count = 0 ;
489
+ last_marker = 0x7fffffff ;
490
+ }
491
+
492
+ last_marker = marker ;
493
+ cand -= elem_size ;
494
+ }
495
+
496
+ if (count < KSYM_MIN_MARKER ) {
497
+ tools_logw ("find kallsyms_markers error\n" );
498
+ return -1 ;
499
+ }
500
+
501
+ int32_t marker_end = cand + count * elem_size + elem_size ;
502
+ info -> kallsyms_markers_offset = cand ;
503
+ info -> _marker_num = count ;
504
+
505
+ tools_logi ("kallsyms_markers range: [0x%08x, 0x%08x), count: 0x%08x\n" , cand , marker_end , count );
506
+ return 0 ;
507
+ }
508
+
509
+ static inline int find_markers (kallsym_t * info , char * img , int32_t imglen )
510
+ {
511
+ // todo: remove one
512
+ int rc = find_markers_1 (info , img , imglen );
513
+ if (!rc ) return rc ;
514
+ return find_markers_2 (info , img , imglen );
515
+ }
516
+
475
517
static int decompress_symbol_name (kallsym_t * info , char * img , int32_t * pos_to_next , char * out_type , char * out_symbol )
476
518
{
477
519
int32_t pos = * pos_to_next ;
0 commit comments