请教各位高手有没有碰到类似的问题:
好像EBoot 中某些标准的ANSI库函数用不了,例如 malloc,free ,sprintf等.
我查了一下source 下的 TARGETLIBS
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib \
中 fulllibc.lib ,linking出错.
将它去掉,再include 后 编译可通过,但boot却不能运行,
是怎么回事,有没有办法解决掉?
malloc不在$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib \
在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.——使用的库
#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有冲突
我是的用wince 6.0 +三星6400的BSP,编译工具是VS2005
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.
怪了...
你仔细看看的帮助文档,这个问题应该不难解决。
还有,你查看malloc出现的地方。对比即可。
引用: 引用 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更加不行了。
即使连接进来,那这个bootloader变得这么大,不好。
bootloader的大小很敏感的。
不要想了,malloc在EBOOT不能用。除非你自己做内存管理,否则在BOOTLOADER里不能动态分配内存的。malloc是在堆上分配内存,boot loader除了你自己做,谁来管理堆呢?
malloc是CRT的函数,CRT很大的,不可能链接进Bootload
malloc在堆上分配内存,用前还要初始化堆,自己弄很麻烦
Eboot用内存自己找一个与text,data,栈都不冲突的区域用就行了
发一个我自己写的特简单的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;
}
Eboot下, 所有内存你都可以操作, 没必要用malloc, 如果要用, 自己实现一个简单的就可以了, 毕竟它只是一个bootloader.
引用: 引用 14 楼 eagle1597 的回复:
Eboot下, 所有内存你都可以操作, 没必要用malloc, 如果要用, 自己实现一个简单的就可以了, 毕竟它只是一个bootloader.
我同意这样的观点
malloc后谁来管理你的内存?还是不要实现的好啊