79 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include "symbol/kallsyms.h"
 | |
| #include "api/io.h"
 | |
| #include <stdio.h>
 | |
| #include <sys/stat.h>
 | |
| #include <fcntl.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';
 | |
| }
 | |
| 
 | |
| static void read_to_eol(struct io *io)
 | |
| {
 | |
| 	int ch;
 | |
| 
 | |
| 	for (;;) {
 | |
| 		ch = io__get_char(io);
 | |
| 		if (ch < 0 || ch == '\n')
 | |
| 			return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int kallsyms__parse(const char *filename, void *arg,
 | |
| 		    int (*process_symbol)(void *arg, const char *name,
 | |
| 					  char type, u64 start))
 | |
| {
 | |
| 	struct io io;
 | |
| 	char bf[BUFSIZ];
 | |
| 	int err;
 | |
| 
 | |
| 	io.fd = open(filename, O_RDONLY, 0);
 | |
| 
 | |
| 	if (io.fd < 0)
 | |
| 		return -1;
 | |
| 
 | |
| 	io__init(&io, io.fd, bf, sizeof(bf));
 | |
| 
 | |
| 	err = 0;
 | |
| 	while (!io.eof) {
 | |
| 		__u64 start;
 | |
| 		int ch;
 | |
| 		size_t i;
 | |
| 		char symbol_type;
 | |
| 		char symbol_name[KSYM_NAME_LEN + 1];
 | |
| 
 | |
| 		if (io__get_hex(&io, &start) != ' ') {
 | |
| 			read_to_eol(&io);
 | |
| 			continue;
 | |
| 		}
 | |
| 		symbol_type = io__get_char(&io);
 | |
| 		if (io__get_char(&io) != ' ') {
 | |
| 			read_to_eol(&io);
 | |
| 			continue;
 | |
| 		}
 | |
| 		for (i = 0; i < sizeof(symbol_name); i++) {
 | |
| 			ch = io__get_char(&io);
 | |
| 			if (ch < 0 || ch == '\n')
 | |
| 				break;
 | |
| 			symbol_name[i]  = ch;
 | |
| 		}
 | |
| 		symbol_name[i]  = '\0';
 | |
| 
 | |
| 		err = process_symbol(arg, symbol_name, symbol_type, start);
 | |
| 		if (err)
 | |
| 			break;
 | |
| 	}
 | |
| 
 | |
| 	close(io.fd);
 | |
| 	return err;
 | |
| }
 |