One more thought on this.  The traditional usual cure to avoid the copy on
entry is to write:
        static   char buf[12] = "test";  
which (possibly architecture- and compiler-dependent) usually creates a
static array with no copy operation performed.

        Norm

>From: "Dresner, Norman A." <[EMAIL PROTECTED]>
>To: "'Stuart Hughes'" <[EMAIL PROTECTED]>
>Cc: "'RTLinux'" <[EMAIL PROTECTED]>
>Subject: RE: [rtl] Problem loading modules
>Date: Thu, 24 Feb 2000 12:59:32 -0500
>X-Mailer: Internet Mail Service (5.5.2448.0)
>Sender: [EMAIL PROTECTED]
>
>> -----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
>
>> 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