* run.1: Document --sysroot=filepath.
authorHans-Peter Nilsson <hp@axis.com>
Wed, 8 Dec 2004 00:40:30 +0000 (00:40 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Wed, 8 Dec 2004 00:40:30 +0000 (00:40 +0000)
* sim-options.c (STANDARD_OPTIONS): New member OPTION_SYSROOT.
(standard_options): Support --sysroot=<path>.
(standard_option_handler): Handle OPTION_SYSROOT.
* syscall.c (simulator_sysroot): Define, initialized empty.
(get_path): Prepend simulator_sysroot to absolute file path.
[HAVE_STRING_H]: Include string.h.
[!HAVE_STRING_H && HAVE_STRINGS_H]: Include strings.h.
* nrun.c [HAVE_UNISTD_H]: Include unistd.h.
(main): If simulator_sysroot is not empty, chdir there.
* sim-config.h (simulator_sysroot): Declare.

sim/common/ChangeLog
sim/common/nrun.c
sim/common/run.1
sim/common/sim-config.h
sim/common/sim-options.c
sim/common/syscall.c

index a046a96631e4e47e0443f6baab61d41fa8dc22d4..bc71bc9d6243e9a67b9c06774964c3f79697350d 100644 (file)
@@ -1,5 +1,17 @@
 2004-12-08  Hans-Peter Nilsson  <hp@axis.com>
 
+       * run.1: Document --sysroot=filepath.
+       * sim-options.c (STANDARD_OPTIONS): New member OPTION_SYSROOT.
+       (standard_options): Support --sysroot=<path>.
+       (standard_option_handler): Handle OPTION_SYSROOT.
+       * syscall.c (simulator_sysroot): Define, initialized empty.
+       (get_path): Prepend simulator_sysroot to absolute file path.
+       [HAVE_STRING_H]: Include string.h.
+       [!HAVE_STRING_H && HAVE_STRINGS_H]: Include strings.h.
+       * nrun.c [HAVE_UNISTD_H]: Include unistd.h.
+       (main): If simulator_sysroot is not empty, chdir there.
+       * sim-config.h (simulator_sysroot): Declare.
+
        * aclocal.m4 (SIM_AC_OUTPUT): Substitute @cgen_breaks@ for "break
        cgen_rtx_error" in a CGEN-generated simulator.
        * gdbinit.in: Break on sim_core_signal too.  Have autoconf
index 8dfa94658b0a9ca5ee541d9fc052e0a3fc47eb6d..d0c43e6ad931d903d584eb18320ce7bf9d816c52 100644 (file)
@@ -1,5 +1,5 @@
 /* New version of run front end support for simulators.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2004 Free Software Foundation, Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -24,6 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 extern char **environ;
 #endif
 
+#ifdef HAVE_UNISTD_H
+/* For chdir.  */
+#include <unistd.h>
+#endif
+
 static void usage (void);
 
 extern host_callback default_callback;
@@ -117,6 +122,16 @@ main (int argc, char **argv)
   sim_create_inferior (sd, prog_bfd, prog_argv, NULL);
 #endif
 
+  /* To accommodate relative file paths, chdir to sysroot now.  We
+     mustn't do this until BFD has opened the program, else we wouldn't
+     find the executable if it has a relative file path.  */
+  if (simulator_sysroot[0] != '\0' && chdir (simulator_sysroot) < 0)
+    {
+      fprintf (stderr, "%s: can't change directory to \"%s\"\n",
+              myname, simulator_sysroot);
+      exit (1);
+    }
+
   /* Run/Step the program.  */
   if (single_step)
     {
index ad11210ecba79f99ccbd405644397a3ec0f4da13..7de3c7a3020d8696d0b430fe199c4a43b22994fb 100644 (file)
@@ -1,4 +1,4 @@
-.\" Copyright (c) 1993 Free Software Foundation
+.\" Copyright (c) 1993, 2004 Free Software Foundation
 .\" See section COPYING for conditions for redistribution
 .TH run 1 "13oct1993" "GNU Tools" "GNU Tools"
 .de BP
@@ -21,6 +21,8 @@ run\(em\&Simulator front-end
 .IR freq "\|]"
 .RB "[\|" \-m
 .IR memory "\|]"
+.RB "[\|" \--sysroot
+.IR filepath "\|]"
 .I program
 .ad b
 .hy 1
@@ -71,6 +73,16 @@ Set the memory size for the emulated machine to two to the power
 .IR memory .
 The default value is 19, emulating a board with 524288 bytes of memory.
 
+.TP
+.BI \--sysroot " filepath"
+Prepend
+.IR filepath
+to all simulator system calls that pass absolute file paths.
+Change working directory to
+.IR filepath
+at program start.  Not all simulators support this option; those
+that don't, will ignore it.
+
 .PP
 
 .SH "SEE ALSO"
index f874b886de84d1e3c5b6f48018b9223312be4b78..9d4d2545ae7f816a740686053df8a04259d8afa1 100644 (file)
@@ -1,6 +1,6 @@
 /* The common simulator framework for GDB, the GNU Debugger.
 
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright 2002, 2004 Free Software Foundation, Inc.
 
    Contributed by Andrew Cagney and Red Hat.
 
@@ -371,6 +371,9 @@ enum sim_environment {
                             ? WITH_ENVIRONMENT \
                             : USER_ENVIRONMENT)
 
+/* To be prepended to simulator calls with absolute file paths and
+   chdir:ed at startup.  */
+extern char *simulator_sysroot;
 
 /* Callback & Modulo Memory.
 
index 789ec2a6b326e3bf9fcd689ac33f2e8d3a3fa742..397652cf53d3449415d5361782d63240eef56faa 100644 (file)
@@ -1,5 +1,5 @@
 /* Simulator option handling.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 2004 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
 This file is part of GDB, the GNU debugger.
@@ -115,6 +115,7 @@ typedef enum {
 #endif
   OPTION_LOAD_LMA,
   OPTION_LOAD_VMA,
+  OPTION_SYSROOT
 } STANDARD_OPTIONS;
 
 static const OPTION standard_options[] =
@@ -205,6 +206,11 @@ static const OPTION standard_options[] =
       '\0', NULL, "", standard_option_handler,  "" },
 #endif
 
+  { {"sysroot", required_argument, NULL, OPTION_SYSROOT},
+      '\0', "SYSROOT",
+    "Root for system calls with absolute file-names and cwd at start",
+      standard_option_handler },
+
   { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
 };
 
@@ -441,6 +447,14 @@ standard_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
        exit (0);
       /* FIXME: 'twould be nice to do something similar if gdb.  */
       break;
+
+    case OPTION_SYSROOT:
+      /* Don't leak memory in the odd event that there's lots of
+        --sysroot=... options.  */
+      if (simulator_sysroot[0] != '\0' && arg[0] != '\0')
+       free (simulator_sysroot);
+      simulator_sysroot = xstrdup (arg);
+      break;
     }
 
   return SIM_RC_OK;
index 04dc71e89718cf2f90ec63b8272387d68be3ecda..76b32bafe163efcf2f4060ebd7f125f5fefd8b1c 100644 (file)
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#elif defined (HAVE_STRINGS_H)
+#include <strings.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #define TWORD long
 #define TADDR unsigned long
 
+/* Path to be prepended to syscalls with absolute paths, and to be
+   chdir:ed at startup, if not empty.  */
+char *simulator_sysroot = "";
+
 /* Utility of cb_syscall to fetch a path name or other string from the target.
    The result is 0 for success or a host errno value.  */
 
@@ -101,7 +110,8 @@ get_string (cb, sc, buf, buflen, addr)
 
 /* Utility of cb_syscall to fetch a path name.
    The buffer is malloc'd and the address is stored in BUFP.
-   The result is that of get_string.
+   The result is that of get_string, but prepended with
+   simulator_sysroot if the string starts with '/'.
    If an error occurs, no buffer is left malloc'd.  */
 
 static int
@@ -113,10 +123,27 @@ get_path (cb, sc, addr, bufp)
 {
   char *buf = xmalloc (MAX_PATH_LEN);
   int result;
+  int sysroot_len = strlen (simulator_sysroot);
 
-  result = get_string (cb, sc, buf, MAX_PATH_LEN, addr);
+  result = get_string (cb, sc, buf, MAX_PATH_LEN - sysroot_len, addr);
   if (result == 0)
-    *bufp = buf;
+    {
+      /* Prepend absolute paths with simulator_sysroot.  Relative paths
+        are supposed to be relative to a chdir within that path, but at
+        this point unknown where.  */
+      if (simulator_sysroot[0] != '\0' && *buf == '/')
+       {
+         /* Considering expected rareness of syscalls with absolute
+            file paths (compared to relative file paths and insn
+            execution), it does not seem worthwhile to rearrange things
+            to get rid of the string moves here; we'd need at least an
+            extra call to check the initial '/' in the path.  */
+         memmove (buf + sysroot_len, buf, sysroot_len);
+         memcpy (buf, simulator_sysroot, sysroot_len);
+       }
+
+      *bufp = buf;
+    }
   else
     free (buf);
   return result;