This patch fixes the problem at https://dev.openwrt.org/ticket/3316

On arm platform compat-wireless can't be build complete.

The problem was that kbuild had problems when cross compiling for arm
platform. The problem is described here:
http://lkml.org/lkml/2008/3/23/284 in kernel 2.6.25 the problem is
fixed. I backported the fix to kernel 2.6.24 and 2.6.23 and attached the
file.


Signed-off-by: Hauke Mehrtens <[EMAIL PROTECTED]>

--
Hauke Mehrtens
Index: target/linux/generic-2.6/patches-2.6.23/015-kbuild_cross_build_fix.patch
===================================================================
--- target/linux/generic-2.6/patches-2.6.23/015-kbuild_cross_build_fix.patch	(Revision 0)
+++ target/linux/generic-2.6/patches-2.6.23/015-kbuild_cross_build_fix.patch	(Revision 0)
@@ -0,0 +1,91 @@
+diff -Naur linux-2.6.23.14.new/Makefile linux-2.6.23.14/Makefile
+--- linux-2.6.23.14/Makefile	2008-04-20 21:27:09.000000000 +0200
++++ linux-2.6.23.14.new/Makefile	2008-04-20 21:41:35.000000000 +0200
+@@ -181,7 +181,7 @@
+ # 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	?=
+ 
+diff -Naur linux-2.6.23.14.new/scripts/Makefile.modpost linux-2.6.23.14/scripts/Makefile.modpost
+--- linux-2.6.23.14/scripts/Makefile.modpost	2008-04-20 21:27:09.000000000 +0200
++++ linux-2.6.23.14.new/scripts/Makefile.modpost	2008-04-20 21:41:35.000000000 +0200
+@@ -53,6 +53,9 @@
+ # 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 @@
+  $(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
+diff -Naur linux-2.6.23.14.new/scripts/mod/file2alias.c linux-2.6.23.14/scripts/mod/file2alias.c
+--- linux-2.6.23.14/scripts/mod/file2alias.c	2008-04-20 21:27:09.000000000 +0200
++++ linux-2.6.23.14.new/scripts/mod/file2alias.c	2008-04-20 21:43:58.000000000 +0200
+@@ -51,15 +51,19 @@
+                 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.
++ * Ignore both checks if build host differ from target host and size differs.
+  **/
+ static void device_id_size_check(const char *modname, const char *device_id,
+ 				 unsigned long size, unsigned long id_size)
+ {
+ 	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 "
+diff -Naur linux-2.6.23.14.new/scripts/mod/modpost.c linux-2.6.23.14/scripts/mod/modpost.c
+--- linux-2.6.23.14/scripts/mod/modpost.c	2008-04-20 21:27:09.000000000 +0200
++++ linux-2.6.23.14.new/scripts/mod/modpost.c	2008-04-20 21:41:35.000000000 +0200
+@@ -1649,7 +1649,7 @@
+ 	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;
+@@ -1658,6 +1658,9 @@
+ 				module_read = optarg;
+ 				external_module = 1;
+ 				break;
++			case 'c':
++				cross_build = 1;
++				break;
+ 			case 'm':
+ 				modversions = 1;
+ 				break;
+diff -Naur linux-2.6.23.14.new/scripts/mod/modpost.h linux-2.6.23.14/scripts/mod/modpost.h
+--- linux-2.6.23.14/scripts/mod/modpost.h	2008-04-20 21:27:09.000000000 +0200
++++ linux-2.6.23.14.new/scripts/mod/modpost.h	2008-04-20 21:41:35.000000000 +0200
+@@ -130,6 +130,7 @@
+ };
+ 
+ /* 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);
Index: target/linux/generic-2.6/patches-2.6.24/015-kbuild_cross_build_fix.patch
===================================================================
--- target/linux/generic-2.6/patches-2.6.24/015-kbuild_cross_build_fix.patch	(Revision 0)
+++ target/linux/generic-2.6/patches-2.6.24/015-kbuild_cross_build_fix.patch	(Revision 0)
@@ -0,0 +1,97 @@
+# This patch is based on http://lkml.org/lkml/diff/2008/3/23/284/1 
+# more informatik can be found at http://lkml.org/lkml/2008/3/23/284
+
+diff -Naur linux-2.6.24.2/Makefile linux-2.6.24.2.new/Makefile
+--- linux-2.6.24.2/Makefile	2008-02-11 06:51:11.000000000 +0100
++++ linux-2.6.24.2.new/Makefile	2008-04-20 21:31:13.000000000 +0200
+@@ -189,7 +189,7 @@
+ # 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	?=
+ 
+diff -Naur linux-2.6.24.2/scripts/Makefile.modpost linux-2.6.24.2.new/scripts/Makefile.modpost
+--- linux-2.6.24.2/scripts/Makefile.modpost	2008-02-11 06:51:11.000000000 +0100
++++ linux-2.6.24.2.new/scripts/Makefile.modpost	2008-04-20 21:33:25.000000000 +0200
+@@ -53,6 +53,9 @@
+ # 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 @@
+  $(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
+diff -Naur linux-2.6.24.2/scripts/mod/file2alias.c linux-2.6.24.2.new/scripts/mod/file2alias.c
+--- linux-2.6.24.2/scripts/mod/file2alias.c	2008-02-11 06:51:11.000000000 +0100
++++ linux-2.6.24.2.new/scripts/mod/file2alias.c	2008-04-20 21:31:13.000000000 +0200
+@@ -51,11 +51,13 @@
+                 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 @@
+ 	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 "
+diff -Naur linux-2.6.24.2/scripts/mod/modpost.c linux-2.6.24.2.new/scripts/mod/modpost.c
+--- linux-2.6.24.2/scripts/mod/modpost.c	2008-02-11 06:51:11.000000000 +0100
++++ linux-2.6.24.2.new/scripts/mod/modpost.c	2008-04-20 21:35:21.000000000 +0200
+@@ -1659,7 +1659,7 @@
+ 	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 @@
+ 				module_read = optarg;
+ 				external_module = 1;
+ 				break;
++			case 'c':
++				cross_build = 1;
++				break;
+ 			case 'm':
+ 				modversions = 1;
+ 				break;
+diff -Naur linux-2.6.24.2/scripts/mod/modpost.h linux-2.6.24.2.new/scripts/mod/modpost.h
+--- linux-2.6.24.2/scripts/mod/modpost.h	2008-02-11 06:51:11.000000000 +0100
++++ linux-2.6.24.2.new/scripts/mod/modpost.h	2008-04-20 21:31:13.000000000 +0200
+@@ -130,6 +130,7 @@
+ };
+ 
+ /* 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);

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
http://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to