]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - tools/lib/symbol/kallsyms.c
Merge branch 'ras-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / tools / lib / symbol / kallsyms.c
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 }