From: Andrew Choi Date: Fri, 31 Oct 2003 19:42:47 +0000 (+0000) Subject: These are Nozomu Ando's changes to build Emacs to run under X Window X-Git-Tag: ttn-vms-21-2-B4~8446 X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/043131c4a79050465f9a7ca7b0d795acac470a0c 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. --- diff --git a/mac/ChangeLog b/mac/ChangeLog index 869ee8a415..5bf0f21a2d 100644 --- a/mac/ChangeLog +++ b/mac/ChangeLog @@ -1,3 +1,9 @@ +2003-10-31 Andrew Choi + + * 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 * make-package: Allocate 5% extra space on disk image for diff --git a/mac/INSTALL b/mac/INSTALL index 1c44aa529f..79007f8c32 100644 --- a/mac/INSTALL +++ b/mac/INSTALL @@ -58,16 +58,11 @@ must be typed to the shell to enable Emacs to locate its resources 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 @@ options to user $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. diff --git a/src/ChangeLog b/src/ChangeLog index be63443b4b..05d375e5da 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2003-10-31 Andrew Choi + + * unexmacosx.c (unrelocate): New function (contributed by Nozomu + Ando). + (copy_dysymtab): Call it. + 2003-10-31 Luc Teirlinck * eval.c (Fdefvaralias): Doc fix. diff --git a/src/unexmacosx.c b/src/unexmacosx.c index d3afaf47cc..b853232597 100644 --- a/src/unexmacosx.c +++ b/src/unexmacosx.c @@ -95,6 +95,10 @@ Boston, MA 02111-1307, USA. */ #include #include #include +#include +#if defined (__ppc__) +#include +#endif #include #define VERBOSE 1 @@ -158,6 +162,11 @@ int in_dumped_exec = 0; 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 @@ copy_symtab (struct load_command *lc) 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 @@ copy_dysymtab (struct load_command *lc) { 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 @@ dump_it () 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