Commit 043131c4 authored by Andrew Choi's avatar Andrew Choi

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.
parent 6d59ebc3
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
......
......@@ -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.
......
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.
......
......@@ -95,6 +95,10 @@ Boston, MA 02111-1307, USA. */
#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 @@ 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment