#include "symbol/kallsyms.h" | |
#include <stdio.h> | |
#include <stdlib.h> | |
u8 kallsyms2elf_type(char type) | |
{ | |
type = tolower(type); | |
return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT; | |
} | |
int kallsyms__parse(const char *filename, void *arg, | |
int (*process_symbol)(void *arg, const char *name, | |
char type, u64 start)) | |
{ | |
char *line = NULL; | |
size_t n; | |
int err = -1; | |
FILE *file = fopen(filename, "r"); | |
if (file == NULL) | |
goto out_failure; | |
err = 0; | |
while (!feof(file)) { | |
u64 start; | |
int line_len, len; | |
char symbol_type; | |
char *symbol_name; | |
line_len = getline(&line, &n, file); | |
if (line_len < 0 || !line) | |
break; | |
line[--line_len] = '\0'; /* \n */ | |
len = hex2u64(line, &start); | |
len++; | |
if (len + 2 >= line_len) | |
continue; | |
symbol_type = line[len]; | |
len += 2; | |
symbol_name = line + len; | |
len = line_len - len; | |
if (len >= KSYM_NAME_LEN) { | |
err = -1; | |
break; | |
} | |
err = process_symbol(arg, symbol_name, symbol_type, start); | |
if (err) | |
break; | |
} | |
free(line); | |
fclose(file); | |
return err; | |
out_failure: | |
return -1; | |
} |