Mercurial > emacs
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))