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