diff -r 000000000000 -r 6474c204b198 tools/reorder/mapaddrs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/reorder/mapaddrs.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,97 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + + A program that reverse-maps a binary stream of address references to + function names. + + */ + +#include +#include +#include +#include + +#include "elf_symbol_table.h" + +#define _GNU_SOURCE +#include + +static int +map_addrs(int fd, elf_symbol_table &table) +{ + // Read the binary addresses from stdin. + unsigned int buf[128]; + ssize_t cb; + + while ((cb = read(fd, buf, sizeof buf)) > 0) { + if (cb % sizeof buf[0]) + fprintf(stderr, "unaligned read\n"); + + unsigned int *addr = buf; + unsigned int *limit = buf + (cb / 4); + + for (; addr < limit; ++addr) { + const Elf32_Sym *sym = table.lookup(*addr); + if (sym) + cout << table.get_symbol_name(sym) << endl; + } + } + + return 0; +} + +static struct option long_options[] = { + { "exe", required_argument, 0, 'e' }, + { 0, 0, 0, 0 } +}; + +static void +usage() +{ + cerr << "usage: mapaddrs --exe=exe file ..." << endl; +} + +int +main(int argc, char *argv[]) +{ + elf_symbol_table table; + + while (1) { + int option_index = 0; + int c = getopt_long(argc, argv, "e:", long_options, &option_index); + + if (c < 0) + break; + + switch (c) { + case 'e': + table.init(optarg); + break; + + default: + usage(); + return 1; + } + } + + if (optind >= argc) { + map_addrs(STDIN_FILENO, table); + } + else { + do { + int fd = open(argv[optind], O_RDONLY); + if (fd < 0) { + perror(argv[optind]); + return 1; + } + + map_addrs(fd, table); + close(fd); + } while (++optind < argc); + } + + return 0; +}