summaryrefslogtreecommitdiff
path: root/src/unexsgi.c
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1999-06-13 22:48:46 +0000
committerKarl Heuer <kwzh@gnu.org>1999-06-13 22:48:46 +0000
commit914eeff99a4903612321ddfbe208a1ac22844b30 (patch)
treedd536e1b6d2e55ecdf386b93cd94d65a98af26bb /src/unexsgi.c
parent9c332a804d6c9508659ad2f4c7a5ec0ea7dcce7d (diff)
downloademacs-914eeff99a4903612321ddfbe208a1ac22844b30.tar.gz
(unexec): Dump the .rodata section from memory
under IRIX6.5 in order to be able to unexec with gcc.
Diffstat (limited to 'src/unexsgi.c')
-rw-r--r--src/unexsgi.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/src/unexsgi.c b/src/unexsgi.c
index 3f238592546..cd0067f08d9 100644
--- a/src/unexsgi.c
+++ b/src/unexsgi.c
@@ -412,6 +412,7 @@ Filesz Memsz Flags Align
*/
+#include <config.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
@@ -758,15 +759,17 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
NEW_SECTION_H (nn).sh_size = 0;
}
else
- memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
- old_file_h->e_shentsize);
+ {
+ memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
+ old_file_h->e_shentsize);
- /* Any section that was original placed AFTER the bss
- section must now be adjusted by NEW_OFFSETS_SHIFT. */
+ /* Any section that was original placed AFTER the bss
+ section must now be adjusted by NEW_OFFSETS_SHIFT. */
+
+ if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
+ NEW_SECTION_H (nn).sh_offset += new_offsets_shift;
+ }
- if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
- NEW_SECTION_H (nn).sh_offset += new_offsets_shift;
-
/* 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. */
@@ -786,9 +789,18 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
/* 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. */
- if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
- || !strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data1")
- || !strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".got"))
+ if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
+ || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data1")
+#ifdef IRIX6_5
+ /* Under IRIX 6.5 gcc places objects with adresses relative to
+ shared symbols in the section .rodata, which are adjusted at
+ startup time. Unfortunately they aren't adjusted after unexec,
+ so with this configuration we must get .rodata also from memory.
+ Do any other configurations need this, too?
+ <Wolfgang.Glas@hfm.tu-graz.ac.at> 1999-06-08. */
+ || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".rodata")
+#endif
+ || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".got"))
src = (caddr_t) OLD_SECTION_H (n).sh_addr;
else
src = old_base + OLD_SECTION_H (n).sh_offset;
@@ -859,9 +871,9 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
+ new_base);
for (; num--; sym++)
{
+ /* don't patch special section indices. */
if (sym->st_shndx == SHN_UNDEF
- || sym->st_shndx == SHN_ABS
- || sym->st_shndx == SHN_COMMON)
+ || sym->st_shndx >= SHN_LORESERVE)
continue;
PATCH_INDEX (sym->st_shndx);