mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 17:24:23 +00:00
Unexec removal: Main part
* configure.ac: Remove unexec-specific parts. (EMACS_CONFIG_FEATURES): Always report that we do not have the UNEXEC feature. (AC_ECHO): No longer display a line about the unexec feature. * lisp/loadup.el: * lisp/startup.el: Remove unexec-specific code. * src/Makefile.in (base_obj): Drop 'UNEXEC_OBJ'. * src/alloc.c (staticvec): Never initialize this variable. (BLOCK_ALIGN): Always allow large blocks. (mmap_lisp_allowed_p): Remove unexec-specific code. * src/buffer.c (init_buffer): * src/conf_post.h (ADDRESS_SANITIZER): * src/emacs.c (load_pdump, main): Remove unexec-specific code. (Fdump_emacs): Remove function. (syms_of_emacs): Remove 'Fdump_emacs'. * src/lastfile.c: Remove unexec-specific code. * src/lisp.h (gflags): Remove unexec-specific flags. (will_dump_p, will_bootstrap_p, will_dump_with_unexec_p) (dumped_with_unexec_p, definitely_will_not_unexec_p): Remove or adjust predicates. (SUBR_SECTION_ATTRIBUTE): Remove unexec-specific definition. * src/pdumper.c (Fdump_emacs_portable): Remove unexec-specific warning. * src/process.c (init_process_emacs): Remove !unexec condition * src/sysdep.c (maybe_disable_address_randomization): Adjust comment. (init_signals): * src/timefns.c (init_timefns): Remove unexec-specific code. * src/w32heap.c (report_temacs_memory_usage): Remove function. * src/w32heap.h: Adjust comment. * src/w32image.c (globals_of_w32image): Remove unexec-specific code.
This commit is contained in:
parent
7ce34a3bcf
commit
15e2b14f03
17 changed files with 55 additions and 682 deletions
246
configure.ac
246
configure.ac
|
|
@ -444,28 +444,13 @@ this option's value should be 'yes' or 'no'.]) ;;
|
|||
],
|
||||
[with_pdumper=auto])
|
||||
|
||||
AC_ARG_WITH([unexec],
|
||||
AS_HELP_STRING(
|
||||
[--with-unexec=VALUE],
|
||||
[enable unexec support unconditionally
|
||||
('yes', 'no', or 'auto': default 'auto')]),
|
||||
[ case "${withval}" in
|
||||
yes|no|auto) val=$withval ;;
|
||||
*) AC_MSG_ERROR(
|
||||
['--with-unexec=$withval' is invalid;
|
||||
this option's value should be 'yes' or 'no'.]) ;;
|
||||
esac
|
||||
with_unexec=$val
|
||||
],
|
||||
[with_unexec=auto])
|
||||
|
||||
AC_ARG_WITH([dumping],[AS_HELP_STRING([--with-dumping=VALUE],
|
||||
[kind of dumping to use for initial Emacs build
|
||||
(VALUE one of: pdumper, unexec, none; default pdumper)])],
|
||||
(VALUE one of: pdumper, none; default pdumper)])],
|
||||
[ case "${withval}" in
|
||||
pdumper|unexec|none) val=$withval ;;
|
||||
pdumper|none) val=$withval ;;
|
||||
*) AC_MSG_ERROR(['--with-dumping=$withval is invalid;
|
||||
this option's value should be 'pdumper', 'unexec', or 'none'.])
|
||||
this option's value should be 'pdumper' or 'none'.])
|
||||
;;
|
||||
esac
|
||||
with_dumping=$val
|
||||
|
|
@ -480,22 +465,10 @@ if test "$with_pdumper" = "auto"; then
|
|||
fi
|
||||
fi
|
||||
|
||||
if test "$with_unexec" = "auto"; then
|
||||
if test "$with_dumping" = "unexec"; then
|
||||
with_unexec=yes
|
||||
else
|
||||
with_unexec=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$with_dumping" = "pdumper" && test "$with_pdumper" = "no"; then
|
||||
AC_MSG_ERROR(['--with-dumping=pdumper' requires pdumper support])
|
||||
fi
|
||||
|
||||
if test "$with_dumping" = "unexec" && test "$with_unexec" = "no"; then
|
||||
AC_MSG_ERROR(['--with-dumping=unexec' requires unexec support])
|
||||
fi
|
||||
|
||||
if test "$with_pdumper" = "yes"; then
|
||||
AC_DEFINE([HAVE_PDUMPER], [1],
|
||||
[Define to build with portable dumper support])
|
||||
|
|
@ -2072,10 +2045,6 @@ AC_PATH_PROG([GZIP_PROG], [gzip])
|
|||
test $with_compress_install != yes && test -n "$GZIP_PROG" && \
|
||||
GZIP_PROG=" # $GZIP_PROG # (disabled by configure --without-compress-install)"
|
||||
|
||||
if test "$with_dumping" = "unexec" && test "$opsys" = "nacl"; then
|
||||
AC_MSG_ERROR([nacl is not compatible with --with-dumping=unexec])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for 'find' args to delete a file],
|
||||
[emacs_cv_find_delete],
|
||||
[if touch conftest.tmp && find conftest.tmp -delete 2>/dev/null &&
|
||||
|
|
@ -2088,48 +2057,6 @@ AC_SUBST([FIND_DELETE])
|
|||
|
||||
PAXCTL_dumped=
|
||||
PAXCTL_notdumped=
|
||||
if test $with_unexec = yes && test $opsys = gnu-linux; then
|
||||
if test "${SETFATTR+set}" != set; then
|
||||
AC_CACHE_CHECK([for setfattr],
|
||||
[emacs_cv_prog_setfattr],
|
||||
[touch conftest.tmp
|
||||
if (setfattr -n user.pax.flags conftest.tmp) >/dev/null 2>&1; then
|
||||
emacs_cv_prog_setfattr=yes
|
||||
else
|
||||
emacs_cv_prog_setfattr=no
|
||||
fi])
|
||||
if test "$emacs_cv_prog_setfattr" = yes; then
|
||||
PAXCTL_notdumped='$(SETFATTR) -n user.pax.flags -v er'
|
||||
SETFATTR=setfattr
|
||||
else
|
||||
SETFATTR=
|
||||
fi
|
||||
fi
|
||||
case $opsys,$PAXCTL_notdumped,$emacs_uname_r in
|
||||
gnu-linux,,* | netbsd,,[0-7].*)
|
||||
AC_PATH_PROG([PAXCTL], [paxctl], [],
|
||||
[$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin])
|
||||
if test -n "$PAXCTL"; then
|
||||
if test "$opsys" = netbsd; then
|
||||
PAXCTL_dumped='$(PAXCTL) +a'
|
||||
PAXCTL_notdumped=$PAXCTL_dumped
|
||||
else
|
||||
AC_MSG_CHECKING([whether binaries have a PT_PAX_FLAGS header])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
|
||||
[if $PAXCTL -v conftest$EXEEXT >/dev/null 2>&1; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
PAXCTL=
|
||||
fi])
|
||||
if test -n "$PAXCTL"; then
|
||||
PAXCTL_dumped='$(PAXCTL) -zex'
|
||||
PAXCTL_notdumped='$(PAXCTL) -r'
|
||||
fi
|
||||
fi
|
||||
fi;;
|
||||
esac
|
||||
fi
|
||||
AC_SUBST([PAXCTL_dumped])
|
||||
AC_SUBST([PAXCTL_notdumped])
|
||||
AC_SUBST([SETFATTR])
|
||||
|
|
@ -2196,37 +2123,6 @@ else
|
|||
ac_link="$ac_link $NON_GCC_LINK_TEST_OPTIONS"
|
||||
fi
|
||||
|
||||
dnl On some platforms using GNU ld, linking temacs needs -znocombreloc.
|
||||
dnl Although this has something to do with dumping, the details are unknown.
|
||||
dnl If the flag is used but not needed,
|
||||
dnl Emacs should still work (albeit a bit more slowly),
|
||||
dnl so use the flag everywhere that it is supported.
|
||||
dnl When testing whether the flag works, treat GCC specially
|
||||
dnl since it just gives a non-fatal 'unrecognized option'
|
||||
dnl if not built to support GNU ld.
|
||||
if test "$GCC" = yes; then
|
||||
LDFLAGS_NOCOMBRELOC="-Wl,-znocombreloc"
|
||||
else
|
||||
LDFLAGS_NOCOMBRELOC="-znocombreloc"
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for -znocombreloc], [emacs_cv_znocombreloc],
|
||||
[if test $with_unexec = no; then
|
||||
emacs_cv_znocombreloc='not needed'
|
||||
else
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS $LDFLAGS_NOCOMBRELOC"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
|
||||
[emacs_cv_znocombreloc=yes], [emacs_cv_znocombreloc=no])
|
||||
LDFLAGS=$save_LDFLAGS
|
||||
fi])
|
||||
|
||||
case $emacs_cv_znocombreloc in
|
||||
no*)
|
||||
LDFLAGS_NOCOMBRELOC= ;;
|
||||
esac
|
||||
|
||||
|
||||
AC_CACHE_CHECK([whether addresses are sanitized],
|
||||
[emacs_cv_sanitize_address],
|
||||
[AC_COMPILE_IFELSE(
|
||||
|
|
@ -2242,48 +2138,8 @@ AC_CACHE_CHECK([whether addresses are sanitized],
|
|||
[emacs_cv_sanitize_address=yes],
|
||||
[emacs_cv_sanitize_address=no])])
|
||||
|
||||
if test $with_unexec = yes; then
|
||||
AC_DEFINE([HAVE_UNEXEC], [1], [Define if Emacs supports unexec.])
|
||||
if test "$emacs_cv_sanitize_address" = yes; then
|
||||
AC_MSG_WARN([[Addresses are sanitized; suggest --without-unexec]])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
UNEXEC_OBJ=
|
||||
test $with_unexec = yes &&
|
||||
case "$opsys" in
|
||||
# MSDOS uses unexcoff.o
|
||||
aix4-2)
|
||||
UNEXEC_OBJ=unexaix.o
|
||||
;;
|
||||
cygwin)
|
||||
UNEXEC_OBJ=unexcw.o
|
||||
;;
|
||||
darwin)
|
||||
UNEXEC_OBJ=unexmacosx.o
|
||||
;;
|
||||
hpux10-20 | hpux11)
|
||||
UNEXEC_OBJ=unexhp9k800.o
|
||||
;;
|
||||
mingw32)
|
||||
UNEXEC_OBJ=unexw32.o
|
||||
;;
|
||||
solaris)
|
||||
# Use the Solaris dldump() function, called from unexsol.c, to dump
|
||||
# emacs, instead of the generic ELF dump code found in unexelf.c.
|
||||
# The resulting binary has a complete symbol table, and is better
|
||||
# for debugging and other observability tools (debuggers, pstack, etc).
|
||||
UNEXEC_OBJ=unexsol.o
|
||||
;;
|
||||
*)
|
||||
UNEXEC_OBJ=unexelf.o
|
||||
;;
|
||||
esac
|
||||
AC_SUBST([UNEXEC_OBJ])
|
||||
|
||||
LD_SWITCH_SYSTEM=
|
||||
test "$with_unexec" = no || case "$opsys" in
|
||||
case "$opsys" in
|
||||
freebsd|dragonfly)
|
||||
## Let 'ld' find image libs and similar things in /usr/local/lib.
|
||||
## The system compiler, GCC, has apparently been modified to not
|
||||
|
|
@ -2331,22 +2187,6 @@ esac
|
|||
|
||||
C_SWITCH_MACHINE=
|
||||
|
||||
test $with_unexec = yes &&
|
||||
case $canonical in
|
||||
alpha*)
|
||||
## With ELF, make sure that all common symbols get allocated to in the
|
||||
## data section. Otherwise, the dump of temacs may miss variables in
|
||||
## the shared library that have been initialized. For example, with
|
||||
## GNU libc, __malloc_initialized would normally be resolved to the
|
||||
## shared library's .bss section, which is fatal.
|
||||
if test "x$GCC" = "xyes"; then
|
||||
C_SWITCH_MACHINE="-fno-common"
|
||||
else
|
||||
AC_MSG_ERROR([Non-GCC compilers are not supported.])
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_CACHE_CHECK([for flags to work around GCC bug 58416],
|
||||
[emacs_cv_gcc_bug_58416_CFLAGS],
|
||||
[emacs_cv_gcc_bug_58416_CFLAGS='none needed'
|
||||
|
|
@ -3379,21 +3219,6 @@ system_malloc=yes
|
|||
dnl This must be before the test of $ac_cv_func_sbrk below.
|
||||
AC_CHECK_FUNCS_ONCE([sbrk])
|
||||
|
||||
test $with_unexec = yes &&
|
||||
case "$opsys" in
|
||||
## darwin ld insists on the use of malloc routines in the System framework.
|
||||
darwin | mingw32 | nacl | solaris) ;;
|
||||
cygwin | qnxnto | freebsd)
|
||||
hybrid_malloc=yes
|
||||
system_malloc= ;;
|
||||
*) test "$ac_cv_func_sbrk" = yes && system_malloc=$emacs_cv_sanitize_address;;
|
||||
esac
|
||||
|
||||
if test "${system_malloc}" != yes && test "${doug_lea_malloc}" != yes \
|
||||
&& test "${UNEXEC_OBJ}" = unexelf.o; then
|
||||
hybrid_malloc=yes
|
||||
fi
|
||||
|
||||
GMALLOC_OBJ=
|
||||
HYBRID_MALLOC=
|
||||
if test "${system_malloc}" = "yes"; then
|
||||
|
|
@ -5268,15 +5093,9 @@ if test "${with_native_compilation}" = "default"; then
|
|||
# Check if libgccjit really works.
|
||||
AC_RUN_IFELSE([libgccjit_smoke_test], [], [libgccjit_broken])
|
||||
fi
|
||||
if test "$with_unexec" = yes; then
|
||||
with_native_compilation=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "${with_native_compilation}" != "no"; then
|
||||
if test "$with_unexec" = yes; then
|
||||
AC_MSG_ERROR(['--with-native-compilation' is not compatible with unexec])
|
||||
fi
|
||||
if test "${HAVE_ZLIB}" = no; then
|
||||
AC_MSG_ERROR(['--with-native-compilation' requires zlib])
|
||||
fi
|
||||
|
|
@ -6085,19 +5904,6 @@ dnl No need to check for posix_memalign if aligned_alloc works.
|
|||
AC_CHECK_FUNCS([aligned_alloc posix_memalign], [break])
|
||||
AC_CHECK_DECLS([aligned_alloc], [], [], [[#include <stdlib.h>]])
|
||||
|
||||
case $with_unexec,$canonical in
|
||||
yes,alpha*)
|
||||
AC_CHECK_DECL([__ELF__], [],
|
||||
[AC_MSG_ERROR([Non-ELF systems are not supported on this platform.])]);;
|
||||
esac
|
||||
|
||||
if test "$with_unexec" = yes && test "$opsys" = "haiku"; then
|
||||
dnl A serious attempt was actually made to port unexec to Haiku.
|
||||
dnl Something in libstdc++ seems to prevent it from working.
|
||||
AC_MSG_ERROR([Haiku is not supported by the legacy unexec dumper.
|
||||
Please use the portable dumper instead.])
|
||||
fi
|
||||
|
||||
# Dump loading. Android lacks posix_madvise.
|
||||
AC_CHECK_FUNCS([posix_madvise madvise])
|
||||
|
||||
|
|
@ -7543,9 +7349,6 @@ case "$opsys" in
|
|||
## about 14 to about 34. Setting it high gets us plenty of slop and
|
||||
## only costs about 1.5K of wasted binary space.
|
||||
headerpad_extra=1000
|
||||
if test "$with_unexec" = yes; then
|
||||
LD_SWITCH_SYSTEM_TEMACS="-fno-pie $LD_SWITCH_SYSTEM_TEMACS -Xlinker -headerpad -Xlinker $headerpad_extra"
|
||||
fi
|
||||
|
||||
## This is here because src/Makefile.in did some extra fiddling around
|
||||
## with LD_SWITCH_SYSTEM. It seems cleaner to put this in
|
||||
|
|
@ -7571,49 +7374,11 @@ case "$opsys" in
|
|||
x86_64-*-*) LD_SWITCH_SYSTEM_TEMACS="-Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x400000000 -Wl,-entry,__start -Wl,-Map,./temacs.map" ;;
|
||||
*) LD_SWITCH_SYSTEM_TEMACS="-Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 -Wl,-entry,__start -Wl,-Map,./temacs.map" ;;
|
||||
esac
|
||||
## If they want unexec, disable Windows ASLR for the Emacs binary
|
||||
if test "$with_dumping" = "unexec"; then
|
||||
case "$canonical" in
|
||||
x86_64-*-*) LD_SWITCH_SYSTEM_TEMACS="$LD_SWITCH_SYSTEM_TEMACS -Wl,-disable-dynamicbase -Wl,-disable-high-entropy-va -Wl,-default-image-base-low" ;;
|
||||
*) LD_SWITCH_SYSTEM_TEMACS="$LD_SWITCH_SYSTEM_TEMACS -Wl,-disable-dynamicbase" ;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
|
||||
*) LD_SWITCH_SYSTEM_TEMACS= ;;
|
||||
esac
|
||||
|
||||
# -no-pie or -nopie fixes a temacs segfault on Gentoo, OpenBSD,
|
||||
# Ubuntu, and other systems with "hardened" GCC configurations for
|
||||
# some reason (Bug#18784). We don't know why this works, but not
|
||||
# segfaulting is better than segfaulting. Use ac_c_werror_flag=yes
|
||||
# when trying the option, otherwise clang keeps warning that it does
|
||||
# not understand it, and pre-4.6 GCC has a similar problem
|
||||
# (Bug#20338). Prefer -no-pie to -nopie, as -no-pie is the
|
||||
# spelling used by GCC 6.1.0 and later (Bug#24682).
|
||||
AC_CACHE_CHECK(
|
||||
[for $CC option to disable position independent executables],
|
||||
[emacs_cv_prog_cc_no_pie],
|
||||
[if test $with_unexec = no; then
|
||||
emacs_cv_prog_cc_no_pie='not needed'
|
||||
else
|
||||
emacs_save_c_werror_flag=$ac_c_werror_flag
|
||||
emacs_save_LDFLAGS=$LDFLAGS
|
||||
ac_c_werror_flag=yes
|
||||
for emacs_cv_prog_cc_no_pie in -no-pie -nopie no; do
|
||||
test $emacs_cv_prog_cc_no_pie = no && break
|
||||
LDFLAGS="$emacs_save_LDFLAGS $emacs_cv_prog_cc_no_pie"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [break])
|
||||
done
|
||||
ac_c_werror_flag=$emacs_save_c_werror_flag
|
||||
LDFLAGS=$emacs_save_LDFLAGS
|
||||
fi])
|
||||
case $emacs_cv_prog_cc_no_pie in
|
||||
-*)
|
||||
LD_SWITCH_SYSTEM_TEMACS="$LD_SWITCH_SYSTEM_TEMACS $emacs_cv_prog_cc_no_pie"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test x$ac_enable_profiling != x ; then
|
||||
case $opsys in
|
||||
*freebsd | gnu-linux) ;;
|
||||
|
|
@ -7756,7 +7521,7 @@ for opt in ACL BE_APP CAIRO DBUS FREETYPE GCONF GIF GLIB GMP GNUTLS GPM GSETTING
|
|||
|
||||
case $opt in
|
||||
PDUMPER) val=${with_pdumper} ;;
|
||||
UNEXEC) val=${with_unexec} ;;
|
||||
UNEXEC) val=no ;;
|
||||
GLIB) val=${emacs_cv_links_glib} ;;
|
||||
NOTIFY|ACL) eval val=\${${opt}_SUMMARY} ;;
|
||||
TOOLKIT_SCROLL_BARS|X_TOOLKIT) eval val=\${USE_$opt} ;;
|
||||
|
|
@ -7832,7 +7597,6 @@ AS_ECHO([" Does Emacs use -lXaw3d? ${HAVE_XAW3D
|
|||
Does Emacs support Xwidgets? ${HAVE_XWIDGETS}
|
||||
Does Emacs have threading support in lisp? ${threads_enabled}
|
||||
Does Emacs support the portable dumper? ${with_pdumper}
|
||||
Does Emacs support legacy unexec dumping? ${with_unexec}
|
||||
Which dumping strategy does Emacs use? ${with_dumping}
|
||||
Does Emacs have native lisp compiler? ${HAVE_NATIVE_COMP}
|
||||
Does Emacs use version 2 of the X Input Extension? ${HAVE_XINPUT2}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
;; Add subdirectories to the load-path for files that might get
|
||||
;; autoloaded when bootstrapping or running Emacs normally.
|
||||
;; This is because PATH_DUMPLOADSEARCH is just "../lisp".
|
||||
(if (or (member dump-mode '("bootstrap" "pbootstrap"))
|
||||
(if (or (member dump-mode '("pbootstrap"))
|
||||
;; FIXME this is irritatingly fragile.
|
||||
(and (stringp (nth 4 command-line-args))
|
||||
(string-match "^unidata-gen\\(\\.elc?\\)?$"
|
||||
|
|
@ -635,8 +635,6 @@ directory got moved. This is set to be a pair in the form of:
|
|||
(error nil))))))
|
||||
(if dump-mode
|
||||
(let ((output (cond ((equal dump-mode "pdump") "emacs.pdmp")
|
||||
((equal dump-mode "dump") "emacs")
|
||||
((equal dump-mode "bootstrap") "emacs")
|
||||
((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
|
||||
(t (error "Unrecognized dump mode %s" dump-mode)))))
|
||||
(when (and (featurep 'native-compile)
|
||||
|
|
@ -680,7 +678,7 @@ directory got moved. This is set to be a pair in the form of:
|
|||
(eq system-type 'android))
|
||||
;; Don't bother adding another name if we're just
|
||||
;; building bootstrap-emacs.
|
||||
(member dump-mode '("pbootstrap" "bootstrap"))))
|
||||
(member dump-mode '("pbootstrap"))))
|
||||
(let ((name (format "emacs-%s.%d" emacs-version emacs-build-number))
|
||||
(exe (if (eq system-type 'windows-nt) ".exe" "")))
|
||||
(while (string-match "[^-+_.a-zA-Z0-9]+" name)
|
||||
|
|
|
|||
|
|
@ -1104,7 +1104,7 @@ init-file, or to a default value if loading is not possible."
|
|||
;; Else, perhaps the user init file was compiled
|
||||
(when (and (equal (file-name-extension user-init-file) "eln")
|
||||
;; The next test is for builds without native
|
||||
;; compilation support or builds with unexec.
|
||||
;; compilation support.
|
||||
(boundp 'comp-eln-to-el-h))
|
||||
(if-let* ((source (gethash (file-name-nondirectory
|
||||
user-init-file)
|
||||
|
|
@ -2523,7 +2523,7 @@ A fancy display is used on graphic displays, normal otherwise."
|
|||
(defalias 'about-emacs #'display-about-screen)
|
||||
(defalias 'display-splash-screen #'display-startup-screen)
|
||||
|
||||
;; This avoids byte-compiler warning in the unexec build.
|
||||
;; This avoids byte-compiler warning in non-pdumper builds.
|
||||
(declare-function pdumper-stats "pdumper.c" ())
|
||||
|
||||
(defun command-line-1 (args-left)
|
||||
|
|
|
|||
|
|
@ -386,8 +386,6 @@ RUN_TEMACS = ./temacs
|
|||
# Whether builds should contain details. '--no-build-details' or empty.
|
||||
BUILD_DETAILS = @BUILD_DETAILS@
|
||||
|
||||
UNEXEC_OBJ = @UNEXEC_OBJ@
|
||||
|
||||
HAIKU_OBJ = @HAIKU_OBJ@
|
||||
HAIKU_CXX_OBJ = @HAIKU_CXX_OBJ@
|
||||
HAIKU_LIBS = @HAIKU_LIBS@
|
||||
|
|
@ -471,9 +469,9 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
|
|||
cmds.o casetab.o casefiddle.o indent.o search.o regex-emacs.o undo.o \
|
||||
alloc.o pdumper.o data.o doc.o editfns.o callint.o \
|
||||
eval.o floatfns.o fns.o sort.o font.o print.o lread.o $(MODULES_OBJ) \
|
||||
syntax.o $(UNEXEC_OBJ) bytecode.o comp.o $(DYNLIB_OBJ) \
|
||||
process.o gnutls.o callproc.o \
|
||||
region-cache.o sound.o timefns.o atimer.o \
|
||||
syntax.o bytecode.o comp.o $(DYNLIB_OBJ) \
|
||||
process.o gnutls.o callproc.o \
|
||||
region-cache.o sound.o timefns.o atimer.o \
|
||||
doprnt.o intervals.o textprop.o composite.o xml.o lcms.o $(NOTIFY_OBJ) \
|
||||
$(XWIDGETS_OBJ) \
|
||||
profiler.o decompress.o \
|
||||
|
|
|
|||
22
src/alloc.c
22
src/alloc.c
|
|
@ -266,7 +266,7 @@ voidfuncptr __MALLOC_HOOK_VOLATILE __malloc_initialize_hook EXTERNALLY_VISIBLE
|
|||
|
||||
#endif
|
||||
|
||||
#if defined DOUG_LEA_MALLOC || defined HAVE_UNEXEC
|
||||
#if defined DOUG_LEA_MALLOC
|
||||
|
||||
/* Allocator-related actions to do just before and after unexec. */
|
||||
|
||||
|
|
@ -570,15 +570,9 @@ static void mem_delete (struct mem_node *);
|
|||
static void mem_delete_fixup (struct mem_node *);
|
||||
static struct mem_node *mem_find (void *);
|
||||
|
||||
/* Addresses of staticpro'd variables. Initialize it to a nonzero
|
||||
value if we might unexec; otherwise some compilers put it into
|
||||
BSS. */
|
||||
/* Addresses of staticpro'd variables. */
|
||||
|
||||
Lisp_Object const *staticvec[NSTATICS]
|
||||
#ifdef HAVE_UNEXEC
|
||||
= {&Vpurify_flag}
|
||||
#endif
|
||||
;
|
||||
Lisp_Object const *staticvec[NSTATICS];
|
||||
|
||||
/* Index of next unused slot in staticvec. */
|
||||
|
||||
|
|
@ -631,10 +625,8 @@ mmap_lisp_allowed_p (void)
|
|||
{
|
||||
/* If we can't store all memory addresses in our lisp objects, it's
|
||||
risky to let the heap use mmap and give us addresses from all
|
||||
over our address space. We also can't use mmap for lisp objects
|
||||
if we might dump: unexec doesn't preserve the contents of mmapped
|
||||
regions. */
|
||||
return pointers_fit_in_lispobj_p () && !will_dump_with_unexec_p ();
|
||||
over our address space. */
|
||||
return pointers_fit_in_lispobj_p ();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -1071,11 +1063,7 @@ lisp_free (void *block)
|
|||
BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
|
||||
|
||||
/* Byte alignment of storage blocks. */
|
||||
#ifdef HAVE_UNEXEC
|
||||
# define BLOCK_ALIGN (1 << 10)
|
||||
#else /* !HAVE_UNEXEC */
|
||||
# define BLOCK_ALIGN (1 << 15)
|
||||
#endif
|
||||
static_assert (POWER_OF_2 (BLOCK_ALIGN));
|
||||
|
||||
/* Use aligned_alloc if it or a simple substitute is available.
|
||||
|
|
|
|||
41
src/buffer.c
41
src/buffer.c
|
|
@ -4892,47 +4892,6 @@ init_buffer (void)
|
|||
{
|
||||
Lisp_Object temp;
|
||||
|
||||
#ifdef USE_MMAP_FOR_BUFFERS
|
||||
if (dumped_with_unexec_p ())
|
||||
{
|
||||
Lisp_Object tail, buffer;
|
||||
|
||||
#ifndef WINDOWSNT
|
||||
/* These must be reset in the dumped Emacs, to avoid stale
|
||||
references to mmap'ed memory from before the dump.
|
||||
|
||||
WINDOWSNT doesn't need this because it doesn't track mmap'ed
|
||||
regions by hand (see w32heap.c, which uses system APIs for
|
||||
that purpose), and thus doesn't use mmap_regions. */
|
||||
mmap_regions = NULL;
|
||||
mmap_fd = -1;
|
||||
#endif
|
||||
|
||||
/* The dumped buffers reference addresses of buffer text
|
||||
recorded by temacs, that cannot be used by the dumped Emacs.
|
||||
We map new memory for their text here.
|
||||
|
||||
Implementation notes: the buffers we carry from temacs are:
|
||||
" prin1", "*scratch*", " *Minibuf-0*", "*Messages*", and
|
||||
" *code-conversion-work*". They are created by
|
||||
init_buffer_once and init_window_once (which are not called
|
||||
in the dumped Emacs), and by the first call to coding.c
|
||||
routines. Since FOR_EACH_LIVE_BUFFER only walks the buffers
|
||||
in Vbuffer_alist, any buffer we carry from temacs that is
|
||||
not in the alist (a.k.a. "magic invisible buffers") should
|
||||
be handled here explicitly. */
|
||||
FOR_EACH_LIVE_BUFFER (tail, buffer)
|
||||
{
|
||||
struct buffer *b = XBUFFER (buffer);
|
||||
b->text->beg = NULL;
|
||||
enlarge_buffer_text (b, 0);
|
||||
}
|
||||
/* The " prin1" buffer is not in Vbuffer_alist. */
|
||||
XBUFFER (Vprin1_to_string_buffer)->text->beg = NULL;
|
||||
enlarge_buffer_text (XBUFFER (Vprin1_to_string_buffer), 0);
|
||||
}
|
||||
#endif /* USE_MMAP_FOR_BUFFERS */
|
||||
|
||||
AUTO_STRING (scratch, "*scratch*");
|
||||
Fset_buffer (Fget_buffer_create (scratch, Qnil));
|
||||
if (NILP (BVAR (&buffer_defaults, enable_multibyte_characters)))
|
||||
|
|
|
|||
|
|
@ -93,30 +93,6 @@ typedef bool bool_bf;
|
|||
# define ADDRESS_SANITIZER false
|
||||
#endif
|
||||
|
||||
#ifdef emacs
|
||||
/* We include stdlib.h here, because Gnulib's stdlib.h might redirect
|
||||
'free' to its replacement, and we want to avoid that in unexec
|
||||
builds. Including it here will render its inclusion after config.h
|
||||
a no-op. */
|
||||
# if (defined DARWIN_OS && defined HAVE_UNEXEC) || defined HYBRID_MALLOC
|
||||
# include <stdlib.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined DARWIN_OS && defined emacs && defined HAVE_UNEXEC
|
||||
# undef malloc
|
||||
# define malloc unexec_malloc
|
||||
# undef realloc
|
||||
# define realloc unexec_realloc
|
||||
# undef free
|
||||
# define free unexec_free
|
||||
|
||||
extern void *unexec_malloc (size_t);
|
||||
extern void *unexec_realloc (void *, size_t);
|
||||
extern void unexec_free (void *);
|
||||
|
||||
#endif
|
||||
|
||||
/* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use
|
||||
gmalloc before dumping and the system malloc after dumping.
|
||||
hybrid_malloc and friends, defined in gmalloc.c, are wrappers that
|
||||
|
|
|
|||
169
src/emacs.c
169
src/emacs.c
|
|
@ -196,11 +196,6 @@ bool running_asynch_code;
|
|||
bool display_arg;
|
||||
#endif
|
||||
|
||||
#if defined GNU_LINUX && defined HAVE_UNEXEC
|
||||
/* The gap between BSS end and heap start as far as we can tell. */
|
||||
static uintmax_t heap_bss_diff;
|
||||
#endif
|
||||
|
||||
/* To run as a background daemon under Cocoa or Windows,
|
||||
we must do a fork+exec, not a simple fork.
|
||||
|
||||
|
|
@ -912,14 +907,6 @@ load_pdump (int argc, char **argv, char *dump_file)
|
|||
#endif
|
||||
;
|
||||
|
||||
/* TODO: maybe more thoroughly scrub process environment in order to
|
||||
make this use case (loading a dump file in an unexeced emacs)
|
||||
possible? Right now, we assume that things we don't touch are
|
||||
zero-initialized, and in an unexeced Emacs, this assumption
|
||||
doesn't hold. */
|
||||
if (initialized)
|
||||
fatal ("cannot load dump file in unexeced Emacs");
|
||||
|
||||
/* Look for an explicitly-specified dump file. */
|
||||
const char *path_exec = PATH_EXEC;
|
||||
dump_file = NULL;
|
||||
|
|
@ -1318,53 +1305,34 @@ main (int argc, char **argv)
|
|||
#endif
|
||||
|
||||
/* Look for this argument first, before any heap allocation, so we
|
||||
can set heap flags properly if we're going to unexec. */
|
||||
can set heap flags properly if we're going to dump. */
|
||||
if (!initialized && temacs)
|
||||
{
|
||||
#ifdef HAVE_UNEXEC
|
||||
if (strcmp (temacs, "dump") == 0 ||
|
||||
strcmp (temacs, "bootstrap") == 0)
|
||||
gflags.will_dump_with_unexec_ = true;
|
||||
#endif
|
||||
#ifdef HAVE_PDUMPER
|
||||
if (strcmp (temacs, "pdump") == 0 ||
|
||||
strcmp (temacs, "pbootstrap") == 0)
|
||||
gflags.will_dump_with_pdumper_ = true;
|
||||
#endif
|
||||
#if defined HAVE_PDUMPER || defined HAVE_UNEXEC
|
||||
if (strcmp (temacs, "bootstrap") == 0 ||
|
||||
strcmp (temacs, "pbootstrap") == 0)
|
||||
gflags.will_bootstrap_ = true;
|
||||
gflags.will_dump_ =
|
||||
will_dump_with_pdumper_p () ||
|
||||
will_dump_with_unexec_p ();
|
||||
will_dump_with_pdumper_p ();
|
||||
if (will_dump_p ())
|
||||
dump_mode = temacs;
|
||||
#endif
|
||||
if (!dump_mode)
|
||||
fatal ("Invalid temacs mode '%s'", temacs);
|
||||
}
|
||||
else if (temacs)
|
||||
{
|
||||
fatal ("--temacs not supported for unexeced emacs");
|
||||
}
|
||||
else
|
||||
{
|
||||
eassert (!temacs);
|
||||
#ifndef HAVE_UNEXEC
|
||||
eassert (!initialized);
|
||||
#endif
|
||||
#ifdef HAVE_PDUMPER
|
||||
if (!initialized)
|
||||
attempt_load_pdump = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
if (!will_dump_with_unexec_p ())
|
||||
gflags.will_not_unexec_ = true;
|
||||
#endif
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
/* Grab our malloc arena space now, before anything important
|
||||
happens. This relies on the static heap being needed only in
|
||||
|
|
@ -1427,25 +1395,12 @@ main (int argc, char **argv)
|
|||
|
||||
argc = maybe_disable_address_randomization (argc, argv);
|
||||
|
||||
#if defined GNU_LINUX && defined HAVE_UNEXEC
|
||||
if (!initialized)
|
||||
{
|
||||
char *heap_start = my_heap_start ();
|
||||
heap_bss_diff = heap_start - max (my_endbss, my_endbss_static);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef RUN_TIME_REMAP
|
||||
if (initialized)
|
||||
run_time_remap (argv[0]);
|
||||
#endif
|
||||
|
||||
/* If using unexmacosx.c (set by s/darwin.h), we must do this. */
|
||||
#if defined DARWIN_OS && defined HAVE_UNEXEC
|
||||
if (!initialized)
|
||||
unexec_init_emacs_zone ();
|
||||
#endif
|
||||
|
||||
init_standard_fds ();
|
||||
atexit (close_output_streams);
|
||||
|
||||
|
|
@ -1627,10 +1582,7 @@ main (int argc, char **argv)
|
|||
#endif /* MSDOS */
|
||||
|
||||
/* Set locale, so that initial error messages are localized properly.
|
||||
However, skip this if LC_ALL is "C", as it's not needed in that case.
|
||||
Skipping helps if dumping with unexec, to ensure that the dumped
|
||||
Emacs does not have its system locale tables initialized, as that
|
||||
might cause screwups when the dumped Emacs starts up. */
|
||||
However, skip this if LC_ALL is "C", as it's not needed in that case. */
|
||||
char *lc_all = getenv ("LC_ALL");
|
||||
if (! (lc_all && strcmp (lc_all, "C") == 0))
|
||||
{
|
||||
|
|
@ -3155,117 +3107,6 @@ shut_down_emacs (int sig, Lisp_Object stuff)
|
|||
}
|
||||
|
||||
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
|
||||
#include "unexec.h"
|
||||
|
||||
DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
|
||||
doc: /* Dump current state of Emacs into executable file FILENAME.
|
||||
Take symbols from SYMFILE (presumably the file you executed to run Emacs).
|
||||
This is used in the file `loadup.el' when building Emacs.
|
||||
|
||||
You must run Emacs in batch mode in order to dump it. */)
|
||||
(Lisp_Object filename, Lisp_Object symfile)
|
||||
{
|
||||
Lisp_Object tem;
|
||||
Lisp_Object symbol;
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
|
||||
check_pure_size ();
|
||||
|
||||
if (! noninteractive)
|
||||
error ("Dumping Emacs works only in batch mode");
|
||||
|
||||
if (dumped_with_unexec_p ())
|
||||
error ("Emacs can be dumped using unexec only once");
|
||||
|
||||
if (definitely_will_not_unexec_p ())
|
||||
error ("This Emacs instance was not started in temacs mode");
|
||||
|
||||
# if defined GNU_LINUX && defined HAVE_UNEXEC
|
||||
|
||||
/* Warn if the gap between BSS end and heap start is larger than this. */
|
||||
# define MAX_HEAP_BSS_DIFF (1024 * 1024)
|
||||
|
||||
if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
|
||||
fprintf (stderr,
|
||||
("**************************************************\n"
|
||||
"Warning: Your system has a gap between BSS and the\n"
|
||||
"heap (%"PRIuMAX" bytes). This usually means that exec-shield\n"
|
||||
"or something similar is in effect. The dump may\n"
|
||||
"fail because of this. See the section about\n"
|
||||
"exec-shield in etc/PROBLEMS for more information.\n"
|
||||
"**************************************************\n"),
|
||||
heap_bss_diff);
|
||||
# endif
|
||||
|
||||
/* Bind `command-line-processed' to nil before dumping,
|
||||
so that the dumped Emacs will process its command line
|
||||
and set up to work with X windows if appropriate. */
|
||||
symbol = Qcommand_line_processed;
|
||||
specbind (symbol, Qnil);
|
||||
|
||||
CHECK_STRING (filename);
|
||||
filename = Fexpand_file_name (filename, Qnil);
|
||||
filename = ENCODE_FILE (filename);
|
||||
if (!NILP (symfile))
|
||||
{
|
||||
CHECK_STRING (symfile);
|
||||
if (SCHARS (symfile))
|
||||
{
|
||||
symfile = Fexpand_file_name (symfile, Qnil);
|
||||
symfile = ENCODE_FILE (symfile);
|
||||
}
|
||||
}
|
||||
|
||||
tem = Vpurify_flag;
|
||||
Vpurify_flag = Qnil;
|
||||
|
||||
# ifdef HYBRID_MALLOC
|
||||
{
|
||||
static char const fmt[] = "%d of %d static heap bytes used";
|
||||
char buf[sizeof fmt + 2 * (INT_STRLEN_BOUND (int) - 2)];
|
||||
int max_usage = max_bss_sbrk_ptr - bss_sbrk_buffer;
|
||||
sprintf (buf, fmt, max_usage, STATIC_HEAP_SIZE);
|
||||
/* Don't log messages, because at this point buffers cannot be created. */
|
||||
message1_nolog (buf);
|
||||
}
|
||||
# endif
|
||||
|
||||
fflush (stdout);
|
||||
/* Tell malloc where start of impure now is. */
|
||||
/* Also arrange for warnings when nearly out of space. */
|
||||
# if !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC && !defined WINDOWSNT
|
||||
/* On Windows, this was done before dumping, and that once suffices.
|
||||
Meanwhile, my_edata is not valid on Windows. */
|
||||
memory_warnings (my_edata, malloc_warning);
|
||||
# endif
|
||||
|
||||
struct gflags old_gflags = gflags;
|
||||
gflags.will_dump_ = false;
|
||||
gflags.will_dump_with_unexec_ = false;
|
||||
gflags.dumped_with_unexec_ = true;
|
||||
|
||||
alloc_unexec_pre ();
|
||||
|
||||
unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
|
||||
|
||||
alloc_unexec_post ();
|
||||
|
||||
gflags = old_gflags;
|
||||
|
||||
# ifdef WINDOWSNT
|
||||
Vlibrary_cache = Qnil;
|
||||
# endif
|
||||
|
||||
Vpurify_flag = tem;
|
||||
|
||||
return unbind_to (count, Qnil);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Recover from setlocale (LC_ALL, ""). */
|
||||
void
|
||||
|
|
@ -3565,10 +3406,6 @@ syms_of_emacs (void)
|
|||
DEFSYM (Qcommand_line_processed, "command-line-processed");
|
||||
DEFSYM (Qsafe_magic, "safe-magic");
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
defsubr (&Sdump_emacs);
|
||||
#endif
|
||||
|
||||
defsubr (&Skill_emacs);
|
||||
|
||||
defsubr (&Sinvocation_name);
|
||||
|
|
|
|||
|
|
@ -42,14 +42,3 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
|| defined WINDOWSNT || defined CYGWIN || defined DARWIN_OS)
|
||||
char my_edata[] = "End of Emacs initialized data";
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
|
||||
/* Help unexec locate the end of the .bss area used by Emacs (which
|
||||
isn't always a separate section in NT executables). */
|
||||
char my_endbss[1];
|
||||
|
||||
static char _my_endbss[1];
|
||||
char * my_endbss_static = _my_endbss;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
65
src/lisp.h
65
src/lisp.h
|
|
@ -640,20 +640,12 @@ extern struct gflags
|
|||
dump. */
|
||||
bool dumped_with_pdumper_ : 1;
|
||||
#endif
|
||||
#ifdef HAVE_UNEXEC
|
||||
bool will_dump_with_unexec_ : 1;
|
||||
/* Set in an Emacs process that has been restored from an unexec
|
||||
dump. */
|
||||
bool dumped_with_unexec_ : 1;
|
||||
/* We promise not to unexec: useful for hybrid malloc. */
|
||||
bool will_not_unexec_ : 1;
|
||||
#endif
|
||||
} gflags;
|
||||
|
||||
INLINE bool
|
||||
will_dump_p (void)
|
||||
{
|
||||
#if HAVE_PDUMPER || defined HAVE_UNEXEC
|
||||
#if HAVE_PDUMPER
|
||||
return gflags.will_dump_;
|
||||
#else
|
||||
return false;
|
||||
|
|
@ -663,7 +655,7 @@ will_dump_p (void)
|
|||
INLINE bool
|
||||
will_bootstrap_p (void)
|
||||
{
|
||||
#if HAVE_PDUMPER || defined HAVE_UNEXEC
|
||||
#if HAVE_PDUMPER
|
||||
return gflags.will_bootstrap_;
|
||||
#else
|
||||
return false;
|
||||
|
|
@ -690,39 +682,6 @@ dumped_with_pdumper_p (void)
|
|||
#endif
|
||||
}
|
||||
|
||||
INLINE bool
|
||||
will_dump_with_unexec_p (void)
|
||||
{
|
||||
#ifdef HAVE_UNEXEC
|
||||
return gflags.will_dump_with_unexec_;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
INLINE bool
|
||||
dumped_with_unexec_p (void)
|
||||
{
|
||||
#ifdef HAVE_UNEXEC
|
||||
return gflags.dumped_with_unexec_;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This function is the opposite of will_dump_with_unexec_p(), except
|
||||
that it returns false before main runs. It's important to use
|
||||
gmalloc for any pre-main allocations if we're going to unexec. */
|
||||
INLINE bool
|
||||
definitely_will_not_unexec_p (void)
|
||||
{
|
||||
#ifdef HAVE_UNEXEC
|
||||
return gflags.will_not_unexec_;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Defined in floatfns.c. */
|
||||
extern double extract_float (Lisp_Object);
|
||||
|
||||
|
|
@ -3443,14 +3402,10 @@ CHECK_SUBR (Lisp_Object x)
|
|||
/* If we're not dumping using the legacy dumper and we might be using
|
||||
the portable dumper, try to bunch all the subr structures together
|
||||
for more efficient dump loading. */
|
||||
#ifndef HAVE_UNEXEC
|
||||
# ifdef DARWIN_OS
|
||||
# define SUBR_SECTION_ATTRIBUTE ATTRIBUTE_SECTION ("__DATA,subrs")
|
||||
# else
|
||||
# define SUBR_SECTION_ATTRIBUTE ATTRIBUTE_SECTION (".subrs")
|
||||
# endif
|
||||
#ifdef DARWIN_OS
|
||||
# define SUBR_SECTION_ATTRIBUTE ATTRIBUTE_SECTION ("__DATA,subrs")
|
||||
#else
|
||||
# define SUBR_SECTION_ATTRIBUTE
|
||||
# define SUBR_SECTION_ATTRIBUTE ATTRIBUTE_SECTION (".subrs")
|
||||
#endif
|
||||
|
||||
/* Define a built-in function for calling from Lisp.
|
||||
|
|
@ -4492,8 +4447,6 @@ extern void mark_objects (Lisp_Object *, ptrdiff_t);
|
|||
#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
|
||||
extern void refill_memory_reserve (void);
|
||||
#endif
|
||||
extern void alloc_unexec_pre (void);
|
||||
extern void alloc_unexec_post (void);
|
||||
extern void mark_c_stack (char const *, char const *);
|
||||
extern void flush_stack_call_func1 (void (*func) (void *arg), void *arg);
|
||||
extern void mark_memory (void const *start, void const *end);
|
||||
|
|
@ -4927,14 +4880,6 @@ void do_debug_on_call (Lisp_Object code, specpdl_ref count);
|
|||
Lisp_Object funcall_general (Lisp_Object fun,
|
||||
ptrdiff_t numargs, Lisp_Object *args);
|
||||
|
||||
/* Defined in unexmacosx.c. */
|
||||
#if defined DARWIN_OS && defined HAVE_UNEXEC
|
||||
extern void unexec_init_emacs_zone (void);
|
||||
extern void *unexec_malloc (size_t);
|
||||
extern void *unexec_realloc (void *, size_t);
|
||||
extern void unexec_free (void *);
|
||||
#endif
|
||||
|
||||
/* The definition of Lisp_Module_Function depends on emacs-module.h,
|
||||
so we don't define it here. It's defined in emacs-module.c. */
|
||||
|
||||
|
|
|
|||
|
|
@ -4143,12 +4143,6 @@ types. */)
|
|||
"contributing a patch to Emacs.");
|
||||
#endif
|
||||
|
||||
if (will_dump_with_unexec_p ())
|
||||
error ("This Emacs instance was started under the assumption "
|
||||
"that it would be dumped with unexec, not the portable "
|
||||
"dumper. Dumping with the portable dumper may produce "
|
||||
"unexpected results.");
|
||||
|
||||
if (!main_thread_p (current_thread))
|
||||
error ("This function can be called only in the main thread");
|
||||
|
||||
|
|
|
|||
|
|
@ -8620,50 +8620,39 @@ init_process_emacs (int sockfd)
|
|||
|
||||
inhibit_sentinels = 0;
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
/* Clear child_signal_read_fd and child_signal_write_fd after dumping,
|
||||
lest wait_reading_process_output should select on nonexistent file
|
||||
descriptors which existed in the build process. */
|
||||
child_signal_read_fd = -1;
|
||||
child_signal_write_fd = -1;
|
||||
#endif /* HAVE_UNEXEC */
|
||||
|
||||
if (!will_dump_with_unexec_p ())
|
||||
{
|
||||
#if defined HAVE_GLIB && !defined WINDOWSNT
|
||||
/* Tickle Glib's child-handling code. Ask Glib to install a
|
||||
watch source for Emacs itself which will initialize glib's
|
||||
private SIGCHLD handler, allowing catch_child_signal to copy
|
||||
it into lib_child_handler. This is a hacky workaround to get
|
||||
glib's g_unix_signal_handler into lib_child_handler.
|
||||
/* Tickle Glib's child-handling code. Ask Glib to install a
|
||||
watch source for Emacs itself which will initialize glib's
|
||||
private SIGCHLD handler, allowing catch_child_signal to copy
|
||||
it into lib_child_handler. This is a hacky workaround to get
|
||||
glib's g_unix_signal_handler into lib_child_handler.
|
||||
|
||||
In Glib 2.37.5 (2013), commit 2e471acf changed Glib to
|
||||
always install a signal handler when g_child_watch_source_new
|
||||
is called and not just the first time it's called, and to
|
||||
reset signal handlers to SIG_DFL when it no longer has a
|
||||
watcher on that signal. Arrange for Emacs's signal handler
|
||||
to be reinstalled even if this happens.
|
||||
In Glib 2.37.5 (2013), commit 2e471acf changed Glib to
|
||||
always install a signal handler when g_child_watch_source_new
|
||||
is called and not just the first time it's called, and to
|
||||
reset signal handlers to SIG_DFL when it no longer has a
|
||||
watcher on that signal. Arrange for Emacs's signal handler
|
||||
to be reinstalled even if this happens.
|
||||
|
||||
In Glib 2.73.2 (2022), commit f615eef4 changed Glib again,
|
||||
to not install a signal handler if the system supports
|
||||
pidfd_open and waitid (as in Linux kernel 5.3+). The hacky
|
||||
workaround is not needed in this case. */
|
||||
GSource *source = g_child_watch_source_new (getpid ());
|
||||
In Glib 2.73.2 (2022), commit f615eef4 changed Glib again,
|
||||
to not install a signal handler if the system supports
|
||||
pidfd_open and waitid (as in Linux kernel 5.3+). The hacky
|
||||
workaround is not needed in this case. */
|
||||
GSource *source = g_child_watch_source_new (getpid ());
|
||||
catch_child_signal ();
|
||||
g_source_unref (source);
|
||||
|
||||
if (lib_child_handler != dummy_handler)
|
||||
{
|
||||
/* The hacky workaround is needed on this platform. */
|
||||
signal_handler_t lib_child_handler_glib = lib_child_handler;
|
||||
catch_child_signal ();
|
||||
g_source_unref (source);
|
||||
|
||||
if (lib_child_handler != dummy_handler)
|
||||
{
|
||||
/* The hacky workaround is needed on this platform. */
|
||||
signal_handler_t lib_child_handler_glib = lib_child_handler;
|
||||
catch_child_signal ();
|
||||
eassert (lib_child_handler == dummy_handler);
|
||||
lib_child_handler = lib_child_handler_glib;
|
||||
}
|
||||
#else
|
||||
catch_child_signal ();
|
||||
#endif
|
||||
eassert (lib_child_handler == dummy_handler);
|
||||
lib_child_handler = lib_child_handler_glib;
|
||||
}
|
||||
#else
|
||||
catch_child_signal ();
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SETRLIMIT
|
||||
/* Don't allocate more than FD_SETSIZE file descriptors for Emacs itself. */
|
||||
|
|
|
|||
10
src/sysdep.c
10
src/sysdep.c
|
|
@ -165,9 +165,7 @@ maybe_disable_address_randomization (int argc, char **argv)
|
|||
|
||||
if (argc < 2 || strcmp (argv[1], aslr_disabled_option) != 0)
|
||||
{
|
||||
/* If dumping via unexec, ASLR must be disabled, as otherwise
|
||||
data may be scattered and undumpable as a simple executable.
|
||||
If pdumping, disabling ASLR lessens differences in the .pdmp file. */
|
||||
/* If pdumping, disabling ASLR lessens differences in the .pdmp file. */
|
||||
bool disable_aslr = will_dump_p ();
|
||||
# ifdef __PPC64__
|
||||
disable_aslr = true;
|
||||
|
|
@ -2036,12 +2034,6 @@ init_signals (void)
|
|||
main_thread_id = pthread_self ();
|
||||
#endif
|
||||
|
||||
/* Don't alter signal handlers if dumping with unexec. On some
|
||||
machines, changing signal handlers sets static data that would make
|
||||
signals fail to work right when the dumped Emacs is run. */
|
||||
if (will_dump_with_unexec_p ())
|
||||
return;
|
||||
|
||||
sigfillset (&process_fatal_action.sa_mask);
|
||||
process_fatal_action.sa_handler = deliver_fatal_signal;
|
||||
process_fatal_action.sa_flags = emacs_sigaction_flags ();
|
||||
|
|
|
|||
|
|
@ -318,37 +318,8 @@ tzlookup (Lisp_Object zone, bool settz)
|
|||
void
|
||||
init_timefns (void)
|
||||
{
|
||||
#ifdef HAVE_UNEXEC
|
||||
/* A valid but unlikely setting for the TZ environment variable.
|
||||
It is OK (though a bit slower) if the user chooses this value. */
|
||||
static char dump_tz_string[] = "TZ=UtC0";
|
||||
|
||||
/* When just dumping out, set the time zone to a known unlikely value
|
||||
and skip the rest of this function. */
|
||||
if (will_dump_with_unexec_p ())
|
||||
{
|
||||
xputenv (dump_tz_string);
|
||||
tzset ();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
char *tz = getenv ("TZ");
|
||||
|
||||
#ifdef HAVE_UNEXEC
|
||||
/* If the execution TZ happens to be the same as the dump TZ,
|
||||
change it to some other value and then change it back,
|
||||
to force the underlying implementation to reload the TZ info.
|
||||
This is needed on implementations that load TZ info from files,
|
||||
since the TZ file contents may differ between dump and execution. */
|
||||
if (tz && strcmp (tz, &dump_tz_string[tzeqlen]) == 0)
|
||||
{
|
||||
++*tz;
|
||||
tzset ();
|
||||
--*tz;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set the time zone rule now, so that the call to putenv is done
|
||||
before multiple threads are active. */
|
||||
tzlookup (tz ? build_string (tz) : Qwall, true);
|
||||
|
|
|
|||
|
|
@ -617,31 +617,6 @@ sys_calloc (size_t number, size_t size)
|
|||
return ptr;
|
||||
}
|
||||
|
||||
#if defined HAVE_UNEXEC && defined ENABLE_CHECKING
|
||||
void
|
||||
report_temacs_memory_usage (void)
|
||||
{
|
||||
DWORD blocks_used = 0;
|
||||
size_t large_mem_used = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < blocks_number; i++)
|
||||
if (blocks[i].occupied)
|
||||
{
|
||||
blocks_used++;
|
||||
large_mem_used += blocks[i].size;
|
||||
}
|
||||
|
||||
/* Emulate 'message', which writes to stderr in non-interactive
|
||||
sessions. */
|
||||
fprintf (stderr,
|
||||
"Dump memory usage: Heap: %" PRIu64 " Large blocks(%lu/%lu): %" PRIu64 "/%" PRIu64 "\n",
|
||||
(unsigned long long)committed, blocks_used, blocks_number,
|
||||
(unsigned long long)large_mem_used,
|
||||
(unsigned long long)(dumped_data + DUMPED_HEAP_SIZE - bc_limit));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Emulate getpagesize. */
|
||||
int
|
||||
getpagesize (void)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Heap management routines (including unexec) for GNU Emacs on Windows NT.
|
||||
/* Heap management routines for GNU Emacs on Windows NT.
|
||||
Copyright (C) 1994, 2001-2024 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Emacs.
|
||||
|
|
|
|||
|
|
@ -634,6 +634,4 @@ syms_of_w32image (void)
|
|||
void
|
||||
globals_of_w32image (void)
|
||||
{
|
||||
/* This is only needed in an unexec build. */
|
||||
memset (&last_encoder, 0, sizeof last_encoder);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue