diff options
Diffstat (limited to 'src/unexcoff.c')
-rw-r--r-- | src/unexcoff.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/unexcoff.c b/src/unexcoff.c index 5710ac04570..043f3348d16 100644 --- a/src/unexcoff.c +++ b/src/unexcoff.c @@ -65,6 +65,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <crt0.h> /* for _crt0_startup_flags and its bits */ #include <sys/exceptn.h> static int save_djgpp_startup_flags; +#include <libc/atexit.h> +static struct __atexit *save_atexit_ptr; #define filehdr external_filehdr #define scnhdr external_scnhdr #define syment external_syment @@ -82,7 +84,7 @@ struct aouthdr unsigned long text_start;/* base of text used for this file */ unsigned long data_start;/* base of data used for this file */ }; -#endif /* not MSDOS */ +#endif /* MSDOS */ #else /* not HAVE_COFF_H */ #include <a.out.h> #endif /* not HAVE_COFF_H */ @@ -368,6 +370,12 @@ copy_text_and_data (int new, int a_out) and which might change the way that dumped Emacs works. */ save_djgpp_startup_flags = _crt0_startup_flags; _crt0_startup_flags &= ~(_CRT0_FLAG_NO_LFN | _CRT0_FLAG_NEARPTR); + + /* Zero out the 'atexit' chain in the dumped executable, to avoid + calling the atexit functions twice. (emacs.c:main installs an + atexit function.) */ + save_atexit_ptr = __atexit_ptr; + __atexit_ptr = NULL; #endif lseek (new, (long) text_scnptr, 0); @@ -386,6 +394,9 @@ copy_text_and_data (int new, int a_out) /* Restore the startup flags. */ _crt0_startup_flags = save_djgpp_startup_flags; + + /* Restore the atexit chain. */ + __atexit_ptr = save_atexit_ptr; #endif |