mod/file2alias: make modpost compile on darwin again
PATCH 1/1 mod/file2alias: make modpost compile on darwin again
commit e49ce14150c64b29a8dd211df785576fa19a9858 breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.
Additionally this patch fixes minor chackpatch warnings introduced by mentioned commit.
--- scripts/mod/file2alias.c | 37 ++++++++++++++++++++++++++++++++----- 1 files changed, 32 insertions(+), 5 deletions(-)
scripts/mod/file2alias.c +32 -5
@@ -46,11 +46,37 @@ struct devtable {void *function; }; +#define ___cat (a, b) a ## b +#define __cat (a, b) ___cat(a, b) + +/* we need some special handling for this host tool running eventually on +* Darwin. The Mach-O section handling is a bit different than ELF section +* handling. The differnces in detail are: +* a) we have segments which have sections +* b) we need a API call to get the respective section symbols */ +#if defined(__MACH__) +#include <mach-o/getsect.h> + +#define INIT_SECTION (name) do { \ + unsigned long name ## _len; \ + char *__cat(pstart_, name) = getsectdata("__TEXT", \ + #name, &__cat(name, _len)); \ + char *__cat(pstop_, name) = __cat(pstart_, name) + \ + __cat(name, _len); \ + __cat(__start_, name) = (void *)__cat(pstart_, name); \ + __cat(__stop_, name) = (void *)__cat(pstop_, name); \ + } while (0) +#define SECTION (name) __attribute__((section("__TEXT, " #name))) + +struct devtable **__start___devtable, **__stop___devtable; +#else +#define INIT_SECTION (name)/* no-op for ELF */ +#define SECTION (name) __attribute__((section(#name))) +/* We construct a table of pointers in an ELF section (pointers generally * go unpadded by gcc). ld creates boundary syms for us. */ extern struct devtable *__start___devtable[], *__stop___devtable[]; -#define ___cat (a,b) a ## b -#define __cat (a,b) ___cat(a,b) +#endif /* __MACH__ */ #if __GNUC__ ==3 && __GNUC_MINOR__ <3 # define __used __attribute__((__unused__))
@@ -60,13 +86,13 @@ extern struct devtable *__start___devtable[], *__stop___devtable[];/* Add a table entry. We test function type matches while we're here. */ #define ADD_TO_DEVTABLE (device_id, type, function) \ - static struct devtable __cat(devtable,__LINE__) = { \ + static struct devtable __cat(devtable, __LINE__) = { \ device_id + 0*sizeof((function)((const char *)NULL, \ (type *)NULL, \ (char *)NULL)), \ sizeof(type), (function) }; \ - static struct devtable *__attribute__((section("__devtable"))) \ - __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) + static struct devtable *SECTION(__devtable) __used \ + __cat(devtable_ptr, __LINE__) = &__cat(devtable, __LINE__)#define ADD (str, sep, cond, field) \ do { \
@@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,do_pnp_card_entries (symval, sym->st_size, mod); else {struct devtable **p; +INIT_SECTION (__devtable);for (p = __start___devtable; p < __stop___devtable; p++) {if (sym_is (name, namelen, (*p)->device_id)) {
Signature · 1 line
1.7.9.1
Quoted 4 lines · Andreas Bießmann
commit
e49ce14150c64b29a8dd211df785576fa19a9858breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.
Really?
Yes, I assumed an ELF host. There's a portable way of doing this, but it's damn ugly (see http://ccodearchive.net/info/autodata.html).
Oh, and checkpatch.pl is wrong, the code was fine.
If noone has strong opinions about this, I'll apply it. I'm a bit weirded out though.
Thanks,
Rusty.
Quoted 91 lines
Additionally this patch fixes minor chackpatch warnings introduced by mentioned commit.
Signed-off-by Andreas Bießmann <[email protected]>CC Rusty Russell <[email protected]>CC Greg Kroah-Hartman <[email protected]>CC Jochen Friedrich <[email protected]>CC Samuel Ortiz <[email protected]>CC "K. Y. Srinivasan" <[email protected]>--- scripts/mod/file2alias.c | 37 ++++++++++++++++++++++++++++++++----- 1 files changed, 32 insertions(+), 5 deletions(-)scripts/mod/file2alias.c +32
-5@@ -46,11 +46,37 @@ struct devtable {void *function; }; +#define ___cat (a, b) a ## b +#define __cat (a, b) ___cat(a, b) + +/* we need some special handling for this host tool running eventually on +* Darwin. The Mach-O section handling is a bit different than ELF section +* handling. The differnces in detail are: +* a) we have segments which have sections +* b) we need a API call to get the respective section symbols */ +#if defined(__MACH__) +#include <mach-o/getsect.h> + +#define INIT_SECTION (name) do { \ + unsigned long name ## _len; \ + char *__cat(pstart_, name) = getsectdata("__TEXT", \ + #name, &__cat(name, _len)); \ + char *__cat(pstop_, name) = __cat(pstart_, name) + \ + __cat(name, _len); \ + __cat(__start_, name) = (void *)__cat(pstart_, name); \ + __cat(__stop_, name) = (void *)__cat(pstop_, name); \ + } while (0) +#define SECTION (name) __attribute__((section("__TEXT, " #name))) + +struct devtable **__start___devtable, **__stop___devtable; +#else +#define INIT_SECTION (name)/* no-op for ELF */ +#define SECTION (name) __attribute__((section(#name))) +/* We construct a table of pointers in an ELF section (pointers generally * go unpadded by gcc). ld creates boundary syms for us. */ extern struct devtable *__start___devtable[], *__stop___devtable[]; -#define ___cat (a,b) a ## b -#define __cat (a,b) ___cat(a,b) +#endif /* __MACH__ */ #if __GNUC__ ==3 && __GNUC_MINOR__ <3 # define __used __attribute__((__unused__))@@ -60,13 +86,13 @@ extern struct devtable *__start___devtable[], *__stop___devtable[];/* Add a table entry. We test function type matches while we're here. */ #define ADD_TO_DEVTABLE (device_id, type, function) \ - static struct devtable __cat(devtable,__LINE__) = { \ + static struct devtable __cat(devtable, __LINE__) = { \ device_id + 0*sizeof((function)((const char *)NULL, \ (type *)NULL, \ (char *)NULL)), \ sizeof(type), (function) }; \ - static struct devtable *__attribute__((section("__devtable"))) \ - __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) + static struct devtable *SECTION(__devtable) __used \ + __cat(devtable_ptr, __LINE__) = &__cat(devtable, __LINE__)#define ADD (str, sep, cond, field) \ do { \@@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,do_pnp_card_entries (symval, sym->st_size, mod); else {struct devtable **p; +INIT_SECTION (__devtable);for (p = __start___devtable; p < __stop___devtable; p++) {if (sym_is (name, namelen, (*p)->device_id)) {Signature · 7 lines
1.7.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Quoted 7 lines · Rusty Russell
Quoted 4 lines · Andreas Bießmann
commit
e49ce14150c64b29a8dd211df785576fa19a9858breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.Really?
Yes.
Quoted 2 lines
Yes, I assumed an ELF host. There's a portable way of doing this, but it's damn ugly (see http://ccodearchive.net/info/autodata.html).
I stumbled over some other code snippet [1] when searching for a solution.
Quoted 1 line
Oh, and checkpatch.pl is wrong, the code was fine.
Sorry for that. I was running checkpatch.pl as dutiful patch submitter and that complained. Should I provide another version with 'checkpatch' adoptions changed back?
Quoted 1 line
If noone has strong opinions about this, I'll apply it.
Would be great. I guess this is a rare case (cross compiling on darwin host) but at least I and some of my colleagues do it from time to time.
Andreas
--
[1]
http://google-perftools.googlecode.com/svn/!svn/bc/48/trunk/src/base/basictypes.h
Quoted 4 lines · Andreas Bießmann
Quoted 1 line
Oh, and checkpatch.pl is wrong, the code was fine.
Sorry for that. I was running checkpatch.pl as dutiful patch submitter and that complained.
In the Olden Days, we could easily spot code which needed auditing simply by looking at the (lack of) coding style. But then someone decided that the most important attribute of good code was the nature of the whitespace within it. And they wrote a tool.
For a while, this made it really hard for us maintainers to tell which incoming patches we should actually read! Fortunately, the Anti-whitespace crusaders have come full circle: we can now tell newbie coders by the fact that they obey checkpatch.pl.
Quoted 2 lines
Should I provide another version with 'checkpatch' adoptions changed back?
Please :)
Thanks,
Rusty.
PATCH v2 1/1 mod/file2alias: make modpost compile on darwin again
In reply to Andreas Bießmanncommit e49ce14150c64b29a8dd211df785576fa19a9858 breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.
---
since v1:
* change 'checkpatch' whitespace fixews back
scripts/mod/file2alias.c | 35 +++++++++++++++++++++++++++++++---- 1 files changed, 31 insertions(+), 4 deletions(-)
scripts/mod/file2alias.c +31 -4
@@ -46,11 +46,37 @@ struct devtable {void *function; }; +#define ___cat (a,b) a ## b +#define __cat (a,b) ___cat(a,b) + +/* we need some special handling for this host tool running eventually on +* Darwin. The Mach-O section handling is a bit different than ELF section +* handling. The differnces in detail are: +* a) we have segments which have sections +* b) we need a API call to get the respective section symbols */ +#if defined(__MACH__) +#include <mach-o/getsect.h> + +#define INIT_SECTION (name) do { \ + unsigned long name ## _len; \ + char *__cat(pstart_,name) = getsectdata("__TEXT", \ + #name, &__cat(name,_len)); \ + char *__cat(pstop_,name) = __cat(pstart_,name) + \ + __cat(name, _len); \ + __cat(__start_,name) = (void *)__cat(pstart_,name); \ + __cat(__stop_,name) = (void *)__cat(pstop_,name); \ + } while (0) +#define SECTION (name) __attribute__((section("__TEXT, " #name))) + +struct devtable **__start___devtable, **__stop___devtable; +#else +#define INIT_SECTION (name)/* no-op for ELF */ +#define SECTION (name) __attribute__((section(#name))) +/* We construct a table of pointers in an ELF section (pointers generally * go unpadded by gcc). ld creates boundary syms for us. */ extern struct devtable *__start___devtable[], *__stop___devtable[]; -#define ___cat (a,b) a ## b -#define __cat (a,b) ___cat(a,b) +#endif /* __MACH__ */ #if __GNUC__ ==3 && __GNUC_MINOR__ <3 # define __used __attribute__((__unused__))
@@ -65,8 +91,8 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; (type *)NULL, \ (char *)NULL)), \ sizeof(type), (function) }; \ - static struct devtable *__attribute__((section("__devtable"))) \ - __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) +static struct devtable *SECTION (__devtable ) __used \ + __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__)#define ADD (str, sep, cond, field) \ do { \
@@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,do_pnp_card_entries (symval, sym->st_size, mod); else {struct devtable **p; +INIT_SECTION (__devtable);for (p = __start___devtable; p < __stop___devtable; p++) {if (sym_is (name, namelen, (*p)->device_id)) {
Signature · 1 line
1.7.9.1
Rusty Russell
AppliedQuoted 4 lines · Andreas Bießmann
commit
e49ce14150c64b29a8dd211df785576fa19a9858breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.
Thanks, applied.
Rusty.
Hi,
Am 24.02.12 08:23, schrieb Andreas Bießmann:
Quoted 11 lines
commit
e49ce14150c64b29a8dd211df785576fa19a9858breaks cross compiling the linux kernel on darwin hosts.
This fix introduce some minimal glue to adopt linker section handling for darwin hosts.Signed-off-by Andreas Bießmann <[email protected]>CC Rusty Russell <[email protected]>CC Greg Kroah-Hartman <[email protected]>CC Jochen Friedrich <[email protected]>CC Samuel Ortiz <[email protected]>CC "K. Y. Srinivasan" <[email protected]>
Would be nice if that patch gets applied even if cross-compiling the Linux kernel on a Mac is exotic.
Regards,
Bernhard
[PULL] modpost fix for cross-compiling
To [email protected]:rustyrussell/linux.git
0d86f65..dd2a3ac master -> master
+ e45f03a...65e65f9 for-linus -> for-linus (forced update)
The following changes since commit 203738e548cefc3fc3c2f73a9063176c9f3583d5:
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net (2012-02-26 12:47:17 -0800)
are available in the git repository at:
git://github.com/rustyrussell/linux.git master
Andreas Bießmann (1):
mod/file2alias: make modpost compile on darwin again
scripts/mod/file2alias.c | 35 +++++++++++++++++++++++++++++++---- 1 files changed, 31 insertions(+), 4 deletions(-)