X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3e4a18035df9a598f80cbc6b2e190121e71bd426..5a9807a8bda5980633db765300dad40ee3aed2c6:/src/unexnext.c diff --git a/src/unexnext.c b/src/unexnext.c index e250245088..b374dd8e9b 100644 --- a/src/unexnext.c +++ b/src/unexnext.c @@ -1,5 +1,6 @@ /* Dump Emacs in macho format. - Copyright (C) 1990, 1993 Free Software Foundation, Inc. + Copyright (C) 1990, 1993, 2002, 2003, 2004, + 2005 Free Software Foundation, Inc. Written by Bradley Taylor (btaylor@next.com). This file is part of GNU Emacs. @@ -16,8 +17,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #undef __STRICT_BSD__ @@ -31,7 +32,9 @@ Boston, MA 02111-1307, USA. */ #include #include #include -/* Instead of unistd.h, this used to include libc.h. */ +/* Instead of unistd.h, this used to include libc.h. + "Nelson H. F. Beebe" says that doesn't work + in system version 3.3. */ int malloc_cookie; @@ -42,7 +45,7 @@ int malloc_cookie; * pages it vm_allocated and write only those out into the data segment. * * This kludge may break when we stop using fixed virtual address - * shared libraries. Actually, emacs will probably continue working, but be + * shared libraries. Actually, emacs will probably continue working, but be * much larger on disk than it needs to be (because non-malloced data will * be in the file). */ @@ -71,7 +74,7 @@ grow( *the_commands = malloc(sizeof(*the_commands)); } else { (*the_commands_len)++; - *the_commands = realloc(*the_commands, + *the_commands = realloc(*the_commands, (*the_commands_len * sizeof(**the_commands))); } @@ -123,7 +126,7 @@ read_macho( return (0); } for (i = 0; i < the_header->ncmds; i++) { - if (read(fd, &command, sizeof(struct load_command)) != + if (read(fd, &command, sizeof(struct load_command)) != sizeof(struct load_command)) { fatal_unexec("cannot read macho load command header"); return (0); @@ -136,8 +139,8 @@ read_macho( buf = malloc(command.cmdsize); buf->cmd = command.cmd; buf->cmdsize = command.cmdsize; - if (read(fd, ((char *)buf + - sizeof(struct load_command)), + if (read(fd, ((char *)buf + + sizeof(struct load_command)), size) != size) { fatal_unexec("cannot read load command data"); return (0); @@ -182,31 +185,31 @@ get_data_region( region.address = 0; *address = 0; for (;;) { - ret = vm_region(task_self(), - ®ion.address, - ®ion.size, - ®ion.protection, - ®ion.max_protection, + ret = vm_region(task_self(), + ®ion.address, + ®ion.size, + ®ion.protection, + ®ion.max_protection, ®ion.inheritance, - ®ion.shared, - ®ion.object_name, + ®ion.shared, + ®ion.object_name, ®ion.offset); if (ret != KERN_SUCCESS || region.address >= VM_HIGHDATA) { break; } if (*address != 0) { if (region.address > *address + *size) { - if (!filldatagap(*address, size, + if (!filldatagap(*address, size, region.address)) { return (0); } - } + } *size += region.size; } else { if (region.address == sect->addr) { *address = region.address; *size = region.size; - } + } } region.address += region.size; } @@ -291,7 +294,7 @@ unexec_doit( if (strcmp(segment->segname, SEG_DATA) == 0) { fdatastart = segment->fileoff; fdatasize = segment->filesize; - fgrowth = (data_size - + fgrowth = (data_size - segment->filesize); segment->vmsize = data_size; segment->filesize = data_size; @@ -330,37 +333,37 @@ unexec_doit( break; } } - + /* * Write header */ - if (write(outfd, &the_header, + if (write(outfd, &the_header, sizeof(the_header)) != sizeof(the_header)) { fatal_unexec("cannot write output file"); return (0); } - + /* * Write commands */ for (i = 0; i < the_commands_len; i++) { - if (write(outfd, the_commands[i], - the_commands[i]->cmdsize) != + if (write(outfd, the_commands[i], + the_commands[i]->cmdsize) != the_commands[i]->cmdsize) { fatal_unexec("cannot write output file"); return (0); } } - + /* * Write original text */ - if (lseek(infd, the_header.sizeofcmds + sizeof(the_header), + if (lseek(infd, the_header.sizeofcmds + sizeof(the_header), L_SET) < 0) { fatal_unexec("cannot seek input file"); return (0); } - size = fdatastart - (sizeof(the_header) + + size = fdatastart - (sizeof(the_header) + the_header.sizeofcmds); buf = my_malloc(size); if (read(infd, buf, size) != size) { @@ -373,17 +376,17 @@ unexec_doit( return (0); } my_free(buf, size); - - + + /* * Write new data */ - if (write(outfd, (char *)data_address, + if (write(outfd, (char *)data_address, data_size) != data_size) { fatal_unexec("cannot write output file"); return (0); } - + } /* @@ -422,7 +425,7 @@ unexec_doit( fatal_unexec("cannot seek input file"); return (0); } - + for (i = 0; i < nextrel; i++) { long zeroval = 0; @@ -480,7 +483,7 @@ unexec( fatal_unexec("cannot open input file `%s'", infile); exit(1); } - + tmpnam(tmpbuf); tmpfile = rindex(tmpbuf, '/'); if (tmpfile == NULL) { @@ -508,3 +511,6 @@ unexec( exit(1); } } + +/* arch-tag: 9796bdc3-c050-417a-b2f5-4cfd31032634 + (do not change this comment) */