blob: 5e431077fcd6784ac9567a785bc6fb90a40bc7bb [file] [log] [blame]
Arnaldo Carvalho de Meloc506c962013-12-11 09:15:00 -03001#include "symbol/kallsyms.h"
2#include <stdio.h>
3#include <stdlib.h>
4
Arnaldo Carvalho de Melof8450862015-09-30 13:02:08 -03005u8 kallsyms2elf_type(char type)
6{
7 type = tolower(type);
8 return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
9}
10
Arnaldo Carvalho de Meloc506c962013-12-11 09:15:00 -030011int 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
62out_failure:
63 return -1;
64}