linux/tools/lib/symbol/kallsyms.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include "symbol/kallsyms.h"
   3#include "api/io.h"
   4#include <stdio.h>
   5#include <sys/stat.h>
   6#include <fcntl.h>
   7
   8u8 kallsyms2elf_type(char type)
   9{
  10        type = tolower(type);
  11        return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
  12}
  13
  14bool kallsyms__is_function(char symbol_type)
  15{
  16        symbol_type = toupper(symbol_type);
  17        return symbol_type == 'T' || symbol_type == 'W';
  18}
  19
  20static void read_to_eol(struct io *io)
  21{
  22        int ch;
  23
  24        for (;;) {
  25                ch = io__get_char(io);
  26                if (ch < 0 || ch == '\n')
  27                        return;
  28        }
  29}
  30
  31int kallsyms__parse(const char *filename, void *arg,
  32                    int (*process_symbol)(void *arg, const char *name,
  33                                          char type, u64 start))
  34{
  35        struct io io;
  36        char bf[BUFSIZ];
  37        int err;
  38
  39        io.fd = open(filename, O_RDONLY, 0);
  40
  41        if (io.fd < 0)
  42                return -1;
  43
  44        io__init(&io, io.fd, bf, sizeof(bf));
  45
  46        err = 0;
  47        while (!io.eof) {
  48                __u64 start;
  49                int ch;
  50                size_t i;
  51                char symbol_type;
  52                char symbol_name[KSYM_NAME_LEN + 1];
  53
  54                if (io__get_hex(&io, &start) != ' ') {
  55                        read_to_eol(&io);
  56                        continue;
  57                }
  58                symbol_type = io__get_char(&io);
  59                if (io__get_char(&io) != ' ') {
  60                        read_to_eol(&io);
  61                        continue;
  62                }
  63                for (i = 0; i < sizeof(symbol_name); i++) {
  64                        ch = io__get_char(&io);
  65                        if (ch < 0 || ch == '\n')
  66                                break;
  67                        symbol_name[i]  = ch;
  68                }
  69                symbol_name[i]  = '\0';
  70
  71                err = process_symbol(arg, symbol_name, symbol_type, start);
  72                if (err)
  73                        break;
  74        }
  75
  76        close(io.fd);
  77        return err;
  78}
  79