mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
tools lib symbol: Start carving out symbol parsing routines from perf
Eventually this should be useful to other tools/ living utilities. For now don't try to build any .a, just trying the minimal approach of separating existing code into multiple .c files that can then be included wherever they are needed, using whatever build machinery already in place. Cc: Adrian Hunter <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: David Ahern <[email protected]> Cc: Frederic Weisbecker <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Mike Galbraith <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lkml.kernel.org/n/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
This commit is contained in:
parent
c7f2e3cd6c
commit
c506c96b61
9 changed files with 93 additions and 71 deletions
58
tools/lib/symbol/kallsyms.c
Normal file
58
tools/lib/symbol/kallsyms.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
24
tools/lib/symbol/kallsyms.h
Normal file
24
tools/lib/symbol/kallsyms.h
Normal file
|
|
@ -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_ */
|
||||
Loading…
Reference in a new issue