[CRIU] [PATCH] compel: Add R_X86_64{,_REX}_GOTPCRELX relocs

Dmitry Safonov dima at arista.com
Wed Oct 18 00:38:34 MSK 2017


Add handeling of R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX.
They are not that old, so I provided ifdef-guards for them.
According to x86-64 ABI specification paper, they should be
generated instead of R_X86_64_GOTPCREL for cases when relaxation
is possible.

At this moment we can handle them the same way like R_X86_64_GOTPCREL.

[0] https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r249.pdf

Fixes: #397

Cc: Cyrill Gorcunov <gorcunov at openvz.org>
Reported-by: Adrian Reber <areber at redhat.com>
Signed-off-by: Dmitry Safonov <dima at arista.com>
---
 compel/arch/x86/src/lib/include/handle-elf.h | 8 ++++++++
 compel/src/lib/handle-elf.c                  | 2 ++
 2 files changed, 10 insertions(+)

diff --git a/compel/arch/x86/src/lib/include/handle-elf.h b/compel/arch/x86/src/lib/include/handle-elf.h
index 08de8363..e68fe3bc 100644
--- a/compel/arch/x86/src/lib/include/handle-elf.h
+++ b/compel/arch/x86/src/lib/include/handle-elf.h
@@ -5,6 +5,14 @@
 
 #define ELF_X86_64
 
+#ifndef R_X86_64_GOTPCRELX
+# define R_X86_64_GOTPCRELX			41
+#endif
+
+#ifndef R_X86_64_REX_GOTPCRELX
+# define R_X86_64_REX_GOTPCRELX			42
+#endif
+
 #define __handle_elf				handle_elf_x86_64
 #define arch_is_machine_supported(e_machine)	(e_machine == EM_X86_64)
 
diff --git a/compel/src/lib/handle-elf.c b/compel/src/lib/handle-elf.c
index bf94d93b..f1cf74ff 100644
--- a/compel/src/lib/handle-elf.c
+++ b/compel/src/lib/handle-elf.c
@@ -517,6 +517,8 @@ int __handle_elf(void *mem, size_t size)
 				 */
 				*((int32_t *)where) = value32 + addend32 - place;
 				break;
+			case R_X86_64_GOTPCRELX:
+			case R_X86_64_REX_GOTPCRELX:
 			case R_X86_64_GOTPCREL: /* SymbolOffsetInGot + GOT + Addend - Place  (4 bytes) */
 				pr_debug("\t\t\t\tR_X86_64_GOTPCREL at 0x%-4lx val 0x%x\n", place, value32);
 				pr_out("	{ .offset = 0x%-8x, .type = COMPEL_TYPE_LONG | COMPEL_TYPE_GOTPCREL, "
-- 
2.13.6



More information about the CRIU mailing list