#include "symfile.h"
#include "objfiles.h"
#include "gdbcore.h"
+#include "gdbcmd.h"
#include "target.h"
#include "inferior.h"
#include "infrun.h"
return buf;
}
+/* If non-empty, overrides the value of .interp in binaries. */
+static std::string program_interpreter;
+
+static void
+show_program_interpreter (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ if (value == NULL || value[0] == '\0')
+ fprintf_filtered (file,
+ _("The program interpreter override is not set.\n"));
+ else
+ fprintf_filtered (file, _("The program interpreter is %s.\n"), value);
+}
/* Return program interpreter string. */
static gdb::optional<gdb::byte_vector>
find_program_interpreter (void)
{
+ if (!program_interpreter.empty ())
+ {
+ size_t len = program_interpreter.length () + 1;
+ gdb::byte_vector buf (len);
+ memcpy(buf.data (), program_interpreter.c_str (), len);
+ return buf;
+ }
+
/* If we have a current exec_bfd, use its section table. */
if (current_program_space->exec_bfd ()
&& (bfd_get_flavour (current_program_space->exec_bfd ())
gdb::observers::free_objfile.attach (svr4_free_objfile_observer,
"solib-svr4");
+
+ add_setshow_optional_filename_cmd ("program-interpreter", class_support,
+ &program_interpreter, _("\
+Set a program interpreter override."), _("\
+Show the current program interpreter override."), _("\
+The program interpreter override is used to locate a program interpreter\n\
+instead of the .interp section."),
+ NULL,
+ show_program_interpreter,
+ &setlist, &showlist);
}