From 37b3e5953b484d2eb5e27b79a80c83bcd24baafd Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Wed, 31 May 2017 23:23:39 +0300 Subject: [PATCH] ia32/feature-test: Don't check i686 libraries presence I was adapting CRIU with ia32 support for building with Koji, and found that Koji can't build x86_64 packages and have i686 libs installed. While at it, I found that i686 libraries requirement is no longer valid since I've deleted the second parasite. Drop feature test for i686 libs and put test for gcc. That will effectively test if gcc can compile 32-bit code and bug with debian's gcc (#315). Signed-off-by: Dmitry Safonov Signed-off-by: Andrei Vagin --- Makefile.config | 8 +++++--- scripts/feature-tests.mak | 35 +++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Makefile.config b/Makefile.config index ec6c2d145..0e557805c 100644 --- a/Makefile.config +++ b/Makefile.config @@ -21,12 +21,14 @@ $(CONFIG_FILE): ifeq ($(SRCARCH),x86) # CONFIG_COMPAT is only for x86 now, no need for compile-test other archs -ifeq ($(call try-cc,$(FEATURE_TEST_X86_COMPAT),-m32),true) +ifeq ($(call try-asm,$(FEATURE_TEST_X86_COMPAT)),true) export CONFIG_COMPAT := y FEATURE_DEFINES += -DCONFIG_COMPAT else - $(info Note: Building without ia32 C/R, missed package(s):) - $(info $(info) libc6-dev-i386 and/or gcc-multilib) + $(info Note: Building without ia32 C/R, missed ia32 support in gcc) + $(info $(info) That may be related to missing gcc-multilib in your) + $(info $(info) distribution or you may have Debian with buggy toolchain) + $(info $(info) (issue https://github.com/xemul/criu/issues/315)) endif endif diff --git a/scripts/feature-tests.mak b/scripts/feature-tests.mak index ad50eb4ad..12bf54181 100644 --- a/scripts/feature-tests.mak +++ b/scripts/feature-tests.mak @@ -90,13 +90,36 @@ int main(int argc, char *argv[], char *envp[]) endef define FEATURE_TEST_X86_COMPAT +#define __ALIGN .align 4, 0x90 +#define ENTRY(name) \ + .globl name; \ + .type name, @function; \ + __ALIGN; \ + name: -/* Test for glibc-devel.i686 presence */ -#include +#define END(sym) \ + .size sym, . - sym -int main(int argc, char **argv) -{ - return 0; -} +#define __USER32_CS 0x23 +#define __USER_CS 0x33 + .text + +ENTRY(call32_from_64) + /* Switch into compatibility mode */ + pushq \$$__USER32_CS + pushq \$$1f + lretq +1: + .code32 + /* Run function and switch back */ + call *%esi + jmp \$$__USER_CS,\$$1f + .code64 +1: +END(call32_from_64) + +ENTRY(main) + nop +END(main) endef