+ symbol_file_add_from_memory (templ, addr, 0, NULL, from_tty);
+}
+
+/* Arguments for symbol_file_add_from_memory_wrapper. */
+
+struct symbol_file_add_from_memory_args
+{
+ struct bfd *bfd;
+ CORE_ADDR sysinfo_ehdr;
+ size_t size;
+ char *name;
+ int from_tty;
+};
+
+/* Wrapper function for symbol_file_add_from_memory, for
+ catch_exceptions. */
+
+static int
+symbol_file_add_from_memory_wrapper (struct ui_out *uiout, void *data)
+{
+ struct symbol_file_add_from_memory_args *args
+ = (struct symbol_file_add_from_memory_args *) data;
+
+ symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args->size,
+ args->name, args->from_tty);
+ return 0;
+}
+
+/* Try to add the symbols for the vsyscall page, if there is one.
+ This function is called via the inferior_created observer. */
+
+static void
+add_vsyscall_page (struct target_ops *target, int from_tty)
+{
+ struct mem_range vsyscall_range;
+
+ if (gdbarch_vsyscall_range (target_gdbarch (), &vsyscall_range))
+ {
+ struct bfd *bfd;
+ struct symbol_file_add_from_memory_args args;
+
+ if (core_bfd != NULL)
+ bfd = core_bfd;
+ else if (exec_bfd != NULL)
+ bfd = exec_bfd;
+ else
+ /* FIXME: cagney/2004-05-06: Should not require an existing
+ BFD when trying to create a run-time BFD of the VSYSCALL
+ page in the inferior. Unfortunately that's the current
+ interface so for the moment bail. Introducing a
+ ``bfd_runtime'' (a BFD created using the loaded image) file
+ format should fix this. */
+ {
+ warning (_("Could not load vsyscall page "
+ "because no executable was specified"));
+ return;
+ }
+ args.bfd = bfd;
+ args.sysinfo_ehdr = vsyscall_range.start;
+ args.size = vsyscall_range.length;
+
+ args.name = xstrprintf ("system-supplied DSO at %s",
+ paddress (target_gdbarch (), vsyscall_range.start));
+ /* Pass zero for FROM_TTY, because the action of loading the
+ vsyscall DSO was not triggered by the user, even if the user
+ typed "run" at the TTY. */
+ args.from_tty = 0;
+ catch_exceptions (current_uiout, symbol_file_add_from_memory_wrapper,
+ &args, RETURN_MASK_ALL);
+ }