@@ -46,11 +46,37 @@ struct devtable {
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[];
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,
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 )) {
0 commit comments