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.
Unified · Split
| @@ -46,11 +46,37 @@ struct devtable { · 45 unmodified lines | ||
| 46 | 46 | void *function; |
| 47 | 47 | }; |
| 48 | 48 | |
| 49 | +#define ___cat(a,b) a ## b | |
| 50 | +#define __cat(a,b) ___cat(a,b) | |
| 51 | + | |
| 52 | +/* we need some special handling for this host tool running eventually on | |
| 53 | + * Darwin. The Mach-O section handling is a bit different than ELF section | |
| 54 | + * handling. The differnces in detail are: | |
| 55 | + * a) we have segments which have sections | |
| 56 | + * b) we need a API call to get the respective section symbols */ | |
| 57 | +#if defined(__MACH__) | |
| 58 | +#include <mach-o/getsect.h> | |
| 59 | + | |
| 60 | +#define INIT_SECTION(name) do { \ | |
| 61 | + unsigned long name ## _len; \ | |
| 62 | + char *__cat(pstart_,name) = getsectdata("__TEXT", \ | |
| 63 | + #name, &__cat(name,_len)); \ | |
| 64 | + char *__cat(pstop_,name) = __cat(pstart_,name) + \ | |
| 65 | + __cat(name, _len); \ | |
| 66 | + __cat(__start_,name) = (void *)__cat(pstart_,name); \ | |
| 67 | + __cat(__stop_,name) = (void *)__cat(pstop_,name); \ | |
| 68 | + } while (0) | |
| 69 | +#define SECTION(name) __attribute__((section("__TEXT, " #name))) | |
| 70 | + | |
| 71 | +struct devtable **__start___devtable, **__stop___devtable; | |
| 72 | +#else | |
| 73 | +#define INIT_SECTION(name) /* no-op for ELF */ | |
| 74 | +#define SECTION(name) __attribute__((section(#name))) | |
| 75 | + | |
| 49 | 76 | /* We construct a table of pointers in an ELF section (pointers generally |
| 50 | 77 | * go unpadded by gcc). ld creates boundary syms for us. */ |
| 51 | 78 | extern struct devtable *__start___devtable[], *__stop___devtable[]; |
| 52 | −#define ___cat(a,b) a ## b | |
| 53 | −#define __cat(a,b) ___cat(a,b) | |
| 79 | +#endif /* __MACH__ */ | |
| 54 | 80 | |
| 55 | 81 | #if __GNUC__ == 3 && __GNUC_MINOR__ < 3 |
| 56 | 82 | # define __used __attribute__((__unused__)) |
| @@ -65,8 +91,8 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; · 8 unmodified lines | ||
| 65 | 91 | (type *)NULL, \ |
| 66 | 92 | (char *)NULL)), \ |
| 67 | 93 | sizeof(type), (function) }; \ |
| 68 | − static struct devtable *__attribute__((section("__devtable"))) \ | |
| 69 | − __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | |
| 94 | + static struct devtable *SECTION(__devtable) __used \ | |
| 95 | + __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | |
| 70 | 96 | |
| 71 | 97 | #define ADD(str, sep, cond, field) \ |
| 72 | 98 | do { \ |
| @@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, · 1007 unmodified lines | ||
| 1080 | 1106 | do_pnp_card_entries(symval, sym->st_size, mod); |
| 1081 | 1107 | else { |
| 1082 | 1108 | struct devtable **p; |
| 1109 | + INIT_SECTION(__devtable); | |
| 1083 | 1110 | |
| 1084 | 1111 | for (p = __start___devtable; p < __stop___devtable; p++) { |
| 1085 | 1112 | if (sym_is(name, namelen, (*p)->device_id)) { |