public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* module version magic and arches with symbol prefixes
@ 2009-06-18 15:24 Mike Frysinger
  2009-06-19  5:38 ` Rusty Russell
  0 siblings, 1 reply; 12+ messages in thread
From: Mike Frysinger @ 2009-06-18 15:24 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Linux kernel mailing list, Robin Getz

the current check_modstruct_version() does this:
{
    const unsigned long *crc;

    if (!find_symbol("module_layout", NULL, &crc, true, false))
        BUG();
    return check_version(sechdrs, versindex, "module_layout", mod, crc);
}
the trouble here is that it looks for a literal "module_layout" symbol
and for ports that have symbol prefixes (a quick check shows Blackfin
& h8300), this aint going to work.

i tried to hack it in the Blackfin port by add this to the linker script:
module_layout = _module_layout
but that didnt seem to work.  maybe kallsysms couldnt find it or i
need to hack a different name ...

we could add a new function to asm-generic/sections.h:
#ifndef arch_symbol_name
#define arch_symbol_name(sym) sym
#endif
and in the case of Blackfin systems, we'd do:
#define arch_symbol_name(sym) "_" sym

no other consumer of find_symbol() has a problem because they're all
dynamic -- they scan the modules for required symbols and then scan
the kernel for those, so all the symbol prefixes line up.

that would fix the find_symbol() invocation, and check_version()
wouldnt need changing because in that case, it's look for the literal
symbol that scripts/mod/modpost.c is adding -- "module_layout" in this
case.

also, using BUG() here seems pretty damn harsh.  wouldnt it make more
sense to do something like:
    if (WARN_ON(!find_symbol("module_layout", NULL, &crc, true, false)))
        return 0;
this way the module is simply not loaded rather than killing the kernel
-mike

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-18 15:24 module version magic and arches with symbol prefixes Mike Frysinger
@ 2009-06-19  5:38 ` Rusty Russell
  2009-06-19  7:49   ` [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout Mike Frysinger
  2009-06-19 12:54   ` module version magic and arches with symbol prefixes Robin Getz
  0 siblings, 2 replies; 12+ messages in thread
From: Rusty Russell @ 2009-06-19  5:38 UTC (permalink / raw)
  To: Mike Frysinger; +Cc: Linux kernel mailing list, Robin Getz

On Fri, 19 Jun 2009 12:54:44 am Mike Frysinger wrote:
> the current check_modstruct_version() does this:
> {
>     const unsigned long *crc;
>
>     if (!find_symbol("module_layout", NULL, &crc, true, false))
>         BUG();
>     return check_version(sechdrs, versindex, "module_layout", mod, crc);
> }
> the trouble here is that it looks for a literal "module_layout" symbol
> and for ports that have symbol prefixes (a quick check shows Blackfin
> & h8300), this aint going to work.

MODULE_SYMBOL_PREFIX is the fix for this, ie:

	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout), ...

> also, using BUG() here seems pretty damn harsh.  wouldnt it make more
> sense to do something like:
>     if (WARN_ON(!find_symbol("module_layout", NULL, &crc, true, false)))
>         return 0;
> this way the module is simply not loaded rather than killing the kernel

No, it means the kernel didn't build properly.  Better to fail spectacularly: 
ideally we'd do this find in an init routine and guarantee a boot crash.

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout
  2009-06-19  5:38 ` Rusty Russell
@ 2009-06-19  7:49   ` Mike Frysinger
  2009-06-19 14:02     ` Rusty Russell
  2009-06-19 12:54   ` module version magic and arches with symbol prefixes Robin Getz
  1 sibling, 1 reply; 12+ messages in thread
From: Mike Frysinger @ 2009-06-19  7:49 UTC (permalink / raw)
  To: Rusty Russell; +Cc: linux-kernel, Robin Getz

The check_modstruct_version() needs to look up the symbol "module_layout"
in the kernel, but it does so literally and not by a C identifier.  The
trouble is that it does not include a symbol prefix for those ports that
need it (like the Blackfin and H8300 port).  So make sure we tack on the
MODULE_SYMBOL_PREFIX define to the front of it.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 kernel/module.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/kernel/module.c b/kernel/module.c
index 80036bc..7850bef 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1053,7 +1053,8 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
 {
 	const unsigned long *crc;
 
-	if (!find_symbol("module_layout", NULL, &crc, true, false))
+	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
+	                 &crc, true, false))
 		BUG();
 	return check_version(sechdrs, versindex, "module_layout", mod, crc);
 }
-- 
1.6.3.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-19  5:38 ` Rusty Russell
  2009-06-19  7:49   ` [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout Mike Frysinger
@ 2009-06-19 12:54   ` Robin Getz
  2009-06-19 13:14     ` Mike Frysinger
  1 sibling, 1 reply; 12+ messages in thread
From: Robin Getz @ 2009-06-19 12:54 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Mike Frysinger, Linux kernel mailing list

On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
> On Fri, 19 Jun 2009 12:54:44 am Mike Frysinger wrote:
> > the current check_modstruct_version() does this:
> > {
> >     const unsigned long *crc;
> >
> >     if (!find_symbol("module_layout", NULL, &crc, true, false))
> >         BUG();
> >     return check_version(sechdrs, versindex, "module_layout", mod, crc);
> > }
> > the trouble here is that it looks for a literal "module_layout" symbol
> > and for ports that have symbol prefixes (a quick check shows Blackfin
> > & h8300), this aint going to work.
> 
> MODULE_SYMBOL_PREFIX is the fix for this, ie:
> 
> 	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout), ...
> 
> > also, using BUG() here seems pretty damn harsh.  wouldnt it make more
> > sense to do something like:
> >     if (WARN_ON(!find_symbol("module_layout", NULL, &crc, true, false)))
> >         return 0;
> > this way the module is simply not loaded rather than killing the kernel
> 
> No, it means the kernel didn't build properly.

Or a module didn't build properly.

> Better to fail spectacularly:  
> ideally we'd do this find in an init routine and guarantee a boot crash.

But this isn't an init routine - this is something that runs when a module is 
loaded...

Anyone who can load a module can crash the kernel? I would expect the module 
not to load - but I agree with Mike - it seems a little harsh for someone who 
screwed up their module makefile....

-Robin

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-19 12:54   ` module version magic and arches with symbol prefixes Robin Getz
@ 2009-06-19 13:14     ` Mike Frysinger
  2009-06-19 17:07       ` Robin Getz
  0 siblings, 1 reply; 12+ messages in thread
From: Mike Frysinger @ 2009-06-19 13:14 UTC (permalink / raw)
  To: Robin Getz; +Cc: Rusty Russell, Linux kernel mailing list

On Fri, Jun 19, 2009 at 08:54, Robin Getz wrote:
> On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
>> On Fri, 19 Jun 2009 12:54:44 am Mike Frysinger wrote:
>> > the current check_modstruct_version() does this:
>> > {
>> >     const unsigned long *crc;
>> >
>> >     if (!find_symbol("module_layout", NULL, &crc, true, false))
>> >         BUG();
>> >     return check_version(sechdrs, versindex, "module_layout", mod, crc);
>> > }
>> > the trouble here is that it looks for a literal "module_layout" symbol
>> > and for ports that have symbol prefixes (a quick check shows Blackfin
>> > & h8300), this aint going to work.
>>
>> MODULE_SYMBOL_PREFIX is the fix for this, ie:
>>
>>       if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout), ...
>>
>> > also, using BUG() here seems pretty damn harsh.  wouldnt it make more
>> > sense to do something like:
>> >     if (WARN_ON(!find_symbol("module_layout", NULL, &crc, true, false)))
>> >         return 0;
>> > this way the module is simply not loaded rather than killing the kernel
>>
>> No, it means the kernel didn't build properly.
>
> Or a module didn't build properly.

nah, when i talked to you earlier i was wrong -- this find_symbol() is
looking up the symbol in the kernel, not in the module.  the lookup of
the symbol in the requested module actually works.
-mike

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout
  2009-06-19  7:49   ` [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout Mike Frysinger
@ 2009-06-19 14:02     ` Rusty Russell
  2009-06-19 18:29       ` Mike Frysinger
  0 siblings, 1 reply; 12+ messages in thread
From: Rusty Russell @ 2009-06-19 14:02 UTC (permalink / raw)
  To: Mike Frysinger; +Cc: linux-kernel, Robin Getz

On Fri, 19 Jun 2009 05:19:22 pm Mike Frysinger wrote:
> The check_modstruct_version() needs to look up the symbol "module_layout"
> in the kernel, but it does so literally and not by a C identifier.  The
> trouble is that it does not include a symbol prefix for those ports that
> need it (like the Blackfin and H8300 port).  So make sure we tack on the
> MODULE_SYMBOL_PREFIX define to the front of it.

Thanks, applied.  I'm surprised this took so long to find.

Rusty.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-19 13:14     ` Mike Frysinger
@ 2009-06-19 17:07       ` Robin Getz
  2009-06-19 18:32         ` Mike Frysinger
  2009-06-23  7:07         ` Rusty Russell
  0 siblings, 2 replies; 12+ messages in thread
From: Robin Getz @ 2009-06-19 17:07 UTC (permalink / raw)
  To: Mike Frysinger; +Cc: Rusty Russell, Linux kernel mailing list

On Fri 19 Jun 2009 09:14, Mike Frysinger pondered:
> On Fri, Jun 19, 2009 at 08:54, Robin Getz wrote:
> > On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
> >> No, it means the kernel didn't build properly.
> >
> > Or a module didn't build properly.
> 
> nah, when i talked to you earlier i was wrong -- this find_symbol() is
> looking up the symbol in the kernel, not in the module.  the lookup of
> the symbol in the requested module actually works.

OK - Yeah, I see it now in the kernel proper. (sorry for the noise)

Wouldn't it make sense to move this somewhere else then? and add a 
__initcall() for it? We should only need to check for it once - it would make 
things insignificantly faster, and smaller :)


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout
  2009-06-19 14:02     ` Rusty Russell
@ 2009-06-19 18:29       ` Mike Frysinger
  0 siblings, 0 replies; 12+ messages in thread
From: Mike Frysinger @ 2009-06-19 18:29 UTC (permalink / raw)
  To: Rusty Russell; +Cc: linux-kernel, Robin Getz

On Fri, Jun 19, 2009 at 10:02, Rusty Russell wrote:
> On Fri, 19 Jun 2009 05:19:22 pm Mike Frysinger wrote:
>> The check_modstruct_version() needs to look up the symbol "module_layout"
>> in the kernel, but it does so literally and not by a C identifier.  The
>> trouble is that it does not include a symbol prefix for those ports that
>> need it (like the Blackfin and H8300 port).  So make sure we tack on the
>> MODULE_SYMBOL_PREFIX define to the front of it.
>
> Thanks, applied.  I'm surprised this took so long to find.

well, technically i first noticed on 2007-10-24, but the fix that went
in internally sucked and people forgot about it ;)
-mike

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-19 17:07       ` Robin Getz
@ 2009-06-19 18:32         ` Mike Frysinger
  2009-06-23  7:07         ` Rusty Russell
  1 sibling, 0 replies; 12+ messages in thread
From: Mike Frysinger @ 2009-06-19 18:32 UTC (permalink / raw)
  To: Robin Getz; +Cc: Rusty Russell, Linux kernel mailing list

On Fri, Jun 19, 2009 at 13:07, Robin Getz wrote:
> On Fri 19 Jun 2009 09:14, Mike Frysinger pondered:
>> On Fri, Jun 19, 2009 at 08:54, Robin Getz wrote:
>> > On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
>> >> No, it means the kernel didn't build properly.
>> >
>> > Or a module didn't build properly.
>>
>> nah, when i talked to you earlier i was wrong -- this find_symbol() is
>> looking up the symbol in the kernel, not in the module.  the lookup of
>> the symbol in the requested module actually works.
>
> Wouldn't it make sense to move this somewhere else then? and add a
> __initcall() for it? We should only need to check for it once - it would make
> things insignificantly faster, and smaller :)

it would also have the advantage of the BUG() being noticed sooner ...
but up to Rusty i guess.
-mike

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-19 17:07       ` Robin Getz
  2009-06-19 18:32         ` Mike Frysinger
@ 2009-06-23  7:07         ` Rusty Russell
  2009-06-29 12:07           ` Robin Getz
  1 sibling, 1 reply; 12+ messages in thread
From: Rusty Russell @ 2009-06-23  7:07 UTC (permalink / raw)
  To: Robin Getz; +Cc: Mike Frysinger, Linux kernel mailing list

On Sat, 20 Jun 2009 02:37:45 am Robin Getz wrote:
> On Fri 19 Jun 2009 09:14, Mike Frysinger pondered:
> > On Fri, Jun 19, 2009 at 08:54, Robin Getz wrote:
> > > On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
> > >> No, it means the kernel didn't build properly.
> > >
> > > Or a module didn't build properly.
> >
> > nah, when i talked to you earlier i was wrong -- this find_symbol() is
> > looking up the symbol in the kernel, not in the module.  the lookup of
> > the symbol in the requested module actually works.
>
> OK - Yeah, I see it now in the kernel proper. (sorry for the noise)
>
> Wouldn't it make sense to move this somewhere else then? and add a
> __initcall() for it? We should only need to check for it once - it would
> make things insignificantly faster, and smaller :)

Patch welcome.

Rusty.



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: module version magic and arches with symbol prefixes
  2009-06-23  7:07         ` Rusty Russell
@ 2009-06-29 12:07           ` Robin Getz
  0 siblings, 0 replies; 12+ messages in thread
From: Robin Getz @ 2009-06-29 12:07 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Mike Frysinger, Linux kernel mailing list

On Tue 23 Jun 2009 03:07, Rusty Russell pondered:
> On Sat, 20 Jun 2009 02:37:45 am Robin Getz wrote:
> > On Fri 19 Jun 2009 09:14, Mike Frysinger pondered:
> > > On Fri, Jun 19, 2009 at 08:54, Robin Getz wrote:
> > > > On Fri 19 Jun 2009 01:38, Rusty Russell pondered:
> > > >> No, it means the kernel didn't build properly.
> > > >
> > > > Or a module didn't build properly.
> > >
> > > nah, when i talked to you earlier i was wrong -- this find_symbol() is
> > > looking up the symbol in the kernel, not in the module.  the lookup of
> > > the symbol in the requested module actually works.
> >
> > OK - Yeah, I see it now in the kernel proper. (sorry for the noise)
> >
> > Wouldn't it make sense to move this somewhere else then? and add a
> > __initcall() for it? We should only need to check for it once - it would
> > make things insignificantly faster, and smaller :)
> 
> Patch welcome.

I looked at this:

> static inline int check_modstruct_version(Elf_Shdr *sechdrs,
>                                           unsigned int versindex,
>                                           struct module *mod)
> {
>         const unsigned long *crc;
>
>         if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
>                          &crc, true, false))
>                 BUG();
>         return check_version(sechdrs, versindex, "module_layout", mod, crc); }

and then decided that since you need to call find_symbol() to populate 
the crc, before it is used in check_version(), you might as well leave
alone (it wouldn't result in any smaller/faster code)...

So, I didn't send anything...

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout
@ 2009-07-23 14:12 Rusty Russell
  0 siblings, 0 replies; 12+ messages in thread
From: Rusty Russell @ 2009-07-23 14:12 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel, Mike Frysinger

From: Mike Frysinger <vapier@gentoo.org>

The check_modstruct_version() needs to look up the symbol "module_layout"
in the kernel, but it does so literally and not by a C identifier.  The
trouble is that it does not include a symbol prefix for those ports that
need it (like the Blackfin and H8300 port).  So make sure we tack on the
MODULE_SYMBOL_PREFIX define to the front of it.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 kernel/module.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/module.c b/kernel/module.c
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1068,7 +1068,8 @@ static inline int check_modstruct_versio
 {
 	const unsigned long *crc;
 
-	if (!find_symbol("module_layout", NULL, &crc, true, false))
+	if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
+			 &crc, true, false))
 		BUG();
 	return check_version(sechdrs, versindex, "module_layout", mod, crc);
 }

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2009-07-23 14:12 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-18 15:24 module version magic and arches with symbol prefixes Mike Frysinger
2009-06-19  5:38 ` Rusty Russell
2009-06-19  7:49   ` [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout Mike Frysinger
2009-06-19 14:02     ` Rusty Russell
2009-06-19 18:29       ` Mike Frysinger
2009-06-19 12:54   ` module version magic and arches with symbol prefixes Robin Getz
2009-06-19 13:14     ` Mike Frysinger
2009-06-19 17:07       ` Robin Getz
2009-06-19 18:32         ` Mike Frysinger
2009-06-23  7:07         ` Rusty Russell
2009-06-29 12:07           ` Robin Getz
  -- strict thread matches above, loose matches on Subject: below --
2009-07-23 14:12 [PATCH] module: use MODULE_SYMBOL_PREFIX with module_layout Rusty Russell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox