Commit 585dda23 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

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: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 008db0cb
...@@ -39,19 +39,27 @@ ENTRY(call32_from_64) ...@@ -39,19 +39,27 @@ ENTRY(call32_from_64)
mov %rsp,(%rdi) mov %rsp,(%rdi)
mov %rdi,%rsp mov %rdi,%rsp
/* 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 */ /* Switch into compatibility mode */
pushq $__USER32_CS 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 lretq
1: 1: .code32
.code32
/* Run function and switch back */ /* Run function and switch back */
call *%esi call *%esi
jmp $__USER_CS,$1f lret
.code64
1: 2: .code64
/* Restore the stack */ /* Restore the stack */
mov (%rsp),%rsp mov (%rsp),%rsp
add $8, %rdi add $8, %rdi
......
...@@ -106,17 +106,30 @@ define FEATURE_TEST_X86_COMPAT ...@@ -106,17 +106,30 @@ define FEATURE_TEST_X86_COMPAT
.text .text
ENTRY(call32_from_64) 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 */ /* Switch into compatibility mode */
pushq \$$__USER32_CS 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 lretq
1:
.code32 1: .code32
/* Run function and switch back */ /* Run function and switch back */
call *%esi call *%esi
jmp \$$__USER_CS,\$$1f lret
.code64
1: 2: .code64
/* Restore the stack */
mov (%rsp),%rsp
add \$$8, %rdi
END(call32_from_64) END(call32_from_64)
ENTRY(main) ENTRY(main)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment