undefined reference to `memset'

Vinod Kashyap vkashyap at amcc.com
Thu Mar 24 12:04:19 PST 2005


> This version makes the pessimizations and potential bugs clear:
> - clearing 100 bytes on every entry to the function is 
> wasteful.  C90's
>    auto initializers hide pessimizations like this.  They should be
>    used very rarely, especially in kernels.  But they are 
> often misused,
>    even in kernels, even for read-only data that should be 
> static.  gcc
>    doesn't optimize even "auto const x[100] = { 0 };" to a static
>    initialization -- the programmer must declare the object 
> as static to
>    prevent gcc laboriously clearing it on every entry to the function.
> - 100 bytes may be too much to put on the kernel stack.  Objects just
>    a little larger than this must be dynamically allocated unless they
>    can be read-only.
> 

A statement like this (auto and not static) is necessary if you
are dealing with re-entrancy.  Whatever the issues with wastage or
bad performance, a programmer should definitely be able to do it,
if he so desires.  Also, the line I mentioned earlier was only
an example.  Something like this also fails (your response already
explains this):
-----
struct x_type x = {0};
-----

> > Adding CFLAGS+=-fbuiltin, or CFLAGS+=-fno-builtin to 
> /sys/conf/Makefile.amd64
> > does not help.
> 
> -fno-builtin is already in CFLAGS, and if it has any effect 
> on this then
> it should be to cause gcc to generate a call to memset() 
> instead of doing
> the memory clearing inline.  I think gcc has a builtin 
> memset() which is
> turned off by -fno-builtin, but -fno-builtin doesn't affect 
> cases where
> memset() is not referenced in the source code.
> 
> -ffreestanding should prevent gcc generating calls to library 
> functions
> like memset().  However, -ffreestanding is already in CFLAGS too, and
> there is a problem: certain initializations like the one in 
> your example
> need to use an interface like memset(), and struct copies 
> need to use and
> interface like memcpy(), so what is gcc to do when 
> -fno-builtin tells it
> to turn off its builtins and -ffreestanding tells it that the relevant
> interfaces might not exist in the library?
> 
> > Anyone knows what's happening?
> 
> gcc is expecting that memset() is in the library, but the 
> FreeBSD kernel
> is freestanding and happens not to have memset() in its library.
> 

How is it then, that an explicit call to memset (like in my example) works?

As about other questions in the thread:
1. Yes, the example code is within a function,
2. I should have mentioned that I don't see the problem if I am
   building only the kernel module.  It happens only when I am building
   the kernel integrating the module containing the example code.






More information about the freebsd-amd64 mailing list