OpenWrt – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001 |
2 | From: Felix Fietkau <nbd@nbd.name> |
||
3 | Date: Fri, 7 Jul 2017 16:56:48 +0200 |
||
4 | Subject: build: add a hack for removing non-essential module info |
||
5 | |||
6 | Signed-off-by: Felix Fietkau <nbd@nbd.name> |
||
7 | --- |
||
8 | include/linux/module.h | 13 ++++++++----- |
||
9 | include/linux/moduleparam.h | 15 ++++++++++++--- |
||
10 | init/Kconfig | 7 +++++++ |
||
11 | kernel/module.c | 5 ++++- |
||
12 | scripts/mod/modpost.c | 12 ++++++++++++ |
||
13 | 5 files changed, 43 insertions(+), 9 deletions(-) |
||
14 | |||
15 | --- a/include/linux/module.h |
||
16 | +++ b/include/linux/module.h |
||
17 | @@ -160,6 +160,7 @@ extern void cleanup_module(void); |
||
18 | |||
19 | /* Generic info of form tag = "info" */ |
||
20 | #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) |
||
21 | +#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info) |
||
22 | |||
23 | /* For userspace: you can also call me... */ |
||
24 | #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) |
||
25 | @@ -203,12 +204,12 @@ extern void cleanup_module(void); |
||
26 | * Author(s), use "Name <email>" or just "Name", for multiple |
||
27 | * authors use multiple MODULE_AUTHOR() statements/lines. |
||
28 | */ |
||
29 | -#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) |
||
30 | +#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author) |
||
31 | |||
32 | /* What your module does. */ |
||
33 | -#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) |
||
34 | +#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description) |
||
35 | |||
36 | -#ifdef MODULE |
||
37 | +#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED) |
||
38 | /* Creates an alias so file2alias.c can find device table. */ |
||
39 | #define MODULE_DEVICE_TABLE(type, name) \ |
||
40 | extern typeof(name) __mod_##type##__##name##_device_table \ |
||
41 | @@ -235,7 +236,9 @@ extern typeof(name) __mod_##type##__##na |
||
42 | */ |
||
43 | |||
44 | #if defined(MODULE) || !defined(CONFIG_SYSFS) |
||
45 | -#define MODULE_VERSION(_version) MODULE_INFO(version, _version) |
||
46 | +#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version) |
||
47 | +#elif defined(CONFIG_MODULE_STRIPPED) |
||
48 | +#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version) |
||
49 | #else |
||
50 | #define MODULE_VERSION(_version) \ |
||
51 | static struct module_version_attribute ___modver_attr = { \ |
||
52 | @@ -257,7 +260,7 @@ extern typeof(name) __mod_##type##__##na |
||
53 | /* Optional firmware file (or files) needed by the module |
||
54 | * format is simply firmware file name. Multiple firmware |
||
55 | * files require multiple MODULE_FIRMWARE() specifiers */ |
||
56 | -#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) |
||
57 | +#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware) |
||
58 | |||
59 | struct notifier_block; |
||
60 | |||
61 | --- a/include/linux/moduleparam.h |
||
62 | +++ b/include/linux/moduleparam.h |
||
63 | @@ -17,6 +17,16 @@ |
||
64 | /* Chosen so that structs with an unsigned long line up. */ |
||
65 | #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) |
||
66 | |||
67 | +/* This struct is here for syntactic coherency, it is not used */ |
||
68 | +#define __MODULE_INFO_DISABLED(name) \ |
||
69 | + struct __UNIQUE_ID(name) {} |
||
70 | + |
||
71 | +#ifdef CONFIG_MODULE_STRIPPED |
||
72 | +#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name) |
||
73 | +#else |
||
74 | +#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info) |
||
75 | +#endif |
||
76 | + |
||
77 | #ifdef MODULE |
||
78 | #define __MODULE_INFO(tag, name, info) \ |
||
79 | static const char __UNIQUE_ID(name)[] \ |
||
80 | @@ -24,8 +34,7 @@ static const char __UNIQUE_ID(name)[] |
||
81 | = __stringify(tag) "=" info |
||
82 | #else /* !MODULE */ |
||
83 | /* This struct is here for syntactic coherency, it is not used */ |
||
84 | -#define __MODULE_INFO(tag, name, info) \ |
||
85 | - struct __UNIQUE_ID(name) {} |
||
86 | +#define __MODULE_INFO(tag, name, info) __MODULE_INFO_DISABLED(name) |
||
87 | #endif |
||
88 | #define __MODULE_PARM_TYPE(name, _type) \ |
||
89 | __MODULE_INFO(parmtype, name##type, #name ":" _type) |
||
90 | @@ -33,7 +42,7 @@ static const char __UNIQUE_ID(name)[] |
||
91 | /* One for each parameter, describing how to use it. Some files do |
||
92 | multiple of these per line, so can't just use MODULE_INFO. */ |
||
93 | #define MODULE_PARM_DESC(_parm, desc) \ |
||
94 | - __MODULE_INFO(parm, _parm, #_parm ":" desc) |
||
95 | + __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc) |
||
96 | |||
97 | struct kernel_param; |
||
98 | |||
99 | --- a/init/Kconfig |
||
100 | +++ b/init/Kconfig |
||
101 | @@ -1994,6 +1994,13 @@ config TRIM_UNUSED_KSYMS |
||
102 | |||
103 | If unsure, or if you need to build out-of-tree modules, say N. |
||
104 | |||
105 | +config MODULE_STRIPPED |
||
106 | + bool "Reduce module size" |
||
107 | + depends on MODULES |
||
108 | + help |
||
109 | + Remove module parameter descriptions, author info, version, aliases, |
||
110 | + device tables, etc. |
||
111 | + |
||
112 | endif # MODULES |
||
113 | |||
114 | config MODULES_TREE_LOOKUP |
||
115 | --- a/kernel/module.c |
||
116 | +++ b/kernel/module.c |
||
117 | @@ -3004,9 +3004,11 @@ static int setup_load_info(struct load_i |
||
118 | |||
119 | static int check_modinfo(struct module *mod, struct load_info *info, int flags) |
||
120 | { |
||
121 | - const char *modmagic = get_modinfo(info, "vermagic"); |
||
122 | int err; |
||
123 | |||
124 | +#ifndef CONFIG_MODULE_STRIPPED |
||
125 | + const char *modmagic = get_modinfo(info, "vermagic"); |
||
126 | + |
||
127 | if (flags & MODULE_INIT_IGNORE_VERMAGIC) |
||
128 | modmagic = NULL; |
||
129 | |||
130 | @@ -3027,6 +3029,7 @@ static int check_modinfo(struct module * |
||
131 | mod->name); |
||
132 | add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); |
||
133 | } |
||
134 | +#endif |
||
135 | |||
136 | check_modinfo_retpoline(mod, info); |
||
137 | |||
138 | --- a/scripts/mod/modpost.c |
||
139 | +++ b/scripts/mod/modpost.c |
||
140 | @@ -1971,7 +1971,9 @@ static void read_symbols(const char *mod |
||
141 | symname = remove_dot(info.strtab + sym->st_name); |
||
142 | |||
143 | handle_modversions(mod, &info, sym, symname); |
||
144 | +#ifndef CONFIG_MODULE_STRIPPED |
||
145 | handle_moddevtable(mod, &info, sym, symname); |
||
146 | +#endif |
||
147 | } |
||
148 | if (!is_vmlinux(modname) || vmlinux_section_warnings) |
||
149 | check_sec_ref(mod, modname, &info); |
||
150 | @@ -2134,8 +2136,10 @@ static void add_header(struct buffer *b, |
||
151 | buf_printf(b, "\n"); |
||
152 | buf_printf(b, "BUILD_SALT;\n"); |
||
153 | buf_printf(b, "\n"); |
||
154 | +#ifndef CONFIG_MODULE_STRIPPED |
||
155 | buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); |
||
156 | buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); |
||
157 | +#endif |
||
158 | buf_printf(b, "\n"); |
||
159 | buf_printf(b, "__visible struct module __this_module\n"); |
||
160 | buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n"); |
||
161 | @@ -2152,8 +2156,10 @@ static void add_header(struct buffer *b, |
||
162 | |||
163 | static void add_intree_flag(struct buffer *b, int is_intree) |
||
164 | { |
||
165 | +#ifndef CONFIG_MODULE_STRIPPED |
||
166 | if (is_intree) |
||
167 | buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); |
||
168 | +#endif |
||
169 | } |
||
170 | |||
171 | /* Cannot check for assembler */ |
||
172 | @@ -2166,8 +2172,10 @@ static void add_retpoline(struct buffer |
||
173 | |||
174 | static void add_staging_flag(struct buffer *b, const char *name) |
||
175 | { |
||
176 | +#ifndef CONFIG_MODULE_STRIPPED |
||
177 | if (strstarts(name, "drivers/staging")) |
||
178 | buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); |
||
179 | +#endif |
||
180 | } |
||
181 | |||
182 | /** |
||
183 | @@ -2266,11 +2274,13 @@ static void add_depends(struct buffer *b |
||
184 | |||
185 | static void add_srcversion(struct buffer *b, struct module *mod) |
||
186 | { |
||
187 | +#ifndef CONFIG_MODULE_STRIPPED |
||
188 | if (mod->srcversion[0]) { |
||
189 | buf_printf(b, "\n"); |
||
190 | buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", |
||
191 | mod->srcversion); |
||
192 | } |
||
193 | +#endif |
||
194 | } |
||
195 | |||
196 | static void write_if_changed(struct buffer *b, const char *fname) |
||
197 | @@ -2507,7 +2517,9 @@ int main(int argc, char **argv) |
||
198 | add_staging_flag(&buf, mod->name); |
||
199 | err |= add_versions(&buf, mod); |
||
200 | add_depends(&buf, mod, modules); |
||
201 | +#ifndef CONFIG_MODULE_STRIPPED |
||
202 | add_moddevtable(&buf, mod); |
||
203 | +#endif |
||
204 | add_srcversion(&buf, mod); |
||
205 | |||
206 | sprintf(fname, "%s.mod.c", mod->name); |