aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarl Heuer1995-05-16 01:46:20 +0000
committerKarl Heuer1995-05-16 01:46:20 +0000
commit04f903c09aa37259be40a39eeadf344e1ae7eb1a (patch)
tree1603c7750265fac20544c0aaec473eeda985ac5f /src
parent4dee6d0d08ae33201aa74fc5fb39ca556a0ab7e6 (diff)
downloademacs-04f903c09aa37259be40a39eeadf344e1ae7eb1a.tar.gz
emacs-04f903c09aa37259be40a39eeadf344e1ae7eb1a.zip
(unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
systems that don't support MAP_SHARED with PROT_WRITE.
Diffstat (limited to 'src')
-rw-r--r--src/unexelf.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/unexelf.c b/src/unexelf.c
index edfaedb1dd2..c61f4c368f1 100644
--- a/src/unexelf.c
+++ b/src/unexelf.c
@@ -583,8 +583,13 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
583 if (ftruncate (new_file, new_file_size)) 583 if (ftruncate (new_file, new_file_size))
584 fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); 584 fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
585 585
586#ifdef UNEXEC_USE_MAP_PRIVATE
587 new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
588 new_file, 0);
589#else
586 new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED, 590 new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED,
587 new_file, 0); 591 new_file, 0);
592#endif
588 593
589 if (new_base == (caddr_t) -1) 594 if (new_base == (caddr_t) -1)
590 fatal ("Can't mmap (%s): errno %d\n", new_name, errno); 595 fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
@@ -802,6 +807,14 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
802 memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr)); 807 memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
803 } 808 }
804 809
810#ifdef UNEXEC_USE_MAP_PRIVATE
811 if (lseek (new_file, 0, SEEK_SET) == -1)
812 fatal ("Can't rewind (%s): errno %d\n", new_name, errno);
813
814 if (write (new_file, new_base, new_file_size) != new_file_size)
815 fatal ("Can't write (%s): errno %d\n", new_name, errno);
816#endif
817
805 /* Close the files and make the new file executable. */ 818 /* Close the files and make the new file executable. */
806 819
807 if (close (old_file)) 820 if (close (old_file))