"Dresner, Norman A." wrote:
> 
> > -----Original Message-----
> > From: Stuart Hughes [SMTP:[EMAIL PROTECTED]]
> > Sent: Wednesday, February 23, 2000 6:39 AM
> > To:   David Schleef
> > Cc:   rtlinux
> > Subject:      Re: [rtl] Problem loading modules
> >
> > David Schleef wrote:
> > >
> > > On Tue, Feb 22, 2000 at 12:51:11PM +0000, Stuart Hughes wrote:
> > > >
> > > > Note also the following compiler feature:
> > > >
> > > > If have in your RT code:
> > > >
> > > >       char buf[12] = "mystring";
> > > >
> > > > You get an error, due to an implicit call to memset.
> > >
> > > Nope.  gcc-2.7.2.3 outputs assembly instructions that perform
> > > the memcpy, even with very long strings.
> >
> > Hi Dave,
> >
> > That's weird, this is what I get (gcc version 2.7.2.3).  If I compile
> > the code below using:
> >
> > cc -O2 -g -D__KERNEL__ -DMODULE -c -o para_mod.o para.c
> >
> > and then try to insmod para_mod.o, I get the following:
> >
> > ./para_mod.o: unresolved symbol memset
> >
> > If I comment out the first version and uncomment the second, everything
> > works ???
> >
> > Any ideas ??
> >
>         [Norm Says:]
>         The first form ( char buff[12]="test"; ) creates the string "test"
> somewhere in memory and then when the function init_module is entered, space
> is made on the stack for the buf[] array and the string is copied from the
> string to the array.
> 
>         The second form ( char *buff="test";) also creates the string "test"
> in memory -- probably in the same place as the first -- but when the
> function init_module is entered, just the space for a char-pointer is made
> on the stack and the pointer is initialized with the addess of the string;
> no copying is done, just the storing of a "numeric" data item on the stack
> (possibly even a push of immediate data).
> 
>         It's all perfectly logical.
> 
>                 Norm
> 

Not just logical, but the second form is also preferable.  Passing by
reference should be encouraged, whenever possible, instead of passing by
value due to its greater memory and speed efficiency. Also, if you are
going to be hard coding strings, using a 'const' pointer will be safer.

const char *buff = "test";

- Cheers, Kal.


> > Regards, Stuart
> >
> >
> > // System headers.
> > #include <linux/module.h>
> > #include <asm/io.h>
> >
> > int init_module(void)
> > {
> >     char buf[12] = "test";              // fails, calls implicit memset
> > //    char *buf = "test";               // Okay
> >     printk(buf);
> >
> >     return 0;
> > }
> >
> > void cleanup_module(void)
> > {
> > }
> >
> >
> > -- [rtl] ---
> > To unsubscribe:
> > echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> > echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> > ---
> > For more information on Real-Time Linux see:
> > http://www.rtlinux.org/~rtlinux/
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> ---
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/~rtlinux/
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/~rtlinux/

Reply via email to