diff options
Diffstat (limited to 'tools/objinfo_helper.c')
-rw-r--r-- | tools/objinfo_helper.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/tools/objinfo_helper.c b/tools/objinfo_helper.c new file mode 100644 index 000000000..464720c29 --- /dev/null +++ b/tools/objinfo_helper.c @@ -0,0 +1,92 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Mehdi Dogguy, PPS laboratory, University Paris Diderot */ +/* */ +/* Copyright 2010 Mehdi Dogguy. Used and distributed as part of */ +/* Objective Caml by permission from the author. This file is */ +/* distributed under the terms of the Q Public License version 1.0. */ +/***********************************************************************/ + +#include "../config/s.h" +#include "../byterun/mlvalues.h" +#include "../byterun/alloc.h" +#include <stdio.h> + +#ifdef HAS_LIBBFD +#include <stdlib.h> +#include <string.h> +#include <bfd.h> + +int main(int argc, char ** argv) +{ + bfd *fd; + asection *sec; + file_ptr offset; + long st_size; + asymbol ** symbol_table; + long sym_count, i; + + if (argc != 2) { + fprintf(stderr, "Usage: objinfo_helper <dynamic library>\n"); + return 2; + } + + fd = bfd_openr(argv[1], "default"); + if (!fd) { + fprintf(stderr, "Error opening file %s\n", argv[1]); + return 2; + } + if (! bfd_check_format (fd, bfd_object)) { + fprintf(stderr, "Error: wrong format\n"); + bfd_close(fd); + return 2; + } + + sec = bfd_get_section_by_name(fd, ".data"); + if (! sec) { + fprintf(stderr, "Error: section .data not found\n"); + bfd_close(fd); + return 2; + } + + offset = sec->filepos; + st_size = bfd_get_dynamic_symtab_upper_bound (fd); + if (st_size <= 0) { + fprintf(stderr, "Error: size of section .data unknown\n"); + bfd_close(fd); + return 2; + } + + symbol_table = malloc(st_size); + if (! symbol_table) { + fprintf(stderr, "Error: out of memory\n"); + bfd_close(fd); + return 2; + } + + sym_count = bfd_canonicalize_dynamic_symtab (fd, symbol_table); + + for (i = 0; i < sym_count; i++) { + if (strcmp(symbol_table[i]->name, "caml_plugin_header") == 0) { + printf("%ld\n", (long) (offset + symbol_table[i]->value)); + bfd_close(fd); + return 0; + } + } + + fprintf(stderr, "Error: missing symbol caml_plugin_header\n"); + bfd_close(fd); + return 2; +} + +#else + +int main(int argc, char ** argv) +{ + fprintf(stderr, "BFD library unavailable, cannot print info on .cmxs files\n"); + return 2; +} + +#endif |