LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1096|回复: 3

各位好,请教一个C链接错误

[复制链接]
发表于 2008-1-11 10:16:44 | 显示全部楼层 |阅读模式
我在学习用犹它大学的OSKIT,在测试它的Hello程序的时候,出现了如下的链接错误:

ld -Ttext 100000  -L../../lib \
                -o hello ../../lib/multiboot.o hello.o          \
                -loskit_clientos -loskit_kern -loskit_lmm \
                -loskit_c ../../lib/crtn.o
../../lib/liboskit_clientos.a(mem.o):在函数‘mem_realloc’中:
/home/yk/oskit/clientos/mem.c:155:对‘memcpy’未定义的引用
../../lib/liboskit_kern.a(direct_cons_putchar.o):在函数‘scroll’中:
../kern/x86/pc/direct_cons_putchar.c:74:对‘memcpy’未定义的引用

其中memcpy的定义在一个它提供的一个<string.h>中,为

#define memcpy __builtin_memcpy

我想问一下,它是意思是不是直接使用GCC定义的__builtin_memcpy?怎么消除这个链接错误啊?

现在我还有点困惑的是,最后链接出来的结果,是作为一个可启动镜像的,应该不依赖于任何库,这是需要用到GCC的__builtin_memcpy是否有点不妥呢?
    上述问题,还请高手明示,谢谢各位了!
发表于 2008-1-11 13:18:51 | 显示全部楼层
#define是预编译指令,如果它执行了的话,你不可能在链接的时候,还会看到memcpy这个函数名的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-11 15:47:57 | 显示全部楼层
Post by pupilzeng;1805621
#define是预编译指令,如果它执行了的话,你不可能在链接的时候,还会看到memcpy这个函数名的。


这里是它的原定义:
#if        !defined(__GNUC__) || defined(OSKIT_ARM32_SHARK)
void *memcpy(void *__to, const void *__from, unsigned int __n);
int memcmp(const void *s1v, const void *s2v, oskit_size_t size);
#else
#define memcpy __builtin_memcpy
#define memcmp __builtin_memcmp
#endif

__GNUC__应该是定义过的,因为当我把 -D__GNUC__加到makefile中的时候,编译提示__GNUC__ is redefined,而我用不到ARM架构,所以我也不用它上而提供的memcpy与memcmp,所以我把上面这段代码给注释掉了,然后又在下面写了如下:
#define memcpy __builtin_memcpy
#define memcmp __builtin_memcmp
也就是直接使用GCC的函数,编译的时候没错,就链接的时候出错,很是郁闷啊
回复 支持 反对

使用道具 举报

发表于 2008-1-13 02:52:58 | 显示全部楼层
你尝试自己定义这些函数并实现呢!然后拿掉相应的头文件或者直接static链结看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表