changeset 8952:0675fa3d65fa

(SUNOS4 or __FreeBSD__): Define UNDO_RELOCATION. (unexec): Test UNDO_RELOCATION. Distinguish the relocation formats of __FreeBSD__ and SUNOS4.
author Richard M. Stallman <rms@gnu.org>
date Tue, 20 Sep 1994 06:12:27 +0000
parents b628561b185b
children 231a4d114799
files src/unexsunos4.c
diffstat 1 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/unexsunos4.c	Tue Sep 20 05:51:50 1994 +0000
+++ b/src/unexsunos4.c	Tue Sep 20 06:12:27 1994 +0000
@@ -56,10 +56,22 @@
 #include <config.h>
 #endif
 
-#ifdef SUNOS4
+#if defined (SUNOS4) || defined (__FreeBSD__)
+#define UNDO_RELOCATION
+#endif
+
+#ifdef UNDO_RELOCATION
 #include <link.h>
 #endif
 
+#ifdef __FreeBSD__
+#define link_dynamic _dynamic
+#define ld_un d_un
+#define ld_2 d_sdt
+#define ld_rel sdt_rel
+#define ld_hash sdt_hash
+#endif /* __FreeBSD__ */
+
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -208,7 +220,7 @@
 
   /* Some other BSD systems use this file.
      We don't know whether this change is right for them.  */
-#ifdef SUNOS4
+#ifdef UNDO_RELOCATION
   /* Undo the relocations done at startup by ld.so.
      It will do these relocations again when we start the dumped Emacs.
      Doing them twice gives incorrect results.  */
@@ -219,6 +231,7 @@
     unsigned long rel, erel;
     unsigned rel_size;
 
+#ifdef SUNOS4
     if (_DYNAMIC.ld_version < 2)
       {
 	rel = _DYNAMIC.ld_un.ld_1->ld_rel;
@@ -243,6 +256,12 @@
       default:
 	fatal ("unknown machine type in unexec!\n");
       }
+#endif /* SUNOS4 */
+#ifdef __FreeBSD__
+    rel = _DYNAMIC.ld_un.ld_2->ld_rel;
+    erel = _DYNAMIC.ld_un.ld_2->ld_hash;
+    rel_size = 8;             /* sizeof(struct relocation_info) */
+#endif
 
     for (; rel < erel; rel += rel_size)
       {
@@ -259,7 +278,7 @@
         write (new, old + N_TXTOFF (ohdr) + rpos, sizeof (unsigned long));
       }
   }
-#endif /* SUNOS4 */
+#endif /* UNDO_RELOCATION */
 
   fchmod (new, 0755);
 }