1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include "symbol/kallsyms.h" |
3 | #include "api/io.h" |
4 | #include <stdio.h> |
5 | #include <sys/stat.h> |
6 | #include <fcntl.h> |
7 | |
8 | u8 kallsyms2elf_type(char type) |
9 | { |
10 | type = tolower(type); |
11 | return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT; |
12 | } |
13 | |
14 | bool kallsyms__is_function(char symbol_type) |
15 | { |
16 | symbol_type = toupper(symbol_type); |
17 | return symbol_type == 'T' || symbol_type == 'W'; |
18 | } |
19 | |
20 | static void read_to_eol(struct io *io) |
21 | { |
22 | int ch; |
23 | |
24 | for (;;) { |
25 | ch = io__get_char(io); |
26 | if (ch < 0 || ch == '\n') |
27 | return; |
28 | } |
29 | } |
30 | |
31 | int kallsyms__parse(const char *filename, void *arg, |
32 | int (*process_symbol)(void *arg, const char *name, |
33 | char type, u64 start)) |
34 | { |
35 | struct io io; |
36 | char bf[BUFSIZ]; |
37 | int err; |
38 | |
39 | io.fd = open(filename, O_RDONLY, 0); |
40 | |
41 | if (io.fd < 0) |
42 | return -1; |
43 | |
44 | io__init(&io, io.fd, bf, sizeof(bf)); |
45 | |
46 | err = 0; |
47 | while (!io.eof) { |
48 | __u64 start; |
49 | int ch; |
50 | size_t i; |
51 | char symbol_type; |
52 | char symbol_name[KSYM_NAME_LEN + 1]; |
53 | |
54 | if (io__get_hex(&io, &start) != ' ') { |
55 | read_to_eol(io: &io); |
56 | continue; |
57 | } |
58 | symbol_type = io__get_char(&io); |
59 | if (io__get_char(&io) != ' ') { |
60 | read_to_eol(io: &io); |
61 | continue; |
62 | } |
63 | for (i = 0; i < sizeof(symbol_name); i++) { |
64 | ch = io__get_char(&io); |
65 | if (ch < 0 || ch == '\n') |
66 | break; |
67 | symbol_name[i] = ch; |
68 | } |
69 | symbol_name[i] = '\0'; |
70 | |
71 | err = process_symbol(arg, symbol_name, symbol_type, start); |
72 | if (err) |
73 | break; |
74 | } |
75 | |
76 | close(io.fd); |
77 | return err; |
78 | } |
79 | |