关于在Eoot 中上使用 malloc的问题

xinxi   2009-1-8 11:38 楼主
请教各位高手有没有碰到类似的问题:

  好像EBoot 中某些标准的ANSI库函数用不了,例如 malloc,free ,sprintf等.
  
  我查了一下source 下的  TARGETLIBS
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib                        \

中 fulllibc.lib  ,linking出错.
    将它去掉,再include 后 编译可通过,但boot却不能运行,

   是怎么回事,有没有办法解决掉?

回复评论 (15)

malloc不在$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib \
点赞  2009-1-8 11:56
#include 试试
点赞  2009-1-8 12:00
在PB找到帮助
Example

/* MALLOC.C: This program allocates memory with
* malloc, then frees the memory with free.
*/

#include          /* For _MAX_PATH definition */
#include
#include

void main( void )
{
   char *string;

   /* Allocate space for a path name */
   string = malloc( _MAX_PATH );

   // In a C++ file, explicitly cast malloc's return.  For example,
   // string = (char *)malloc( _MAX_PATH );

   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}
Output

Memory space allocated for path name
Memory freed
Requirements
OS Versions: Windows CE 2.0 and later.
Header: stdlib.h.————使用文件头。
Link Library: coredll.dll.
——使用的库

点赞  2009-1-8 12:32
#include 没用的,还是会出现下面的错误,


BUILD: [01:0000000153:ERRORE] fulllibc.lib(malloc.obj) : error LNK2019: unresolved external symbol LocalAlloc referenced in function _nh_malloc
BUILD: [01:0000000154:ERRORE] fulllibc.lib(invarg.obj) : error LNK2019: unresolved external symbol __crt_unrecoverable_error referenced in function _invalid_parameter
BUILD: [01:0000000155:ERRORE] C:\WINCE600\platform\SMDK6400\target\ARMV4I\retail\eboot.exe : fatal error LNK1120: 2 unresolved externals
BUILD: [01:0000000160:ERRORE] EDITBIN : fatal error LNK1104: cannot open file 'C:\WINCE600\platform\SMDK6400\target\ARMV4I\retail\eboot.exe'


    好像 fulllibc.lib库中跟 malloc有冲突
点赞  2009-1-8 14:08
我是的用wince 6.0 +三星6400的BSP,编译工具是VS2005
点赞  2009-1-8 14:13
eboot里面内存应该是要由自己管理的,我不确定能不能用molloc,不过我觉得应该不行,因为你用malloc的话,那么是谁去做这个内存管理的工作呢?
点赞  2009-1-8 14:17
我觉得应该还是fulllibc.lib 的问题,如果malloc不能用的话,为什么sprintf同样也不行?MSDN上写了,fulllibc.lib支持全部的C库
Kernel Image Libraries
FullLibc.lib: Microsoft C Run-Time Library for Windows CE. LoadAuth.lib: Sample library for digital signature verification of executable files.
  怪了...
点赞  2009-1-8 14:31
你仔细看看的帮助文档,这个问题应该不难解决。
还有,你查看malloc出现的地方。对比即可。
点赞  2009-1-8 14:31
引用: 引用 6 楼 yashi 的回复:
eboot里面内存应该是要由自己管理的,我不确定能不能用molloc,不过我觉得应该不行,因为你用malloc的话,那么是谁去做这个内存管理的工作呢?
————————————————————————————————
我觉得应该还是fulllibc.lib 的问题,如果malloc不能用的话,为什么sprintf同样也不行?MSDN上写了,fulllibc.lib支持全部的C库
Kernel Image Libraries
FullLibc.lib: Microsoft C Run-Time Library for Windows CE. LoadAuth.lib: Sample library for digital signature verification of executable files.
  怪了...


我觉得yashi版主说的对,在eboot没有见过使用这个malloc,sprintf更加不行了。
点赞  2009-1-8 14:34
即使连接进来,那这个bootloader变得这么大,不好。
bootloader的大小很敏感的。
点赞  2009-1-8 14:35
不要想了,malloc在EBOOT不能用。除非你自己做内存管理,否则在BOOTLOADER里不能动态分配内存的。malloc是在堆上分配内存,boot loader除了你自己做,谁来管理堆呢?
点赞  2009-1-8 14:39
malloc是CRT的函数,CRT很大的,不可能链接进Bootload
malloc在堆上分配内存,用前还要初始化堆,自己弄很麻烦
Eboot用内存自己找一个与text,data,栈都不冲突的区域用就行了
点赞  2009-1-8 15:01
发一个我自己写的特简单的malloc/free实现给你参考参考。你只需要自己定义这两个宏:
IMAGE_MALLOC_BUFFER_CA_START
IMAGE_MALLOC_BUFFER_SIZE
使用时记住一点就行了,free的次序必须和malloc相反,换句话说最后分配的最先释放。

/*
* Simple memory allocator for the bootstrap loader.
*/

#include

#define MAX_CHUNK_SIZE IMAGE_MALLOC_BUFFER_SIZE
#define ROUND_UP(x) (((x-1)|3)+1)
#define IS_LAST_CHUNK(p) ( ((char*)p + p->len) >= ((char*)chunklist + MAX_CHUNK_SIZE) )

struct chunk
{
        struct chunk *prev;
        size_t len;
};

static struct chunk *chunklist = 0;

void* bl_malloc(size_t len)
{
        struct chunk *p, *q, *t;
        size_t clen;

        if (!len) return 0;
       
        clen = ROUND_UP(len) + sizeof(struct chunk);

        p = chunklist;
        if (p)
        {
                if (p->len < clen)
                        return 0;
                p->len -= clen;
                q = (struct chunk*) ((char*)p + sizeof(struct chunk) + p->len);
                q->len = clen;
                q->prev = p;
                if (!IS_LAST_CHUNK(q))
                {
                        // adjust previous pointer of next chunk
                        t = (struct chunk*) ((char*)q + q->len);
                        t->prev = q;
                }

                q++;
                return (void *)q;
        }
        else
        {
                chunklist = (struct chunk*)IMAGE_MALLOC_BUFFER_CA_START;
                chunklist->prev = 0;
                chunklist->len  = MAX_CHUNK_SIZE - sizeof(struct chunk);
                return bl_malloc(len);
        }
}

void bl_free(void *vp)
{
        struct chunk *p, *q, *t;
        if (!vp) return;

        p = (struct chunk*)vp;
        p--;
        q = p->prev;

        if (!IS_LAST_CHUNK(p))
        {
                // adjust previous pointer of next chunk
                t = (struct chunk*) ((char*)p + p->len);
                t->prev = q;
        }
        q->len += p->len;
}
点赞  2009-1-8 16:54
Eboot下, 所有内存你都可以操作, 没必要用malloc, 如果要用, 自己实现一个简单的就可以了, 毕竟它只是一个bootloader.
点赞  2009-1-10 15:54
引用: 引用 14 楼 eagle1597 的回复:
Eboot下, 所有内存你都可以操作, 没必要用malloc, 如果要用, 自己实现一个简单的就可以了, 毕竟它只是一个bootloader.


我同意这样的观点

malloc后谁来管理你的内存?还是不要实现的好啊
点赞  2009-1-11 13:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复