@@ -141,37 +141,8 @@ bool ProcessKernelSymbols(const std::string& symbol_file,
141
141
return false ;
142
142
}
143
143
144
- static bool FindStartOfKernelSymbolCallback (const KernelSymbol& symbol, uint64_t * start_addr) {
145
- if (symbol.module == nullptr ) {
146
- *start_addr = symbol.addr ;
147
- return true ;
148
- }
149
- return false ;
150
- }
151
-
152
- static bool FindStartOfKernelSymbol (const std::string& symbol_file, uint64_t * start_addr) {
153
- return ProcessKernelSymbols (
154
- symbol_file, std::bind (&FindStartOfKernelSymbolCallback, std::placeholders::_1, start_addr));
155
- }
156
-
157
- static bool FindKernelFunctionSymbolCallback (const KernelSymbol& symbol, const std::string& name,
158
- uint64_t * addr) {
159
- if ((symbol.type == ' T' || symbol.type == ' W' || symbol.type == ' A' ) &&
160
- symbol.module == nullptr && name == symbol.name ) {
161
- *addr = symbol.addr ;
162
- return true ;
163
- }
164
- return false ;
165
- }
166
-
167
- static bool FindKernelFunctionSymbol (const std::string& symbol_file, const std::string& name,
168
- uint64_t * addr) {
169
- return ProcessKernelSymbols (
170
- symbol_file, std::bind (&FindKernelFunctionSymbolCallback, std::placeholders::_1, name, addr));
171
- }
172
-
173
- std::vector<ModuleMmap> GetLoadedModules () {
174
- std::vector<ModuleMmap> result;
144
+ static std::vector<KernelMmap> GetLoadedModules () {
145
+ std::vector<KernelMmap> result;
175
146
FILE* fp = fopen (" /proc/modules" , " re" );
176
147
if (fp == nullptr ) {
177
148
// There is no /proc/modules on Android devices, so we don't print error if failed to open it.
@@ -185,7 +156,7 @@ std::vector<ModuleMmap> GetLoadedModules() {
185
156
char name[reader.MaxLineSize ()];
186
157
uint64_t addr;
187
158
if (sscanf (line, " %s%*lu%*u%*s%*s 0x%" PRIx64, name, &addr) == 2 ) {
188
- ModuleMmap map;
159
+ KernelMmap map;
189
160
map.name = name;
190
161
map.start_addr = addr;
191
162
result.push_back (map);
@@ -223,9 +194,9 @@ static void GetAllModuleFiles(const std::string& path,
223
194
}
224
195
}
225
196
226
- static std::vector<ModuleMmap > GetModulesInUse () {
197
+ static std::vector<KernelMmap > GetModulesInUse () {
227
198
// TODO: There is no /proc/modules or /lib/modules on Android, find methods work on it.
228
- std::vector<ModuleMmap > module_mmaps = GetLoadedModules ();
199
+ std::vector<KernelMmap > module_mmaps = GetLoadedModules ();
229
200
std::string linux_version = GetLinuxVersion ();
230
201
std::string module_dirpath = " /lib/modules/" + linux_version + " /kernel" ;
231
202
std::unordered_map<std::string, std::string> module_file_map;
@@ -239,24 +210,23 @@ static std::vector<ModuleMmap> GetModulesInUse() {
239
210
return module_mmaps;
240
211
}
241
212
242
- bool GetKernelAndModuleMmaps (KernelMmap* kernel_mmap, std::vector<ModuleMmap>* module_mmaps) {
243
- if (!FindStartOfKernelSymbol (" /proc/kallsyms" , &kernel_mmap->start_addr )) {
244
- LOG (DEBUG) << " call FindStartOfKernelSymbol() failed" ;
245
- return false ;
246
- }
247
- if (!FindKernelFunctionSymbol (" /proc/kallsyms" , " _text" , &kernel_mmap->pgoff )) {
248
- LOG (DEBUG) << " call FindKernelFunctionSymbol() failed" ;
249
- return false ;
250
- }
213
+ void GetKernelAndModuleMmaps (KernelMmap* kernel_mmap, std::vector<KernelMmap>* module_mmaps) {
251
214
kernel_mmap->name = DEFAULT_KERNEL_MMAP_NAME;
215
+ kernel_mmap->start_addr = 0 ;
216
+ kernel_mmap->filepath = kernel_mmap->name ;
252
217
*module_mmaps = GetModulesInUse ();
218
+ for (auto & map : *module_mmaps) {
219
+ if (map.filepath .empty ()) {
220
+ map.filepath = " [" + map.name + " ]" ;
221
+ }
222
+ }
223
+
253
224
if (module_mmaps->size () == 0 ) {
254
225
kernel_mmap->len = std::numeric_limits<unsigned long long >::max () - kernel_mmap->start_addr ;
255
226
} else {
256
227
std::sort (
257
228
module_mmaps->begin (), module_mmaps->end (),
258
- [](const ModuleMmap& m1, const ModuleMmap& m2) { return m1.start_addr < m2.start_addr ; });
259
- CHECK_LE (kernel_mmap->start_addr , (*module_mmaps)[0 ].start_addr );
229
+ [](const KernelMmap& m1, const KernelMmap& m2) { return m1.start_addr < m2.start_addr ; });
260
230
// When not having enough privilege, all addresses are read as 0.
261
231
if (kernel_mmap->start_addr == (*module_mmaps)[0 ].start_addr ) {
262
232
kernel_mmap->len = 0 ;
@@ -274,7 +244,6 @@ bool GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<ModuleMmap>* m
274
244
module_mmaps->back ().len =
275
245
std::numeric_limits<unsigned long long >::max () - module_mmaps->back ().start_addr ;
276
246
}
277
- return true ;
278
247
}
279
248
280
249
static bool ReadThreadNameAndTgid (const std::string& status_file, std::string* comm, pid_t * tgid) {
0 commit comments