Commit | Line | Data |
---|---|---|
c506c96b ACM |
1 | #include "symbol/kallsyms.h" |
2 | #include <stdio.h> | |
3 | #include <stdlib.h> | |
4 | ||
f845086a ACM |
5 | u8 kallsyms2elf_type(char type) |
6 | { | |
7 | type = tolower(type); | |
8 | return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT; | |
9 | } | |
10 | ||
c506c96b ACM |
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 | } |