Mercurial > emacs
changeset 52961:d9dc58d31ffb
These are Nozomu Ando's changes to build Emacs to run under X Window
in Mac OS X without the need to use static X11 libraries.
author | Andrew Choi <akochoi@shaw.ca> |
---|---|
date | Fri, 31 Oct 2003 19:42:47 +0000 |
parents | 03e927b45498 |
children | 19c95cdf2c4a |
files | mac/ChangeLog mac/INSTALL src/ChangeLog src/unexmacosx.c |
diffstat | 4 files changed, 90 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/mac/ChangeLog Fri Oct 31 17:25:20 2003 +0000 +++ b/mac/ChangeLog Fri Oct 31 19:42:47 2003 +0000 @@ -1,3 +1,9 @@ +2003-10-31 Andrew Choi <akochoi@shaw.ca> + + * INSTALL: Add Nozomu Ando's changes to instructions for + installing on X Window (that static libraries are no longer + necessary after his changes to src/unexmacosx.c). + 2003-04-28 Andrew Choi <akochoi@shaw.ca> * make-package: Allocate 5% extra space on disk image for
--- a/mac/INSTALL Fri Oct 31 17:25:20 2003 +0000 +++ b/mac/INSTALL Fri Oct 31 19:42:47 2003 +0000 @@ -58,16 +58,11 @@ correctly. You may want to create a symlink or alias to this path to quickly access both the terminal and GUI versions. -If you are building Emacs to run on Mac OS X and X Window, you need to -create a directory containing statically-linked X libraries. +If you are building Emacs to run on Mac OS X and X Window, +instead of typing `./configure' above, type - sudo mkdir /usr/X11R6/libstatic - cd /usr/X11R6/libstatic - sudo ln -s ../lib/lib*.a ../lib/X11 . + ./configure --without-carbon --with-x -Instead of typing `./configure' above, type - - ./configure --without-carbon --with-x --x-libraries=/usr/X11R6/libstatic To use colors in a terminal, put the following lines in the file ~/.termcap and log in again. @@ -159,11 +154,6 @@ $prefix/bin/emacs to reduce disk space. Note, this option may removed in the future. -If you are intending to build a binary distribution for X windows, you -will probably want to follow the directions above to create static -X11R6 libraries and run the make-package script like this - -./make-package --with-x -C,--x-libraries=/usr/X11R6/libstatic For usage of other options, use the --help option.
--- a/src/ChangeLog Fri Oct 31 17:25:20 2003 +0000 +++ b/src/ChangeLog Fri Oct 31 19:42:47 2003 +0000 @@ -1,3 +1,9 @@ +2003-10-31 Andrew Choi <akochoi@shaw.ca> + + * unexmacosx.c (unrelocate): New function (contributed by Nozomu + Ando). + (copy_dysymtab): Call it. + 2003-10-31 Luc Teirlinck <teirllm@auburn.edu> * eval.c (Fdefvaralias): Doc fix.
--- a/src/unexmacosx.c Fri Oct 31 17:25:20 2003 +0000 +++ b/src/unexmacosx.c Fri Oct 31 19:42:47 2003 +0000 @@ -95,6 +95,10 @@ #include <unistd.h> #include <mach/mach.h> #include <mach-o/loader.h> +#include <mach-o/reloc.h> +#if defined (__ppc__) +#include <mach-o/ppc/reloc.h> +#endif #include <objc/malloc.h> #define VERBOSE 1 @@ -158,6 +162,11 @@ malloc_zone_t *emacs_zone; +/* file offset of input file's data segment */ +off_t data_segment_old_fileoff; + +struct segment_command *data_segment_scp; + /* Read n bytes from infd into memory starting at address dest. Return true if successful, false otherwise. */ static int @@ -763,6 +772,65 @@ curr_header_offset += lc->cmdsize; } +/* Fix up relocation entries. */ +static void +unrelocate (const char *name, off_t reloff, int nrel) +{ + int i, unreloc_count; + struct relocation_info reloc_info; + struct scattered_relocation_info *sc_reloc_info + = (struct scattered_relocation_info *) &reloc_info; + + for (unreloc_count = 0, i = 0; i < nrel; i++) + { + if (lseek (infd, reloff, L_SET) != reloff) + unexec_error ("unrelocate: %s:%d cannot seek to reloc_info", name, i); + if (!unexec_read (&reloc_info, sizeof (reloc_info))) + unexec_error ("unrelocate: %s:%d cannot read reloc_info", name, i); + reloff += sizeof (reloc_info); + + if (sc_reloc_info->r_scattered == 0) + switch (reloc_info.r_type) + { + case GENERIC_RELOC_VANILLA: + if (reloc_info.r_address >= data_segment_scp->vmaddr + && reloc_info.r_address < (data_segment_scp->vmaddr + + data_segment_scp->vmsize)) + { + off_t src_off = data_segment_old_fileoff + + reloc_info.r_address - data_segment_scp->vmaddr; + off_t dst_off = data_segment_scp->fileoff + + reloc_info.r_address - data_segment_scp->vmaddr; + + if (!unexec_copy (dst_off, src_off, 1 << reloc_info.r_length)) + unexec_error ("unrelocate: %s:%d cannot copy original value", + name, i); + unreloc_count++; + } + break; + default: + unexec_error ("unrelocate: %s:%d cannot handle type = %d", + name, i, reloc_info.r_type); + } + else + switch (sc_reloc_info->r_type) + { +#if defined (__ppc__) + case PPC_RELOC_PB_LA_PTR: + /* nothing to do for prebound lazy pointer */ + break; +#endif + default: + unexec_error ("unrelocate: %s:%d cannot handle scattered type = %d", + name, i, sc_reloc_info->r_type); + } + } + + if (nrel > 0) + printf ("Fixed up %d/%d %s relocation entries in data segment.\n", + unreloc_count, nrel, name); +} + /* Copy a LC_DYSYMTAB load command from the input file to the output file, adjusting the file offset fields. */ static void @@ -770,10 +838,8 @@ { struct dysymtab_command *dstp = (struct dysymtab_command *) lc; - /* If Mach-O executable is not prebound, relocation entries need - fixing up. This is not supported currently. */ - if (!(mh.flags & MH_PREBOUND) && (dstp->nextrel != 0 || dstp->nlocrel != 0)) - unexec_error ("cannot handle LC_DYSYMTAB with relocation entries"); + unrelocate ("local", dstp->locreloff, dstp->nlocrel); + unrelocate ("external", dstp->extreloff, dstp->nextrel); if (dstp->nextrel > 0) { dstp->extreloff += delta; @@ -845,6 +911,11 @@ struct segment_command *scp = (struct segment_command *) lca[i]; if (strncmp (scp->segname, SEG_DATA, 16) == 0) { + /* save data segment file offset and segment_command for + unrelocate */ + data_segment_old_fileoff = scp->fileoff; + data_segment_scp = scp; + copy_data_segment (lca[i]); } else