From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932917AbdKFSrm (ORCPT ); Mon, 6 Nov 2017 13:47:42 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:56879 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932526AbdKFSrk (ORCPT ); Mon, 6 Nov 2017 13:47:40 -0500 X-Google-Smtp-Source: ABhQp+QVoTHksCyTlXMomZydcs1nPs9+G6HyW9CVvsfoP7CIxGkMCEa7//zptSJXljC40HnKhz6UOltfj6KfJSumYf0= MIME-Version: 1.0 In-Reply-To: References: <20171027201345.87383-1-ndesaulniers@google.com> From: Nick Desaulniers Date: Mon, 6 Nov 2017 10:47:37 -0800 Message-ID: Subject: Re: [PATCH v2] kbuild: fix linker feature test macros when cross compiling with Clang To: Masahiro Yamada Cc: Linux Kbuild mailing list , Michael Davidson , Greg Hackmann , Pirama Arumuga Nainar , Douglas Anderson , Ingo Molnar , Matthias Kaehlcke , Arnd Bergmann , Marcin Nowakowski , Mark Charlebois , Josh Poimboeuf , Cao jin , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by nfs id vA6Ilkq9020653 Comparing make V=1 with the suggested config before my patch, after my patch, and after Masahiro's suggestion to add $(LDFLAGS): before: ... ld -m elf_i386 -pie -T arch/x86/boot/compressed/vmlinux.lds ... ... after my: ... ld -m elf_i386 -T arch/x86/boot/compressed/vmlinux.lds ... ... after my+Masahiro: ... ld -m elf_i386 -pie -T arch/x86/boot/compressed/vmlinux.lds ... ... :) Just to dig into this a little more (though I suspect we've found the issue): Next is to debug what we're passing to try-run and see what errors it's masking. Adding to arch/x86/boot/compressed/Makefile: --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -44,6 +44,10 @@ LDFLAGS := -m elf_$(UTS_MACHINE) # Compressed kernel should be built as PIE since it may be loaded at any # address by the bootloader. ifeq ($(CONFIG_X86_32),y) +$(info "XXX") +$(info "KBUILD_CPPFLAGS: ${KBUILD_CPPFLAGS}") +$(info "CC_OPTION_CFLAGS: ${CC_OPTION_CFLAGS}") +$(info "LDFLAGS: ${LDFLAGS}") LDFLAGS += $(call ld-option, -pie) $(call ld-option, --no-dynamic-linker) else # To build 64-bit compressed kernel as PIE, we disable relocation then grepping for XXX in a build output: "XXX" "KBUILD_CPPFLAGS: -D__KERNEL__ " "CC_OPTION_CFLAGS: -m32 -D__KERNEL__ -O2 -fno-strict-aliasing -fPIE -DDISABLE_BRANCH_PROFILING -march=i386 -mno-mmx -mno-sse -ffreestanding -fno-stack-protector" "LD_FLAGS: " then trying this on the command line: ➜ kernel-all git:(kbuild) ✗ cc -pie -D__KERNEL__ -m32 -D__KERNEL__ -O2 -fno-strict-aliasing -fPIE -DDISABLE_BRANCH_PROFILING -march=i386 -mno-mmx -mno-sse -ffreestanding -fno-stack-protector -x c /dev/null -c -o temp.o ➜ kernel-all git:(kbuild) ✗ ld -pie temp.o -o temp ld: i386 architecture of input file `temp.o' is incompatible with i386:x86-64 output ld: warning: cannot find entry symbol _start; defaulting to 0000000000000078 ➜ kernel-all git:(kbuild) ✗ echo $? 1 ➜ kernel-all git:(kbuild) ✗ file temp.o temp.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped So it looks like without LDFLAGS, we don't tell the linker to link as 32b, causing ld-option to fail to add -pie to LDFLAGS. ➜ kernel-all git:(kbuild) ✗ ld -pie -m elf_i386 temp.o -o temp ld: warning: cannot find entry symbol _start; defaulting to 0000000000000185 ➜ kernel-all git:(kbuild) ✗ echo $? 0 sure enough, just before the call to ld-option from arch/x86/boot/compressed/Makefile: 43 LDFLAGS := -m elf_$(UTS_MACHINE) so looks like Masahiro's suggestion is correct. Will send a v3.