Set invocation variables during dump load.

Vinvocation_directory must be set during dump load process to support
.eln load.

	* src/pdumper.h: (pdumper_load): Add argv0 and original_pwd
	parameters.

	* src/pdumper.c (pdumper_load): Add argv0 and original_pwd
	parameter plus call 'set_invocation_vars'.

	* src/lisp.h (set_invocation_vars): New function.

	* src/emacs.c (set_invocation_vars): New function.
	(init_cmdargs): Move logic into 'set_invocation_vars' and call it.
	(load_pdump): Add 'original_pwd' parameter and update calls to
	'pdumper_load'.
	(main): Set emacs_wd earlier and update call to 'pdumper_load'.
This commit is contained in:
Andrea Corallo 2020-04-12 12:38:46 +01:00
parent f4156b452f
commit 7f5d1e9aa8
4 changed files with 48 additions and 28 deletions

View file

@ -403,34 +403,35 @@ terminate_due_to_signal (int sig, int backtrace_limit)
/* This shouldn't be executed, but it prevents a warning. */
exit (1);
}
/* Code for dealing with Lisp access to the Unix command line. */
static void
init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
/* Set `invocation-name' `invocation-directory'. */
void
set_invocation_vars (char *argv0, char const *original_pwd)
{
int i;
Lisp_Object name, dir, handler;
ptrdiff_t count = SPECPDL_INDEX ();
Lisp_Object raw_name;
/* This function can be called from within pdumper or later during
boot. No need to run it twice. */
static bool double_run_guard;
if (double_run_guard)
return;
double_run_guard = true;
Lisp_Object raw_name, handler;
AUTO_STRING (slash_colon, "/:");
initial_argv = argv;
initial_argc = argc;
#ifdef WINDOWSNT
/* Must use argv[0] converted to UTF-8, as it begets many standard
/* Must use argv0 converted to UTF-8, as it begets many standard
file and directory names. */
{
char argv0[MAX_UTF8_PATH];
char argv0_1[MAX_UTF8_PATH];
if (filename_from_ansi (argv[0], argv0) == 0)
raw_name = build_unibyte_string (argv0);
if (filename_from_ansi (argv0, argv0_1) == 0)
raw_name = build_unibyte_string (argv0_1);
else
raw_name = build_unibyte_string (argv[0]);
raw_name = build_unibyte_string (argv0);
}
#else
raw_name = build_unibyte_string (argv[0]);
raw_name = build_unibyte_string (argv0);
#endif
/* Add /: to the front of the name
@ -442,7 +443,7 @@ init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
Vinvocation_name = Ffile_name_nondirectory (raw_name);
Vinvocation_directory = Ffile_name_directory (raw_name);
/* If we got no directory in argv[0], search PATH to find where
/* If we got no directory in argv0, search PATH to find where
Emacs actually came from. */
if (NILP (Vinvocation_directory))
{
@ -470,6 +471,21 @@ init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, odir);
}
}
/* Code for dealing with Lisp access to the Unix command line. */
static void
init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
{
int i;
Lisp_Object name, dir;
ptrdiff_t count = SPECPDL_INDEX ();
initial_argv = argv;
initial_argc = argc;
set_invocation_vars (argv[0], original_pwd);
Vinstallation_directory = Qnil;
@ -758,7 +774,7 @@ load_pdump_find_executable (char const *argv0, ptrdiff_t *candidate_size)
}
static void
load_pdump (int argc, char **argv)
load_pdump (int argc, char **argv, char const *original_pwd)
{
const char *const suffix = ".pdmp";
int result;
@ -793,7 +809,7 @@ load_pdump (int argc, char **argv)
if (dump_file)
{
result = pdumper_load (dump_file);
result = pdumper_load (dump_file, argv[0], original_pwd);
if (result != PDUMPER_LOAD_SUCCESS)
fatal ("could not load dump file \"%s\": %s",
@ -842,7 +858,7 @@ load_pdump (int argc, char **argv)
if (bufsize < needed)
dump_file = xpalloc (dump_file, &bufsize, needed - bufsize, -1, 1);
strcpy (dump_file + exenamelen, suffix);
result = pdumper_load (dump_file);
result = pdumper_load (dump_file, argv[0], original_pwd);
if (result == PDUMPER_LOAD_SUCCESS)
goto out;
@ -873,7 +889,7 @@ load_pdump (int argc, char **argv)
}
sprintf (dump_file, "%s%c%s%s",
path_exec, DIRECTORY_SEP, argv0_base, suffix);
result = pdumper_load (dump_file);
result = pdumper_load (dump_file, argv[0], original_pwd);
if (result == PDUMPER_LOAD_FILE_NOT_FOUND)
{
@ -908,7 +924,7 @@ load_pdump (int argc, char **argv)
#endif
sprintf (dump_file, "%s%c%s%s",
path_exec, DIRECTORY_SEP, argv0_base, suffix);
result = pdumper_load (dump_file);
result = pdumper_load (dump_file, argv[0], original_pwd);
}
if (result != PDUMPER_LOAD_SUCCESS)
@ -929,7 +945,6 @@ main (int argc, char **argv)
/* Variable near the bottom of the stack, and aligned appropriately
for pointers. */
void *stack_bottom_variable;
bool no_loadup = false;
char *junk = 0;
char *dname_arg = 0;
@ -1048,9 +1063,10 @@ main (int argc, char **argv)
w32_init_main_thread ();
#endif
emacs_wd = emacs_get_current_dir_name ();
#ifdef HAVE_PDUMPER
if (attempt_load_pdump)
load_pdump (argc, argv);
load_pdump (argc, argv, emacs_wd);
#endif
argc = maybe_disable_address_randomization (argc, argv);
@ -1122,7 +1138,6 @@ main (int argc, char **argv)
exit (0);
}
emacs_wd = emacs_get_current_dir_name ();
#ifdef HAVE_PDUMPER
if (dumped_with_pdumper_p ())
pdumper_record_wd (emacs_wd);

View file

@ -4423,6 +4423,7 @@ extern bool display_arg;
extern Lisp_Object decode_env_path (const char *, const char *, bool);
extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
extern AVOID terminate_due_to_signal (int, int);
extern void set_invocation_vars (char *argv0, char const *original_pwd);
#ifdef WINDOWSNT
extern Lisp_Object Vlibrary_cache;
#endif

View file

@ -5428,7 +5428,7 @@ enum dump_section
N.B. We run very early in initialization, so we can't use lisp,
unwinding, xmalloc, and so on. */
int
pdumper_load (const char *dump_filename)
pdumper_load (const char *dump_filename, char *argv0, char const *original_pwd)
{
intptr_t dump_size;
struct stat stat;
@ -5574,6 +5574,9 @@ pdumper_load (const char *dump_filename)
for (int i = 0; i < nr_dump_hooks; ++i)
dump_hooks[i] ();
/* Once we can allocate and before loading .eln files we must set
Vinvocation_directory (.eln paths are relative to it). */
set_invocation_vars (argv0, original_pwd);
dump_do_all_dump_reloc_for_phase (header, dump_base, LATE_RELOCS);
dump_do_all_dump_reloc_for_phase (header, dump_base, VERY_LATE_RELOCS);
initialized = true;

View file

@ -127,7 +127,8 @@ enum pdumper_load_result
PDUMPER_LOAD_ERROR /* Must be last, as errno may be added. */
};
int pdumper_load (const char *dump_filename);
int pdumper_load (const char *dump_filename, char *argv0,
char const *original_pwd);
struct pdumper_loaded_dump
{