summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-08-23 21:35:23 +0000
committerRichard M. Stallman <rms@gnu.org>1994-08-23 21:35:23 +0000
commit8917361f1ffd35abaa79e557bb20ca1b28ab6043 (patch)
tree58ee77e76ce391ea8473efb03ca37132ad88ef1e
parentb16234d8488edb56683281319169c861ebd5667c (diff)
downloademacs-8917361f1ffd35abaa79e557bb20ca1b28ab6043.tar.gz
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
-rw-r--r--src/unexelf.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/unexelf.c b/src/unexelf.c
index a7f607e3de8..d1badcbda66 100644
--- a/src/unexelf.c
+++ b/src/unexelf.c
@@ -725,20 +725,23 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
/* If any section hdr refers to the section after the new .data
section, make it refer to next one because we have inserted
- a new section in between. */
+ a new section in between. */
PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
- PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
-
- /* Now, start to copy the content of sections. */
+ /* For symbol tables, info is a symbol table index,
+ so don't change it. */
+ if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
+ && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
+ PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
+
+ /* Now, start to copy the content of sections. */
if (NEW_SECTION_H (nn).sh_type == SHT_NULL
|| NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
continue;
/* Write out the sections. .data and .data1 (and data2, called
- * ".data" in the strings table) get copied from the current process
- * instead of the old file.
- */
+ ".data" in the strings table) get copied from the current process
+ instead of the old file. */
if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
|| !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
".data1"))
@@ -749,7 +752,7 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
NEW_SECTION_H (nn).sh_size);
- /* If it is the symbol table, its st_shndx field needs to be patched. */
+ /* If it is the symbol table, its st_shndx field needs to be patched. */
if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
|| NEW_SECTION_H (nn).sh_type == SHT_DYNSYM)
{
@@ -769,7 +772,7 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
}
}
- /* Update the symbol values of _edata and _end. */
+ /* Update the symbol values of _edata and _end. */
for (n = new_file_h->e_shnum - 1; n; n--)
{
byte *symnames;
@@ -789,7 +792,7 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
}
- /* Close the files and make the new file executable */
+ /* Close the files and make the new file executable. */
if (close (old_file))
fatal ("Can't close (%s): errno %d\n", old_name, errno);