Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/lib/symbol/kallsyms.c
26288 views
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);
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
}
79
80