xref: /linux/tools/lib/symbol/kallsyms.c (revision f3539c12d8196ce0a1993364d30b3a18908470d1)
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 }
65