diff options
Diffstat (limited to 'tools/lib/symbol')
| -rw-r--r-- | tools/lib/symbol/kallsyms.c | 58 | ||||
| -rw-r--r-- | tools/lib/symbol/kallsyms.h | 24 | 
2 files changed, 82 insertions, 0 deletions
diff --git a/tools/lib/symbol/kallsyms.c b/tools/lib/symbol/kallsyms.c new file mode 100644 index 00000000000..18bc271a4bb --- /dev/null +++ b/tools/lib/symbol/kallsyms.c @@ -0,0 +1,58 @@ +#include "symbol/kallsyms.h" +#include <stdio.h> +#include <stdlib.h> + +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; +} diff --git a/tools/lib/symbol/kallsyms.h b/tools/lib/symbol/kallsyms.h new file mode 100644 index 00000000000..6084f5e18b3 --- /dev/null +++ b/tools/lib/symbol/kallsyms.h @@ -0,0 +1,24 @@ +#ifndef __TOOLS_KALLSYMS_H_ +#define __TOOLS_KALLSYMS_H_ 1 + +#include <elf.h> +#include <linux/ctype.h> +#include <linux/types.h> + +#ifndef KSYM_NAME_LEN +#define KSYM_NAME_LEN 256 +#endif + +static inline u8 kallsyms2elf_type(char type) +{ +	if (type == 'W') +		return STB_WEAK; + +	return isupper(type) ? STB_GLOBAL : STB_LOCAL; +} + +int kallsyms__parse(const char *filename, void *arg, +		    int (*process_symbol)(void *arg, const char *name, +					  char type, u64 start)); + +#endif /* __TOOLS_KALLSYMS_H_ */  | 
