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