diff options
author | Dan Nicolaescu <dann@ics.uci.edu> | 2008-06-26 04:24:54 +0000 |
---|---|---|
committer | Dan Nicolaescu <dann@ics.uci.edu> | 2008-06-26 04:24:54 +0000 |
commit | f2a77c3a41744e43b52f0ac7a2c9bd7f8d406ae1 (patch) | |
tree | 05d027376fd22d8624eefdd512362109f7b2389a /src/unexnext.c | |
parent | 3617b1eb8da69a836148741cd35a7d8ec59191af (diff) | |
download | emacs-f2a77c3a41744e43b52f0ac7a2c9bd7f8d406ae1.tar.gz |
* unexnext.c:
* m/ews4800.h:
* m/hp9000s300.h:
* m/ibm370aix.h:
* m/mips-siemens.h:
* m/ncr386.h:
* m/next.h:
* m/pmax.h:
* m/powerpcle.h:
* m/tandem-s2.h:
* s/386bsd.h:
* s/bsd386.h:
* s/bsd4-1.h:
* s/bsd4-2.h:
* s/bsdos2-1.h:
* s/bsdos2.h:
* s/bsdos3.h:
* s/bsdos4.h:
* s/nextstep.h:
* s/ultrix4-3.h:
* s/usg5-0.h:
* s/usg5-2-2.h:
* s/usg5-2.h:
* s/usg5-4-3.h:
* s/ux4800.h:
* s/uxpds.h:
* s/uxpv.h: Remove support for obsolete systems.
* s/hpux.h, s/hpux10.h, s/hpux8.h, s/hpux9.h, s/hpux9shr.h:
Remove, insert contents in s/hpux-10.20.h
* s/aix3-1.h, s/aix3-2-5.h, s/aix3-2.h, s/aix4-1.h, s/aix4.h:
Remove, insert contents in s/aix-4.2.h
* s/usg5-3.h: Remove, insert contents in s/usg5-4.h.
* s/bsd4-3.h: Rename to ..
* s/bsd-common.h: ... this.
* src/data.c:
* src/doc.c:
* src/ecrt0.c:
* src/emacs.c:
* src/fileio.c:
* src/floatfns.c:
* src/keyboard.c:
* src/mem-limits.h:
* src/print.c:
* src/process.c:
* src/sysdep.c:
* src/syssignal.h:
* src/systty.h:
* src/syswait.h:
* src/term.c:
* src/unexec.c:
* src/unexelf.c:
* src/unexhp9k800.c:
* src/m/hp800.h:
* src/m/ibmrs6000.h:
* src/m/mips.h:
* src/m/vax.h:
* src/s/darwin.h:
* src/s/freebsd.h:
* src/s/gnu.h:
* src/s/ms-w32.h:
* src/s/msdos.h:
* src/s/netbsd.h:
* src/s/template.h: Remove references to obsolete variables.
* Makefile.in: Add dependencies for all unexec files.
(admindir): Remove unused variable.
(UNEXEC_SRC): Remove references.
* config.nt: Remove reference to UNEXEC_SRC.
* lwlib.c: Remove references to obsolete variables.
* fakemail.c: Remove references to obsolete variables.
* os.texi: Remove references to obsolete systems.
* configure.in:
* configure: Remove references to obsolete systems.
Diffstat (limited to 'src/unexnext.c')
-rw-r--r-- | src/unexnext.c | 514 |
1 files changed, 0 insertions, 514 deletions
diff --git a/src/unexnext.c b/src/unexnext.c deleted file mode 100644 index 3ed54a59db8..00000000000 --- a/src/unexnext.c +++ /dev/null @@ -1,514 +0,0 @@ -/* Dump Emacs in macho format. - Copyright (C) 1990, 1993, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - Written by Bradley Taylor (btaylor@next.com). - -This file is part of GNU Emacs. - -GNU Emacs is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ - - -#undef __STRICT_BSD__ - -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <mach/mach.h> -#include <mach-o/loader.h> -#include <mach-o/reloc.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <unistd.h> -/* Instead of unistd.h, this used to include libc.h. - "Nelson H. F. Beebe" <beebe@math.utah.edu> says that doesn't work - in system version 3.3. */ - - -int malloc_cookie; - -/* - * Kludge: we don't expect any program data beyond VM_HIGHDATA - * What is really needed is a way to find out from malloc() which - * 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 - * much larger on disk than it needs to be (because non-malloced data will - * be in the file). - */ -static const unsigned VM_HIGHDATA = 0x2000000; - -typedef struct region_t { - vm_address_t address; - vm_size_t size; - vm_prot_t protection; - vm_prot_t max_protection; - vm_inherit_t inheritance; - boolean_t shared; - port_t object_name; - vm_offset_t offset; -} region_t; - - -static void -grow( - struct load_command ***the_commands, - unsigned *the_commands_len - ) -{ - if (*the_commands == NULL) { - *the_commands_len = 1; - *the_commands = malloc(sizeof(*the_commands)); - } else { - (*the_commands_len)++; - *the_commands = realloc(*the_commands, - (*the_commands_len * - sizeof(**the_commands))); - } -} - - -static void -save_command( - struct load_command *command, - struct load_command ***the_commands, - unsigned *the_commands_len - ) -{ - struct load_command **tmp; - - grow(the_commands, the_commands_len); - tmp = &(*the_commands)[*the_commands_len - 1]; - *tmp = malloc(command->cmdsize); - bcopy(command, *tmp, command->cmdsize); -} - -static void -fatal_unexec(char *format, ...) -{ - va_list ap; - - va_start(ap, format); - fprintf(stderr, "unexec: "); - vfprintf(stderr, format, ap); - fprintf(stderr, "\n"); - va_end(ap); -} - -static int -read_macho( - int fd, - struct mach_header *the_header, - struct load_command ***the_commands, - unsigned *the_commands_len - ) -{ - struct load_command command; - struct load_command *buf; - int i; - int size; - - if (read(fd, the_header, sizeof(*the_header)) != sizeof(*the_header)) { - fatal_unexec("cannot read macho header"); - return (0); - } - for (i = 0; i < the_header->ncmds; i++) { - if (read(fd, &command, sizeof(struct load_command)) != - sizeof(struct load_command)) { - fatal_unexec("cannot read macho load command header"); - return (0); - } - size = command.cmdsize - sizeof(struct load_command); - if (size < 0) { - fatal_unexec("bogus load command size"); - return (0); - } - buf = malloc(command.cmdsize); - buf->cmd = command.cmd; - buf->cmdsize = command.cmdsize; - if (read(fd, ((char *)buf + - sizeof(struct load_command)), - size) != size) { - fatal_unexec("cannot read load command data"); - return (0); - } - save_command(buf, the_commands, the_commands_len); - } - return (1); -} - -static int -filldatagap( - vm_address_t start_address, - vm_size_t *size, - vm_address_t end_address - ) -{ - vm_address_t address; - vm_size_t gapsize; - - address = (start_address + *size); - gapsize = end_address - address; - *size += gapsize; - if (vm_allocate(task_self(), &address, gapsize, - FALSE) != KERN_SUCCESS) { - fatal_unexec("cannot vm_allocate"); - return (0); - } - return (1); -} - -static int -get_data_region( - vm_address_t *address, - vm_size_t *size - ) -{ - region_t region; - kern_return_t ret; - struct section *sect; - - sect = (struct section *) getsectbyname(SEG_DATA, SECT_DATA); - region.address = 0; - *address = 0; - for (;;) { - ret = vm_region(task_self(), - ®ion.address, - ®ion.size, - ®ion.protection, - ®ion.max_protection, - ®ion.inheritance, - ®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, - region.address)) { - return (0); - } - } - *size += region.size; - } else { - if (region.address == sect->addr) { - *address = region.address; - *size = region.size; - } - } - region.address += region.size; - } - return (1); -} - -static char * -my_malloc( - vm_size_t size - ) -{ - vm_address_t address; - - if (vm_allocate(task_self(), &address, size, TRUE) != KERN_SUCCESS) { - return (NULL); - } - return ((char *)address); -} - -static void -my_free( - char *buf, - vm_size_t size - ) -{ - vm_deallocate(task_self(), (vm_address_t)buf, size); -} - -static int -unexec_doit( - int infd, - int outfd - ) -{ - int i; - struct load_command **the_commands = NULL; - unsigned the_commands_len; - struct mach_header the_header; - int fgrowth = 0; - int fdatastart; - int fdatasize; - int size; - struct stat st; - char *buf; - vm_address_t data_address; - vm_size_t data_size; - vm_size_t vmaddr_growth = 0; - vm_size_t dataseg_vmaddr, dataseg_vmend; - - struct segment_command *segment; - -#ifdef NS_TARGET - unsigned long extreloff = 0; - unsigned long nextrel = 0; - struct dysymtab_command *dysymtab; - struct relocation_info reloc_info; -#endif - - if (!read_macho(infd, &the_header, &the_commands, &the_commands_len)) { - return (0); - } - - - malloc_cookie = malloc_freezedry (); - if (!get_data_region(&data_address, &data_size)) { - return (0); - } - - - /* - * DO NOT USE MALLOC IN THIS SECTION - */ - { - /* - * Fix offsets - */ - for (i = 0; i < the_commands_len; i++) { - switch (the_commands[i]->cmd) { - case LC_SEGMENT: - segment = ((struct segment_command *) - the_commands[i]); - if (strcmp(segment->segname, SEG_DATA) == 0) { - fdatastart = segment->fileoff; - fdatasize = segment->filesize; - fgrowth = (data_size - - segment->filesize); - segment->vmsize = data_size; - segment->filesize = data_size; - dataseg_vmaddr = segment->vmaddr; - dataseg_vmend = segment->vmaddr + segment->vmsize; - vmaddr_growth = segment->vmaddr + segment->vmsize; - } else { - ((struct segment_command *)the_commands[i])->fileoff += fgrowth; - } - - if( strcmp( segment->segname, SEG_LINKEDIT ) == 0 ) { - segment->vmaddr = vmaddr_growth; - } - - break; - case LC_SYMTAB: - ((struct symtab_command *) - the_commands[i])->symoff += fgrowth; - ((struct symtab_command *) - the_commands[i])->stroff += fgrowth; - break; - case LC_SYMSEG: - ((struct symseg_command *) - the_commands[i])->offset += fgrowth; - break; -#ifdef NS_TARGET - case LC_DYSYMTAB: - dysymtab = ((struct dysymtab_command *)the_commands[i]); - extreloff = dysymtab->extreloff; - nextrel = dysymtab->nextrel; - dysymtab->indirectsymoff += fgrowth; - dysymtab->extreloff += fgrowth; - break; -#endif - default: - break; - } - } - - /* - * Write 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) != - the_commands[i]->cmdsize) { - fatal_unexec("cannot write output file"); - return (0); - } - } - - /* - * Write original text - */ - 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) + - the_header.sizeofcmds); - buf = my_malloc(size); - if (read(infd, buf, size) != size) { - my_free(buf, size); - fatal_unexec("cannot read input file"); - } - if (write(outfd, buf, size) != size) { - my_free(buf, size); - fatal_unexec("cannot write output file"); - return (0); - } - my_free(buf, size); - - - /* - * Write new data - */ - if (write(outfd, (char *)data_address, - data_size) != data_size) { - fatal_unexec("cannot write output file"); - return (0); - } - - } - - /* - * OKAY TO USE MALLOC NOW - */ - - /* - * Write rest of file - */ - fstat(infd, &st); - if (lseek(infd, fdatasize, L_INCR) < 0) { - fatal_unexec("cannot seek input file"); - return (0); - } - size = st.st_size - lseek(infd, 0, L_INCR); - - buf = malloc(size); - if (read(infd, buf, size) != size) { - free(buf); - fatal_unexec("cannot read input file"); - return (0); - } - if (write(outfd, buf, size) != size) { - free(buf); - fatal_unexec("cannot write output file"); - return (0); - } - free(buf); - -#ifdef NS_TARGET - /* - * Fix up relocation entries in the data segment. - */ - - if (lseek(infd, extreloff, L_SET) < 0) { - fatal_unexec("cannot seek input file"); - return (0); - } - - for (i = 0; i < nextrel; i++) - { - long zeroval = 0; - - if (read(infd, &reloc_info, sizeof (reloc_info)) != sizeof (reloc_info)) { - fatal_unexec("cannot read input file"); - return (0); - } - if (reloc_info.r_address >= dataseg_vmaddr && reloc_info.r_address < dataseg_vmend) - { - if (lseek (outfd, fdatastart + reloc_info.r_address - dataseg_vmaddr, L_SET) < 0 ) { - fatal_unexec("cannot seek input file"); - return (0); - } - switch (reloc_info.r_length) { - case 0: - if (write(outfd, &zeroval, 1) != 1) { - fatal_unexec("cannot write output file"); - return (0); - } - break; - case 1: - if (write(outfd, &zeroval, 2) != 2) { - fatal_unexec("cannot write output file"); - return (0); - } - break; - case 2: - if (write(outfd, &zeroval, 4) != 4) { - fatal_unexec("cannot write output file"); - return (0); - } - break; - } - } - } -#endif - - return (1); -} - -void -unexec( - char *outfile, - char *infile - ) -{ - int infd; - int outfd; - char tmpbuf[L_tmpnam]; - char *tmpfile; - - infd = open(infile, O_RDONLY, 0); - if (infd < 0) { - fatal_unexec("cannot open input file `%s'", infile); - exit(1); - } - - tmpnam(tmpbuf); - tmpfile = rindex(tmpbuf, '/'); - if (tmpfile == NULL) { - tmpfile = tmpbuf; - } else { - tmpfile++; - } - outfd = open(tmpfile, O_WRONLY|O_TRUNC|O_CREAT, 0755); - if (outfd < 0) { - close(infd); - fatal_unexec("cannot open tmp file `%s'", tmpfile); - exit(1); - } - if (!unexec_doit(infd, outfd)) { - close(infd); - close(outfd); - unlink(tmpfile); - exit(1); - } - close(infd); - close(outfd); - if (rename(tmpfile, outfile) < 0) { - unlink(tmpfile); - fatal_unexec("cannot rename `%s' to `%s'", tmpfile, outfile); - exit(1); - } -} - -/* arch-tag: 9796bdc3-c050-417a-b2f5-4cfd31032634 - (do not change this comment) */ |