Commit 35dead4235e2b67da7275b4122fed37099c2f462
Committed by
Linus Torvalds
1 parent
ebd65a5855
Exists in
master
and in
4 other branches
modules: don't export section names of empty sections via sysfs
On the parisc architecture we face for each and every loaded kernel module this kernel "badness warning": sysfs: cannot create duplicate filename '/module/ac97_bus/sections/.text' Badness at fs/sysfs/dir.c:487 Reason for that is, that on parisc all kernel modules do have multiple .text sections due to the usage of the -ffunction-sections compiler flag which is needed to reach all jump targets on this platform. An objdump on such a kernel module gives: Sections: Idx Name Size VMA LMA File off Algn 0 .note.gnu.build-id 00000024 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .text 00000000 00000000 00000000 00000058 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .text.ac97_bus_match 0000001c 00000000 00000000 00000058 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 3 .text 00000000 00000000 00000000 000000d4 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE ... Since the .text sections are empty (size of 0 bytes) and won't be loaded by the kernel module loader anyway, I don't see a reason why such sections need to be listed under /sys/module/<module_name>/sections/<section_name> either. The attached patch does solve this issue by not exporting section names which are empty. This fixes bugzilla http://bugzilla.kernel.org/show_bug.cgi?id=14703 Signed-off-by: Helge Deller <deller@gmx.de> CC: rusty@rustcorp.com.au CC: akpm@linux-foundation.org CC: James.Bottomley@HansenPartnership.com CC: roland@redhat.com CC: dave@hiauly1.hia.nrc.ca Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 4 additions and 1 deletions Side-by-side Diff
kernel/module.c
... | ... | @@ -1187,7 +1187,8 @@ |
1187 | 1187 | |
1188 | 1188 | /* Count loaded sections and allocate structures */ |
1189 | 1189 | for (i = 0; i < nsect; i++) |
1190 | - if (sechdrs[i].sh_flags & SHF_ALLOC) | |
1190 | + if (sechdrs[i].sh_flags & SHF_ALLOC | |
1191 | + && sechdrs[i].sh_size) | |
1191 | 1192 | nloaded++; |
1192 | 1193 | size[0] = ALIGN(sizeof(*sect_attrs) |
1193 | 1194 | + nloaded * sizeof(sect_attrs->attrs[0]), |
... | ... | @@ -1206,6 +1207,8 @@ |
1206 | 1207 | gattr = §_attrs->grp.attrs[0]; |
1207 | 1208 | for (i = 0; i < nsect; i++) { |
1208 | 1209 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) |
1210 | + continue; | |
1211 | + if (!sechdrs[i].sh_size) | |
1209 | 1212 | continue; |
1210 | 1213 | sattr->address = sechdrs[i].sh_addr; |
1211 | 1214 | sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, |