@@ -63,11 +63,35 @@ static int build_id_cache__kcore_dir(char *dir, size_t sz)
63
63
return 0 ;
64
64
}
65
65
66
+ static bool same_kallsyms_reloc (const char * from_dir , char * to_dir )
67
+ {
68
+ char from [PATH_MAX ];
69
+ char to [PATH_MAX ];
70
+ const char * name ;
71
+ u64 addr1 = 0 , addr2 = 0 ;
72
+ int i ;
73
+
74
+ scnprintf (from , sizeof (from ), "%s/kallsyms" , from_dir );
75
+ scnprintf (to , sizeof (to ), "%s/kallsyms" , to_dir );
76
+
77
+ for (i = 0 ; (name = ref_reloc_sym_names [i ]) != NULL ; i ++ ) {
78
+ addr1 = kallsyms__get_function_start (from , name );
79
+ if (addr1 )
80
+ break ;
81
+ }
82
+
83
+ if (name )
84
+ addr2 = kallsyms__get_function_start (to , name );
85
+
86
+ return addr1 == addr2 ;
87
+ }
88
+
66
89
static int build_id_cache__kcore_existing (const char * from_dir , char * to_dir ,
67
90
size_t to_dir_sz )
68
91
{
69
92
char from [PATH_MAX ];
70
93
char to [PATH_MAX ];
94
+ char to_subdir [PATH_MAX ];
71
95
struct dirent * dent ;
72
96
int ret = -1 ;
73
97
DIR * d ;
@@ -86,10 +110,11 @@ static int build_id_cache__kcore_existing(const char *from_dir, char *to_dir,
86
110
continue ;
87
111
scnprintf (to , sizeof (to ), "%s/%s/modules" , to_dir ,
88
112
dent -> d_name );
89
- if (!compare_proc_modules (from , to )) {
90
- scnprintf (to , sizeof (to ), "%s/%s" , to_dir ,
91
- dent -> d_name );
92
- strlcpy (to_dir , to , to_dir_sz );
113
+ scnprintf (to_subdir , sizeof (to_subdir ), "%s/%s" ,
114
+ to_dir , dent -> d_name );
115
+ if (!compare_proc_modules (from , to ) &&
116
+ same_kallsyms_reloc (from_dir , to_subdir )) {
117
+ strlcpy (to_dir , to_subdir , to_dir_sz );
93
118
ret = 0 ;
94
119
break ;
95
120
}
0 commit comments