1/* Copyright 2013-2020 Free Software Foundation, Inc. 2 This program is free software; you can redistribute it and/or modify 3 it under the terms of the GNU General Public License as published by 4 the Free Software Foundation; either version 3 of the License, or 5 (at your option) any later version. 6 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 GNU General Public License for more details. 11 12 You should have received a copy of the GNU General Public License 13 along with this program. If not, see <http://www.gnu.org/licenses/>. 14*/ 15 16#include <stdlib.h> 17#include <stdio.h> 18 19#include "sym-file-loader.h" 20 21void 22gdb_add_symbol_file (void *addr, const char *file) 23{ 24 return; 25} 26 27void 28gdb_remove_symbol_file (void *addr) 29{ 30 return; 31} 32 33/* Load a shared library without relying on the standard 34 loader to test GDB's commands for adding and removing 35 symbol files at runtime. */ 36 37int 38main (int argc, const char *argv[]) 39{ 40 const char *file = SHLIB_NAME; 41 struct library *lib; 42 char *text_addr = NULL; 43 int (*pbar) () = NULL; 44 int (*pfoo) (int) = NULL; 45 int (*pbaz) () = NULL; 46 int i; 47 48 lib = load_shlib (file); 49 if (lib == NULL) 50 return 1; 51 52 if (get_text_addr (lib, (void **) &text_addr) != 0) 53 return 1; 54 55 gdb_add_symbol_file (text_addr, file); 56 57 /* Call bar from SHLIB_NAME. */ 58 if (lookup_function (lib, "bar", (void *) &pbar) != 0) 59 return 1; 60 61 (*pbar) (); 62 63 /* Call foo from SHLIB_NAME. */ 64 if (lookup_function (lib, "foo", (void *) &pfoo) != 0) 65 return 1; 66 67 (*pfoo) (2); 68 69 /* Unload the library, invalidating all memory breakpoints. */ 70 unload_shlib (lib); 71 72 /* Notify GDB to remove the symbol file. Also check that GDB 73 doesn't complain that it can't remove breakpoints from the 74 unmapped library. */ 75 gdb_remove_symbol_file (text_addr); 76 77 /* Reload the library. */ 78 lib = load_shlib (file); /* reload lib here */ 79 if (lib == NULL) 80 return 1; 81 82 if (get_text_addr (lib, (void **) &text_addr) != 0) 83 return 1; 84 85 gdb_add_symbol_file (text_addr, file); 86 87 if (lookup_function (lib, "baz", (void *) &pbaz) != 0) 88 return 1; 89 90 (*pbaz) (); 91 92 return 0; /* end here */ 93} 94