aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Modra2015-11-08 09:29:00 -0800
committerPaul Eggert2015-11-08 10:00:59 -0800
commit190b968f189cb7d06223bb39045ec9055df67f68 (patch)
tree9335140975b6e9066773329d1fbd04d7ef6e9c88
parent47c6e3035b8182c6436de4673473de7824ad59f1 (diff)
downloademacs-190b968f189cb7d06223bb39045ec9055df67f68.tar.gz
emacs-190b968f189cb7d06223bb39045ec9055df67f68.zip
ELF unexec: Symbol table patching
No st_shndx value larger than SHN_LORESERVE should be changed. * unexelf.c (unexec): Don't adjust any st_shndx larger than SHN_LORESERVE. Error on SHN_XINDEX.
-rw-r--r--src/unexelf.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/unexelf.c b/src/unexelf.c
index 0065491b453..286ba2e99c1 100644
--- a/src/unexelf.c
+++ b/src/unexelf.c
@@ -1118,7 +1118,7 @@ temacs:
1118 } 1118 }
1119#endif /* __sgi */ 1119#endif /* __sgi */
1120 1120
1121 /* If it is the symbol table, its st_shndx field needs to be patched. */ 1121 /* Patch st_shndx field of symbol table. */
1122 if (new_shdr->sh_type == SHT_SYMTAB 1122 if (new_shdr->sh_type == SHT_SYMTAB
1123 || new_shdr->sh_type == SHT_DYNSYM) 1123 || new_shdr->sh_type == SHT_DYNSYM)
1124 { 1124 {
@@ -1126,9 +1126,10 @@ temacs:
1126 ElfW (Sym) *sym = (ElfW (Sym) *) (new_shdr->sh_offset + new_base); 1126 ElfW (Sym) *sym = (ElfW (Sym) *) (new_shdr->sh_offset + new_base);
1127 for (; num--; sym++) 1127 for (; num--; sym++)
1128 { 1128 {
1129 if ((sym->st_shndx == SHN_UNDEF) 1129 if (sym->st_shndx == SHN_XINDEX)
1130 || (sym->st_shndx == SHN_ABS) 1130 fatal ("SHT_SYMTAB_SHNDX unsupported");
1131 || (sym->st_shndx == SHN_COMMON)) 1131 if (sym->st_shndx == SHN_UNDEF
1132 || sym->st_shndx >= SHN_LORESERVE)
1132 continue; 1133 continue;
1133 1134
1134 PATCH_INDEX (sym->st_shndx); 1135 PATCH_INDEX (sym->st_shndx);