mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-30 13:58:34 +00:00
pie: piegen, x86 -- Fix relocs application
We should use provided @nr_relocs instead of ARRAY_SIZE here. Didn't spot it earlier simply because at moment on x86-64 there is no relocs at all. Also when we apply relocation they are to be computed from virtual base of parasite address, not from local memory map address, so add @vbase parameter. And fix typo on addend in gotpcrel. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
c84fa8c506
commit
5258d95eb9
@@ -236,14 +236,14 @@ int handle_elf(const piegen_opt_t *opts, void *mem, size_t size)
|
||||
case R_X86_64_32: /* Symbol + Addend (4 bytes) */
|
||||
pr_debug("\t\t\t\tR_X86_64_32 at 0x%-4lx val 0x%x\n", place, value32);
|
||||
pr_out(" { .offset = 0x%-8x, .type = 0, "
|
||||
".addend = 0 , .value = 0x%-16x, }, /* R_X86_64_32 */\n",
|
||||
(unsigned int)place, value32 + addend32);
|
||||
".addend = %-8d, .value = 0x%-16x, }, /* R_X86_64_32 */\n",
|
||||
(unsigned int)place, addend32, value32);
|
||||
break;
|
||||
case R_X86_64_64: /* Symbol + Addend (8 bytes) */
|
||||
pr_debug("\t\t\t\tR_X86_64_64 at 0x%-4lx val 0x%lx\n", place, value64);
|
||||
pr_out(" { .offset = 0x%-8x, .type = 1, "
|
||||
".addend = 0 , .value = 0x%-16lx, }, /* R_X86_64_64 */\n",
|
||||
(unsigned int)place, (long)(value64 + addend64));
|
||||
".addend = %-8ld, .value = 0x%-16lx, }, /* R_X86_64_64 */\n",
|
||||
(unsigned int)place, (long)addend64, (long)value64);
|
||||
break;
|
||||
case R_X86_64_PC32: /* Symbol + Addend - Place (4 bytes) */
|
||||
pr_debug("\t\t\t\tR_386_PC32 at 0x%-4lx val 0x%x\n", place, value32 + addend32 - (s32)place);
|
||||
@@ -304,11 +304,11 @@ int handle_elf(const piegen_opt_t *opts, void *mem, size_t size)
|
||||
|
||||
#if defined(CONFIG_X86_64) || defined(CONFIG_X86_32)
|
||||
pr_out(
|
||||
"static __maybe_unused void elf_apply_relocs(void *mem, size_t size, %s *elf_relocs, size_t nr_relocs)\n"
|
||||
"static __maybe_unused void elf_apply_relocs(void *mem, void *vbase, size_t size, %s *elf_relocs, size_t nr_relocs)\n"
|
||||
"{\n"
|
||||
" size_t i, j;\n"
|
||||
"\n"
|
||||
" for (i = 0, j = 0; i < ARRAY_SIZE(elf_relocs); i++) {\n"
|
||||
" for (i = 0, j = 0; i < nr_relocs; i++) {\n"
|
||||
" if (elf_relocs[i].type) {\n"
|
||||
" long *where = mem + elf_relocs[i].offset;\n"
|
||||
" long *p = mem + size;\n"
|
||||
@@ -317,16 +317,16 @@ pr_out(
|
||||
" int *value = (int *)where;\n"
|
||||
" int rel;\n"
|
||||
"\n"
|
||||
" p[j] = (long)mem + elf_relocs[i].value;\n"
|
||||
" rel = (unsigned)((void *)&p[j] - (void *)mem) - elf_relocs[i].offset - elf_relocs[i].addend;\n"
|
||||
" p[j] = (long)vbase + elf_relocs[i].value;\n"
|
||||
" rel = (unsigned)((void *)&p[j] - (void *)mem) - elf_relocs[i].offset + elf_relocs[i].addend;\n"
|
||||
"\n"
|
||||
" *value = rel;\n"
|
||||
" j++;\n"
|
||||
" } else\n"
|
||||
" *where = elf_relocs[i].value + elf_relocs[i].addend + (unsigned long)mem;\n"
|
||||
" *where = elf_relocs[i].value + elf_relocs[i].addend + (unsigned long)vbase;\n"
|
||||
" } else {\n"
|
||||
" int *where = (mem + elf_relocs[i].offset);\n"
|
||||
" *where = elf_relocs[i].value + elf_relocs[i].addend + (unsigned long)mem;\n"
|
||||
" *where = elf_relocs[i].value + elf_relocs[i].addend + (unsigned long)vbase;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n", opts->type_name);
|
||||
|
Reference in New Issue
Block a user