Loading...
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
8u8 kallsyms2elf_type(char type)
9{
10 type = tolower(type);
11 return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
12}
13
14bool kallsyms__is_function(char symbol_type)
15{
16 symbol_type = toupper(symbol_type);
17 return symbol_type == 'T' || symbol_type == 'W';
18}
19
20static 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
31int 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);
56 continue;
57 }
58 symbol_type = io__get_char(&io);
59 if (io__get_char(&io) != ' ') {
60 read_to_eol(&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}
1// SPDX-License-Identifier: GPL-2.0
2#include <ctype.h>
3#include "symbol/kallsyms.h"
4#include <stdio.h>
5#include <stdlib.h>
6
7u8 kallsyms2elf_type(char type)
8{
9 type = tolower(type);
10 return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
11}
12
13int kallsyms__parse(const char *filename, void *arg,
14 int (*process_symbol)(void *arg, const char *name,
15 char type, u64 start))
16{
17 char *line = NULL;
18 size_t n;
19 int err = -1;
20 FILE *file = fopen(filename, "r");
21
22 if (file == NULL)
23 goto out_failure;
24
25 err = 0;
26
27 while (!feof(file)) {
28 u64 start;
29 int line_len, len;
30 char symbol_type;
31 char *symbol_name;
32
33 line_len = getline(&line, &n, file);
34 if (line_len < 0 || !line)
35 break;
36
37 line[--line_len] = '\0'; /* \n */
38
39 len = hex2u64(line, &start);
40
41 /* Skip the line if we failed to parse the address. */
42 if (!len)
43 continue;
44
45 len++;
46 if (len + 2 >= line_len)
47 continue;
48
49 symbol_type = line[len];
50 len += 2;
51 symbol_name = line + len;
52 len = line_len - len;
53
54 if (len >= KSYM_NAME_LEN) {
55 err = -1;
56 break;
57 }
58
59 err = process_symbol(arg, symbol_name, symbol_type, start);
60 if (err)
61 break;
62 }
63
64 free(line);
65 fclose(file);
66 return err;
67
68out_failure:
69 return -1;
70}