mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
3052ba56bc
We got the sane_ctype.h headers from git and kept using it so far, but since that code originally came from the kernel sources to the git sources, perhaps its better to just use the one in the kernel, so that we can leverage tools/perf/check_headers.sh to be notified when our copy gets out of sync, i.e. when fixes or goodies are added to the code we've copied. This will help with things like tools/lib/string.c where we want to have more things in common with the kernel, such as strim(), skip_spaces(), etc so as to go on removing the things that we have in tools/perf/util/ and instead using the code in the kernel, indirectly and removing things like EXPORT_SYMBOL(), etc, getting notified when fixes and improvements are made to the original code. Hopefully this also should help with reducing the difference of code hosted in tools/ to the one in the kernel proper. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lkml.kernel.org/n/tip-7k9868l713wqtgo01xxygn12@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
89 lines
1.5 KiB
C
89 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#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;
|
|
}
|
|
|
|
bool kallsyms__is_function(char symbol_type)
|
|
{
|
|
symbol_type = toupper(symbol_type);
|
|
return symbol_type == 'T' || symbol_type == 'W';
|
|
}
|
|
|
|
/*
|
|
* While we find nice hex chars, build a long_val.
|
|
* Return number of chars processed.
|
|
*/
|
|
int hex2u64(const char *ptr, u64 *long_val)
|
|
{
|
|
char *p;
|
|
|
|
*long_val = strtoull(ptr, &p, 16);
|
|
|
|
return p - ptr;
|
|
}
|
|
|
|
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);
|
|
|
|
/* Skip the line if we failed to parse the address. */
|
|
if (!len)
|
|
continue;
|
|
|
|
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;
|
|
}
|