changeset 8574:dd787a5353d1

Eliminate local var bss_end. Update the symbol values of _edata and _end.
author Richard M. Stallman <rms@gnu.org>
date Sat, 20 Aug 1994 00:48:16 +0000
parents a93b8c18e07a
children 2d50d249caf4
files src/unexelf.c
diffstat 1 files changed, 21 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/unexelf.c	Sat Aug 20 00:03:24 1994 +0000
+++ b/src/unexelf.c	Sat Aug 20 00:48:16 1994 +0000
@@ -475,7 +475,6 @@
      char *new_name, *old_name;
      unsigned data_start, bss_start, entry_address;
 {
-  extern unsigned int bss_end;
   int new_file, old_file, new_file_size;
 
   /* Pointers to the base of the image of the two files. */
@@ -548,8 +547,7 @@
   old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
   old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
 #if defined(emacs) || !defined(DEBUG)
-  bss_end = (unsigned int) sbrk (0);
-  new_bss_addr = (Elf32_Addr) bss_end;
+  new_bss_addr = (Elf32_Addr) sbrk (0);
 #else
   new_bss_addr = old_bss_addr + old_bss_size + 0x1234;
 #endif
@@ -771,6 +769,26 @@
 	}
     }
 
+  /* Update the symbol values of _edata and _end. */
+  for (n = new_file_h->e_shnum - 1; n; n--)
+    {
+      byte *symnames;
+      Elf32_Sym *symp, *symendp;
+
+      if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM
+	  && NEW_SECTION_H (n).sh_type != SHT_SYMTAB)
+	continue;
+
+      symnames = NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset + new_base;
+      symp = (Elf32_Sym *) (NEW_SECTION_H (n).sh_offset + new_base);
+      symendp = (Elf32_Sym *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
+
+      for (; symp < symendp; symp ++)
+	if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0
+	    || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0)
+	  memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
+    }
+
   /* Close the files and make the new file executable */
 
   if (close (old_file))