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