| #!/bin/bash |
| # |
| # Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| # |
| # SPDX-License-Identifier: BSD-2-Clause |
| # |
| |
| # Auto-generates the kernel_symbols table for accessing kernel symbols. |
| |
| if [ $# -ne 2 ]; then |
| echo "Usage: $0 objdump-command kernel.elf" 1>&2 |
| exit 1 |
| fi |
| |
| cat - <<EOT |
| /* Auto-generated by $0. Do not edit manually. */ |
| |
| /* Include Kconfig variables. */ |
| #include <autoconf.h> |
| #include <sel4test/gen_config.h> |
| |
| #include <string.h> |
| |
| static struct kernel_symbol { |
| char *symbol; |
| void *addr; |
| } kernel_symbols[] = { |
| EOT |
| |
| # Objdump the symbol table and format it nicely for C. |
| "$1" --syms "$2" \ |
| | grep --color=none "^[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f] " \ |
| | sed 's/\([0-9a-f]*\) .* \(.*\)/ { .symbol = "\2", .addr = (void*)0xf\1 },/g' |
| |
| cat - <<EOT |
| { .symbol = NULL, .addr = (void*)NULL }, /* Terminate array. */ |
| }; |
| |
| void * resolve_kernel_symbol(char *symbol) { |
| for (int i = 0; kernel_symbols[i].symbol != NULL ; ++i) { |
| if (!strcmp(kernel_symbols[i].symbol, symbol)) { |
| return kernel_symbols[i].addr; |
| } |
| } |
| return NULL; |
| } |
| EOT |