2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-09-05 08:45:49 +00:00

ia32: Get rid of R_X86_64_32S relocation

Distributions starts to supply GCC that is configured to compile
-pie and -fPIC code by default due to security reasons.

CONFIG_COMPAT was unfriendy to -pie by the reason of R_X86_64_32S
relocation in call32.S helper:
  LINK     criu/criu
/usr/bin/ld: criu/arch/x86/crtools.built-in.o: relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
make[1]: *** [criu/Makefile:92: criu/criu] Error 1
make: *** [Makefile:225: criu] Error 2

Use %rip-relative addressing to avoid ld errors for shared binary linking.
Puff, all needs to be done with bare hands!

Now CONFIG_COMPAT can be used with -pie binaries and all should
also work for debian toolchain (#315).

Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
Dmitry Safonov
2017-07-25 15:35:46 +03:00
committed by Andrei Vagin
parent 008db0cb7a
commit 585dda236c
2 changed files with 33 additions and 12 deletions

View File

@@ -106,17 +106,30 @@ define FEATURE_TEST_X86_COMPAT
.text
ENTRY(call32_from_64)
/* Push return address and 64-bit segment descriptor */
sub \$$4, %rsp
movl \$$__USER_CS,(%rsp)
sub \$$4, %rsp
/* Using rip-relative addressing to get rid of R_X86_64_32S relocs */
leaq 2f(%rip),%r12
movl %r12d,(%rsp)
/* Switch into compatibility mode */
pushq \$$__USER32_CS
pushq \$$1f
/* Using rip-relative addressing to get rid of R_X86_64_32S relocs */
leaq 1f(%rip), %r12
pushq %r12
lretq
1:
.code32
1: .code32
/* Run function and switch back */
call *%esi
jmp \$$__USER_CS,\$$1f
.code64
1:
lret
2: .code64
/* Restore the stack */
mov (%rsp),%rsp
add \$$8, %rdi
END(call32_from_64)
ENTRY(main)