linux/tools/lib/symbol/kallsyms.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <ctype.h>
   3#include "symbol/kallsyms.h"
   4#include <stdio.h>
   5#include <stdlib.h>
   6
   7u8 kallsyms2elf_type(char type)
   8{
   9        type = tolower(type);
  10        return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
  11}
  12
  13int kallsyms__parse(const char *filename, void *arg,
  14                    int (*process_symbol)(void *arg, const char *name,
  15                                          char type, u64 start))
  16{
  17        char *line = NULL;
  18        size_t n;
  19        int err = -1;
  20        FILE *file = fopen(filename, "r");
  21
  22        if (file == NULL)
  23                goto out_failure;
  24
  25        err = 0;
  26
  27        while (!feof(file)) {
  28                u64 start;
  29                int line_len, len;
  30                char symbol_type;
  31                char *symbol_name;
  32
  33                line_len = getline(&line, &n, file);
  34                if (line_len < 0 || !line)
  35                        break;
  36
  37                line[--line_len] = '\0'; /* \n */
  38
  39                len = hex2u64(line, &start);
  40
  41                /* Skip the line if we failed to parse the address. */
  42                if (!len)
  43                        continue;
  44
  45                len++;
  46                if (len + 2 >= line_len)
  47                        continue;
  48
  49                symbol_type = line[len];
  50                len += 2;
  51                symbol_name = line + len;
  52                len = line_len - len;
  53
  54                if (len >= KSYM_NAME_LEN) {
  55                        err = -1;
  56                        break;
  57                }
  58
  59                err = process_symbol(arg, symbol_name, symbol_type, start);
  60                if (err)
  61                        break;
  62        }
  63
  64        free(line);
  65        fclose(file);
  66        return err;
  67
  68out_failure:
  69        return -1;
  70}
  71