1 #include "symbol/kallsyms.h" 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int kallsyms__parse(const char *filename, void *arg, 6 int (*process_symbol)(void *arg, const char *name, 7 char type, u64 start)) 8 { 9 char *line = NULL; 10 size_t n; 11 int err = -1; 12 FILE *file = fopen(filename, "r"); 13 14 if (file == NULL) 15 goto out_failure; 16 17 err = 0; 18 19 while (!feof(file)) { 20 u64 start; 21 int line_len, len; 22 char symbol_type; 23 char *symbol_name; 24 25 line_len = getline(&line, &n, file); 26 if (line_len < 0 || !line) 27 break; 28 29 line[--line_len] = '\0'; /* \n */ 30 31 len = hex2u64(line, &start); 32 33 len++; 34 if (len + 2 >= line_len) 35 continue; 36 37 symbol_type = line[len]; 38 len += 2; 39 symbol_name = line + len; 40 len = line_len - len; 41 42 if (len >= KSYM_NAME_LEN) { 43 err = -1; 44 break; 45 } 46 47 err = process_symbol(arg, symbol_name, symbol_type, start); 48 if (err) 49 break; 50 } 51 52 free(line); 53 fclose(file); 54 return err; 55 56 out_failure: 57 return -1; 58 } 59