Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Helge Deller and committed by
Linus Torvalds
35dead42 ebd65a58

+4 -1
+4 -1
kernel/module.c
··· 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]), ··· 1207 1206 gattr = &sect_attrs->grp.attrs[0]; 1208 1207 for (i = 0; i < nsect; i++) { 1209 1208 if (! (sechdrs[i].sh_flags & SHF_ALLOC)) 1209 + continue; 1210 + if (!sechdrs[i].sh_size) 1210 1211 continue; 1211 1212 sattr->address = sechdrs[i].sh_addr; 1212 1213 sattr->name = kstrdup(secstrings + sechdrs[i].sh_name,