Loading scripts/mod/file2alias.c +31 −4 Original line number Diff line number Diff line Loading @@ -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__)) Loading @@ -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 { \ Loading Loading @@ -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)) { Loading Loading
scripts/mod/file2alias.c +31 −4 Original line number Diff line number Diff line Loading @@ -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__)) Loading @@ -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 { \ Loading Loading @@ -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)) { Loading