提交 dd2a3aca 编写于 作者: A Andreas Bießmann 提交者: Rusty Russell

mod/file2alias: make modpost compile on darwin again

commit e49ce141 breaks 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: NAndreas Bießmann <andreas@biessmann.de>
CC: Rusty Russell <rusty@rustcorp.com.au>
CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
CC: Jochen Friedrich <jochen@scram.de>
CC: Samuel Ortiz <sameo@linux.intel.com>
CC: "K. Y. Srinivasan" <kys@microsoft.com>
Signed-off-by: NRusty Russell <rusty@rustcorp.com.au>
Tested-by: NBernhard Walle <bernhard@bwalle.de>
上级 203738e5
...@@ -46,11 +46,37 @@ struct devtable { ...@@ -46,11 +46,37 @@ struct devtable {
void *function; 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 /* We construct a table of pointers in an ELF section (pointers generally
* go unpadded by gcc). ld creates boundary syms for us. */ * go unpadded by gcc). ld creates boundary syms for us. */
extern struct devtable *__start___devtable[], *__stop___devtable[]; extern struct devtable *__start___devtable[], *__stop___devtable[];
#define ___cat(a,b) a ## b #endif /* __MACH__ */
#define __cat(a,b) ___cat(a,b)
#if __GNUC__ == 3 && __GNUC_MINOR__ < 3 #if __GNUC__ == 3 && __GNUC_MINOR__ < 3
# define __used __attribute__((__unused__)) # define __used __attribute__((__unused__))
...@@ -65,8 +91,8 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; ...@@ -65,8 +91,8 @@ extern struct devtable *__start___devtable[], *__stop___devtable[];
(type *)NULL, \ (type *)NULL, \
(char *)NULL)), \ (char *)NULL)), \
sizeof(type), (function) }; \ sizeof(type), (function) }; \
static struct devtable *__attribute__((section("__devtable"))) \ static struct devtable *SECTION(__devtable) __used \
__used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__)
#define ADD(str, sep, cond, field) \ #define ADD(str, sep, cond, field) \
do { \ do { \
...@@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, ...@@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
do_pnp_card_entries(symval, sym->st_size, mod); do_pnp_card_entries(symval, sym->st_size, mod);
else { else {
struct devtable **p; struct devtable **p;
INIT_SECTION(__devtable);
for (p = __start___devtable; p < __stop___devtable; p++) { for (p = __start___devtable; p < __stop___devtable; p++) {
if (sym_is(name, namelen, (*p)->device_id)) { if (sym_is(name, namelen, (*p)->device_id)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册