diff options
| author | Karl Heuer | 1995-05-16 01:46:20 +0000 |
|---|---|---|
| committer | Karl Heuer | 1995-05-16 01:46:20 +0000 |
| commit | 04f903c09aa37259be40a39eeadf344e1ae7eb1a (patch) | |
| tree | 1603c7750265fac20544c0aaec473eeda985ac5f /src | |
| parent | 4dee6d0d08ae33201aa74fc5fb39ca556a0ab7e6 (diff) | |
| download | emacs-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.c | 13 |
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)) |