summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mac/ChangeLog6
-rw-r--r--mac/INSTALL16
-rw-r--r--src/ChangeLog6
-rw-r--r--src/unexmacosx.c79
4 files changed, 90 insertions, 17 deletions
diff --git a/mac/ChangeLog b/mac/ChangeLog
index 869ee8a4158..5bf0f21a2db 100644
--- a/mac/ChangeLog
+++ b/mac/ChangeLog
@@ -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
diff --git a/mac/INSTALL b/mac/INSTALL
index 1c44aa529f8..79007f8c324 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 be63443b4bf..05d375e5da3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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.
diff --git a/src/unexmacosx.c b/src/unexmacosx.c
index d3afaf47cc1..b8532325973 100644
--- a/src/unexmacosx.c
+++ b/src/unexmacosx.c
@@ -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