Messages in this thread | | | Subject | Re: [PATCH] x86/kbuild: enable modversions for symbols exported from asm | From | Ian Campbell <> | Date | Fri, 09 Dec 2016 15:21:33 +0000 |
| |
On Fri, 2016-12-09 at 13:33 +1000, Nicholas Piggin wrote: > > Well I simply tested the outcome. If you have: > > struct blah { > int x; > }; > int foo(struct blah *blah) > { > return blah->x; > } > EXPORT(foo); > > $ nm vmlinux | grep __crc_foo > 00000000a0cf13a0 A __crc_foo > > Now change to > > struct blah { > int y; > int x; > }; > > $ nm vmlinux | grep __crc_foo > 00000000a0cf13a0 A __crc_foo > > It just doesn't catch these things.
I found the same when I just added your snippet to init/main.c.
_But_ when I moved the struct into include/types.h (which happened to be included by init/main.c) then, with just x in the struct:
$ make -s init/main.{o,symtypes} && grep -E foo\|blah init/main.symtypes && nm init/main.o | grep __crc_foo s#blah struct blah { int x ; } foo int foo ( s#blah * ) 000000000cd0312e A __crc_foo
but adding y:
$ make -s init/main.{o,symtypes} && grep -E foo\|blah init/main.symtypes && nm init/main.o | grep __crc_foo s#blah struct blah { int x ; int y ; } foo int foo ( s#blah * ) 00000000eda220c6 A __crc_foo
So it does catch things in that case.
With struct blah inline in main.c it was:
$ make -s init/main.{o,symtypes} && grep -E foo\|blah init/main.symtypes && nm init/main.o | grep __crc_foo s#blah struct blah { UNKNOWN } foo int foo ( s#blah * ) 00000000a0cf13a0 A __crc_foo
So I suppose it only cares about structs which are in headers, which I guess makes sense. I think it is working in at least one of the important cases.
Ian.
| |