+/* Load scripts specified in OBJFILE.
+ START,END delimit a buffer containing a list of nul-terminated
+ file names.
+ SECTION_NAME is used in error messages.
+
+ Scripts are found per normal "source -s" command processing.
+ First the script is looked for in $cwd. If not found there the
+ source search path is used.
+
+ The section contains a list of path names of script files to load.
+ Each path is null-terminated. */
+
+static void
+source_section_scripts (struct objfile *objfile, const char *section_name,
+ const char *start, const char *end)
+{
+ const char *p;
+ struct auto_load_pspace_info *pspace_info;
+
+ pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
+
+ for (p = start; p < end; ++p)
+ {
+ const char *file;
+ FILE *stream;
+ char *full_path;
+ int opened, in_hash_table;
+ struct cleanup *back_to;
+ /* At the moment we only support python scripts in .debug_gdb_scripts,
+ but that can change. */
+ const struct script_language *language = gdbpy_script_language_defn ();
+
+ if (*p != 1)
+ {
+ warning (_("Invalid entry in %s section"), section_name);
+ /* We could try various heuristics to find the next valid entry,
+ but it's safer to just punt. */
+ break;
+ }
+ file = ++p;
+
+ while (p < end && *p != '\0')
+ ++p;
+ if (p == end)
+ {
+ char *buf = alloca (p - file + 1);
+
+ memcpy (buf, file, p - file);
+ buf[p - file] = '\0';
+ warning (_("Non-null-terminated path in %s: %s"),
+ section_name, buf);
+ /* Don't load it. */
+ break;
+ }
+ if (p == file)
+ {
+ warning (_("Empty path in %s"), section_name);
+ continue;
+ }
+
+ /* Skip this script if support has not been compiled in or
+ auto-loading it has been disabled. */
+ if (language == NULL
+ || !language->auto_load_enabled ())
+ {
+ /* No message is printed, just skip it. */
+ continue;
+ }
+
+ opened = find_and_open_script (file, 1 /*search_path*/,
+ &stream, &full_path);
+
+ back_to = make_cleanup (null_cleanup, NULL);
+ if (opened)
+ {
+ make_cleanup_fclose (stream);
+ make_cleanup (xfree, full_path);
+
+ if (!file_is_auto_load_safe (full_path,
+ _("auto-load: Loading %s script "
+ "\"%s\" from section \"%s\" of "
+ "objfile \"%s\".\n"),
+ language->name, full_path, section_name,
+ objfile_name (objfile)))
+ opened = 0;
+ }
+ else
+ {
+ full_path = NULL;
+
+ /* If one script isn't found it's not uncommon for more to not be
+ found either. We don't want to print a message for each script,
+ too much noise. Instead, we print the warning once and tell the
+ user how to find the list of scripts that weren't loaded.
+ We don't throw an error, the program is still debuggable.
+
+ IWBN if complaints.c were more general-purpose. */
+
+ if (script_not_found_warning_print (pspace_info))
+ warning (_("Missing auto-load scripts referenced in section %s\n\
+of file %s\n\
+Use `info auto-load %s-scripts [REGEXP]' to list them."),
+ section_name, objfile_name (objfile), language->name);
+ }
+
+ in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
+ language);
+
+ /* If this file is not currently loaded, load it. */
+ if (opened && !in_hash_table)
+ {
+ gdb_assert (language->source_script_for_objfile != NULL);
+ language->source_script_for_objfile (objfile, stream, full_path);
+ }
+
+ do_cleanups (back_to);
+ }
+}
+
+/* Load scripts specified in section SECTION_NAME of OBJFILE. */
+
+static void
+auto_load_section_scripts (struct objfile *objfile, const char *section_name)
+{
+ bfd *abfd = objfile->obfd;
+ asection *scripts_sect;
+ bfd_byte *data = NULL;
+
+ scripts_sect = bfd_get_section_by_name (abfd, section_name);
+ if (scripts_sect == NULL)
+ return;
+
+ if (!bfd_get_full_section_contents (abfd, scripts_sect, &data))
+ warning (_("Couldn't read %s section of %s"),
+ section_name, bfd_get_filename (abfd));
+ else
+ {
+ struct cleanup *cleanups;
+ char *p = (char *) data;
+
+ cleanups = make_cleanup (xfree, p);
+ source_section_scripts (objfile, section_name, p,
+ p + bfd_get_section_size (scripts_sect));
+ do_cleanups (cleanups);
+ }
+}
+