mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.4 KiB
78 lines
1.4 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
#include "symbol/kallsyms.h" |
|
#include "api/io.h" |
|
#include <stdio.h> |
|
#include <sys/stat.h> |
|
#include <fcntl.h> |
|
|
|
u8 kallsyms2elf_type(char type) |
|
{ |
|
type = tolower(type); |
|
return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT; |
|
} |
|
|
|
bool kallsyms__is_function(char symbol_type) |
|
{ |
|
symbol_type = toupper(symbol_type); |
|
return symbol_type == 'T' || symbol_type == 'W'; |
|
} |
|
|
|
static void read_to_eol(struct io *io) |
|
{ |
|
int ch; |
|
|
|
for (;;) { |
|
ch = io__get_char(io); |
|
if (ch < 0 || ch == '\n') |
|
return; |
|
} |
|
} |
|
|
|
int kallsyms__parse(const char *filename, void *arg, |
|
int (*process_symbol)(void *arg, const char *name, |
|
char type, u64 start)) |
|
{ |
|
struct io io; |
|
char bf[BUFSIZ]; |
|
int err; |
|
|
|
io.fd = open(filename, O_RDONLY, 0); |
|
|
|
if (io.fd < 0) |
|
return -1; |
|
|
|
io__init(&io, io.fd, bf, sizeof(bf)); |
|
|
|
err = 0; |
|
while (!io.eof) { |
|
__u64 start; |
|
int ch; |
|
size_t i; |
|
char symbol_type; |
|
char symbol_name[KSYM_NAME_LEN + 1]; |
|
|
|
if (io__get_hex(&io, &start) != ' ') { |
|
read_to_eol(&io); |
|
continue; |
|
} |
|
symbol_type = io__get_char(&io); |
|
if (io__get_char(&io) != ' ') { |
|
read_to_eol(&io); |
|
continue; |
|
} |
|
for (i = 0; i < sizeof(symbol_name); i++) { |
|
ch = io__get_char(&io); |
|
if (ch < 0 || ch == '\n') |
|
break; |
|
symbol_name[i] = ch; |
|
} |
|
symbol_name[i] = '\0'; |
|
|
|
err = process_symbol(arg, symbol_name, symbol_type, start); |
|
if (err) |
|
break; |
|
} |
|
|
|
close(io.fd); |
|
return err; |
|
}
|
|
|