From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755790AbYDQCKM (ORCPT ); Wed, 16 Apr 2008 22:10:12 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751152AbYDQCJ7 (ORCPT ); Wed, 16 Apr 2008 22:09:59 -0400 Received: from sous-sol.org ([216.99.217.87]:54946 "EHLO sous-sol.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751137AbYDQCJ6 (ORCPT ); Wed, 16 Apr 2008 22:09:58 -0400 Message-Id: <20080417010206.817647157@sous-sol.org> References: <20080417010122.148289106@sous-sol.org> User-Agent: quilt/0.46-1 Date: Wed, 16 Apr 2008 18:01:24 -0700 From: Chris Wright To: linux-kernel@vger.kernel.org, stable@kernel.org, jejb@kernel.org Cc: Justin Forbes , Zwane Mwaikambo , "Theodore Ts'o" , Randy Dunlap , Dave Jones , Chuck Wolber , Chris Wedgwood , Michael Krufky , Chuck Ebbert , Domenico Andreoli , torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, Sam Ravnborg , Michael Buesch , Sam Ravnborg Subject: kbuild: soften modpost checks when doing cross builds Content-Disposition: inline; filename=kbuild-soften-modpost-checks-when-doing-cross-builds.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org -stable review patch. If anyone has any objections, please let us know. --------------------- From: Sam Ravnborg upstream commit: 4ce6efed48d736e3384c39ff87bda723e1f8e041 The module alias support in the kernel have a consistency check where it is checked that the size of a structure in the kernel and on the build host are the same. For cross builds this check does not make sense so detect when we do cross builds and silently skip the check in these situations. This fixes a build bug for a wireless driver when cross building for arm. Acked-by: Michael Buesch Tested-by: Gordon Farquharson Signed-off-by: Sam Ravnborg [chrisw@sous-sol.org: backport to 2.6.24.4] Signed-off-by: Chris Wright --- Makefile | 2 +- scripts/Makefile.modpost | 6 +++++- scripts/mod/file2alias.c | 4 ++++ scripts/mod/modpost.c | 5 ++++- scripts/mod/modpost.h | 1 + 5 files changed, 15 insertions(+), 3 deletions(-) --- a/Makefile +++ b/Makefile @@ -189,7 +189,7 @@ SUBARCH := $(shell uname -m | sed -e s/i # Alternatively CROSS_COMPILE can be set in the environment. # Default value for CROSS_COMPILE is not to prefix executables # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile - +export KBUILD_BUILDHOST := $(SUBARCH) ARCH ?= $(SUBARCH) CROSS_COMPILE ?= --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -53,6 +53,9 @@ modules := $(patsubst %.o,%.ko, $(wild # Stop after building .o files if NOFINAL is set. Makes compile tests quicker _modpost: $(if $(KBUILD_MODPOST_NOFINAL), $(modules:.ko:.o),$(modules)) +ifneq ($(KBUILD_BUILDHOST),$(ARCH)) + cross_build := 1 +endif # Step 2), invoke modpost # Includes step 3,4 @@ -62,7 +65,8 @@ modpost = scripts/mod/modpost $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ - $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) + $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \ + $(if $(cross_build),-c) quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules cmd_modpost = $(modpost) -s --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -51,11 +51,13 @@ do { sprintf(str + strlen(str), "*"); \ } while(0) +unsigned int cross_build = 0; /** * Check that sizeof(device_id type) are consistent with size of section * in .o file. If in-consistent then userspace and kernel does not agree * on actual size which is a bug. * Also verify that the final entry in the table is all zeros. + * Ignore both checks if build host differ from target host and size differs. **/ static void device_id_check(const char *modname, const char *device_id, unsigned long size, unsigned long id_size, @@ -64,6 +66,8 @@ static void device_id_check(const char * int i; if (size % id_size || size < id_size) { + if (cross_build != 0) + return; fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo " "of the size of section __mod_%s_device_table=%lu.\n" "Fix definition of struct %s_device_id " --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1659,7 +1659,7 @@ int main(int argc, char **argv) int opt; int err; - while ((opt = getopt(argc, argv, "i:I:mso:aw")) != -1) { + while ((opt = getopt(argc, argv, "i:I:cmso:aw")) != -1) { switch(opt) { case 'i': kernel_read = optarg; @@ -1668,6 +1668,9 @@ int main(int argc, char **argv) module_read = optarg; external_module = 1; break; + case 'c': + cross_build = 1; + break; case 'm': modversions = 1; break; --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -130,6 +130,7 @@ struct elf_info { }; /* file2alias.c */ +extern unsigned int cross_build; void handle_moddevtable(struct module *mod, struct elf_info *info, Elf_Sym *sym, const char *symname); void add_moddevtable(struct buffer *buf, struct module *mod); --