From c00b42d59c296ef9b0660afd7b31e1d3c10972e7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 8 Nov 2015 09:29:00 -0800 Subject: [PATCH 07/11] ELF unexec: R_*_NONE relocs These should be ignored on all targets. * unexelf.c (unexec): Ignore R_*_NONE relocs for any target, not just Alpha. Comment on reloc size assumption. --- src/unexelf.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/unexelf.c b/src/unexelf.c index df99f92..15a4cde 100644 --- a/src/unexelf.c +++ b/src/unexelf.c @@ -1202,7 +1202,7 @@ temacs: } /* This loop seeks out relocation sections for the data section, so - that it can undo relocations performed by the runtime linker. */ + that it can undo relocations performed by the runtime loader. */ for (n = new_file_h->e_shnum; 0 < --n; ) { ElfW (Shdr) *rel_shdr = &NEW_SECTION_H (n); @@ -1235,14 +1235,14 @@ temacs: reloc += rel_shdr->sh_entsize) { ElfW (Addr) addr = ((ElfW (Rel) *) reloc)->r_offset - offset; -#ifdef __alpha__ - /* The Alpha ELF binutils currently have a bug that - sometimes results in relocs that contain all - zeroes. Work around this for now... */ + /* Ignore R_*_NONE relocs. */ if (((ElfW (Rel) *) reloc)->r_offset == 0) continue; -#endif - memcpy (new_base + addr, old_base + addr, sizeof (ElfW (Addr))); + /* Assume reloc applies to a word. + ??? This is not always true, eg. TLS module/index + pair in .got which occupies two words. */ + memcpy (new_base + addr, old_base + addr, + sizeof (ElfW (Addr))); } } break; -- 2.7.4