Merge from emacs-23; up to 2010-06-12T17:12:15Z!cyd@stupidchicken.com.
[bpt/emacs.git] / src / unexelf.c
index e4d26b3..8b45894 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 2001,
-                 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+/* Copyright (C) 1985-1988, 1990, 1992, 1999-2011
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -386,13 +385,10 @@ temacs:
 /* We do not use mmap because that fails with NFS.
    Instead we read the whole file, modify it, and write it out.  */
 
-#ifndef emacs
-#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
-#include <string.h>
-#else
 #include <config.h>
+#include <unexec.h>
+
 extern void fatal (const char *msgid, ...);
-#endif
 
 #include <sys/types.h>
 #include <stdio.h>
@@ -403,7 +399,7 @@ extern void fatal (const char *msgid, ...);
 #include <fcntl.h>
 #if !defined (__NetBSD__) && !defined (__OpenBSD__)
 #include <elf.h>
-#endif
+#endif /* not __NetBSD__ and not __OpenBSD__ */
 #include <sys/mman.h>
 #if defined (_SYSTYPE_SYSV)
 #include <sys/elf_mips.h>
@@ -524,10 +520,6 @@ typedef struct {
 # define ElfW(type) ElfExpandBitsW (ELFSIZE, type)
 #endif
 
-#ifndef ELF_BSS_SECTION_NAME
-#define ELF_BSS_SECTION_NAME ".bss"
-#endif
-
 /* Get the address of a particular section or program header entry,
  * accounting for the size of the entries.
  */
@@ -559,8 +551,6 @@ typedef struct {
      (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
 #define NEW_SECTION_H(n) \
      (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
-#define OLD_PROGRAM_H(n) \
-     (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
 #define NEW_PROGRAM_H(n) \
      (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
 
@@ -629,6 +619,10 @@ unexec (const char *new_name, const char *old_name)
 {
   int new_file, old_file, new_file_size;
 
+#if defined (emacs) || !defined (DEBUG)
+  void *new_break;
+#endif
+
   /* Pointers to the base of the image of the two files.  */
   caddr_t old_base, new_base;
 
@@ -657,7 +651,9 @@ unexec (const char *new_name, const char *old_name)
   int n, nn;
   int old_bss_index, old_sbss_index, old_plt_index;
   int old_data_index, new_data2_index;
+#if defined _SYSTYPE_SYSV || defined __sgi
   int old_mdebug_index;
+#endif
   struct stat stat_buf;
   int old_file_size;
 
@@ -701,8 +697,10 @@ unexec (const char *new_name, const char *old_name)
 
   /* Find the mdebug section, if any.  */
 
+#if defined _SYSTYPE_SYSV || defined __sgi
   old_mdebug_index = find_section (".mdebug", old_section_names,
                                   old_name, old_file_h, old_section_h, 1);
+#endif
 
   /* Find the old .bss section.  Figure out parameters of the new
      data2 and bss sections.  */
@@ -759,7 +757,8 @@ unexec (const char *new_name, const char *old_name)
                                 old_name, old_file_h, old_section_h, 0);
 
 #if defined (emacs) || !defined (DEBUG)
-  new_bss_addr = (ElfW(Addr)) sbrk (0);
+  new_break = sbrk (0);
+  new_bss_addr = (ElfW(Addr)) new_break;
 #else
   new_bss_addr = old_bss_addr + old_bss_size + 0x1234;
 #endif
@@ -960,13 +959,13 @@ temacs:
        Link    Info    Adralgn      Entsize
 
 [22]   1       3       0x335150     0x315150     0x4           .data.rel.local
-       0       0       0x4          0            
+       0       0       0x4          0
 
 [23]   8       3       0x335158     0x315158     0x42720       .bss
-       0       0       0x8          0            
+       0       0       0x8          0
 
 [24]   2       0       0            0x315154     0x1c9d0       .symtab
-       25      1709    0x4          0x10         
+       25      1709    0x4          0x10
          */
 
          if (NEW_SECTION_H (nn).sh_offset >= old_bss_offset
@@ -1234,8 +1233,8 @@ temacs:
       ElfW(Shdr) section = NEW_SECTION_H (n);
 
       /* Cause a compilation error if anyone uses n instead of nn below.  */
-      struct {int a;} n;
-      (void)n.a;               /* Prevent `unused variable' warnings.  */
+      #define n ((void) 0);
+      n /* Prevent 'macro "n" is not used' warnings.  */
 
       switch (section.sh_type)
        {
@@ -1282,18 +1281,15 @@ temacs:
            }
          break;
        }
+
+      #undef n
     }
 
   /* Write out new_file, and free the buffers.  */
 
   if (write (new_file, new_base, new_file_size) != new_file_size)
-#ifndef emacs
-    fatal ("Didn't write %d bytes: errno %d\n",
-          new_file_size, errno);
-#else
     fatal ("Didn't write %d bytes to %s: errno %d\n",
           new_file_size, new_name, errno);
-#endif
   munmap (old_base, old_file_size);
   munmap (new_base, new_file_size);
 
@@ -1318,6 +1314,3 @@ temacs:
   if (chmod (new_name, stat_buf.st_mode) == -1)
     fatal ("Can't chmod (%s): errno %d\n", new_name, errno);
 }
-
-/* arch-tag: e02e1512-95e2-4ef0-bba7-b6bce658f1e3
-   (do not change this comment) */