我是新手,gcc编译又出个错不知道怎么改,请大侠帮帮忙啊。。

josling 2009-11-07 04:20:45
1、undefined reference to `memcpy'
在函数里添加了 “string。h”头文件啊。。是不是libgcc没连上,不是默认连这个库的吗。。。。。那怎么连啊?

2、另外还出现了很多 undefined reference to “我自己些的函数名”

都加了头文件的啊。。。。生成.o .链接就出现这个错了。。。。。。
不知道是不是。o文件顺序不对。。。

纯新手。。。请帮忙啊,今天出了一堆错,郁闷死了。。。。。
...全文
581 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
josling 2009-11-08
  • 打赏
  • 举报
回复
谢谢yutaoo大侠啊。。。
josling 2009-11-08
  • 打赏
  • 举报
回复
可是假如随机函数呢?random怎么写。。。
yutaooo 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 josling 的回复:]
自己写的怕不保险。。。。。呵呵。。。所以想链接一个写好的libc。。。。。
那问下还有什么办法吗?

另外生成map文件,是在ld下用-M 命令吧?gcc可以直接生成map吗?
[/Quote]

libc 作为用户态的接口,其中的函数,本身是有可能调用system call的。这样的函数一定是不能用的。至于 memcpy 这样的函数,说实话挺难说的,看它实现了。静态链接,那是一定的了。

ld的选项 -Map mapfile
查一下手册吧。
do_fork 2009-11-07
  • 打赏
  • 举报
回复
x86实现

static __always_inline void *__memcpy(void *to, const void *from, size_t n)
{
int d0, d1, d2;
asm volatile("rep ; movsl\n\t"
"movl %4,%%ecx\n\t"
"andl $3,%%ecx\n\t"
"jz 1f\n\t"
"rep ; movsb\n\t"
"1:"
: "=&c" (d0), "=&D" (d1), "=&S" (d2)
: "0" (n / 4), "g" (n), "1" ((long)to), "2" ((long)from)
: "memory");
return to;
}
do_fork 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 josling 的回复:]
自己写的怕不保险。。。。。呵呵。。。所以想链接一个写好的libc。。。。。
那问下还有什么办法吗?

另外生成map文件,是在ld下用-M 命令吧?gcc可以直接生成map吗?
[/Quote]

不用自己写
内核中随便抄一段下来

void *memcpy(void *dest, const void *src, unsigned n)
{
int i;
const char *s = src;
char *d = dest;

for (i = 0; i < n; i++)
d[i] = s[i];
return dest;
}
wxdcxp 2009-11-07
  • 打赏
  • 举报
回复
或者g++ -o helo hello.o
josling 2009-11-07
  • 打赏
  • 举报
回复
自己写的怕不保险。。。。。呵呵。。。所以想链接一个写好的libc。。。。。
那问下还有什么办法吗?

另外生成map文件,是在ld下用-M 命令吧?gcc可以直接生成map吗?
wxdcxp 2009-11-07
  • 打赏
  • 举报
回复
你下的命令是不是这样例如:
gcc -o hello hello.o
do_fork 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 josling 的回复:]
谢谢啊。。。。
查了有这个库
我是编译自己开发的内核,没写memset,memcpy。
那应该用静态链接的吧,查了下ld手册 命令是-static吗?

恩,那个链接脚本确实可以用的。

谢谢大侠啊。。。。。
[/Quote]

在内核空间使用用户空间函数?
yutaooo 2009-11-07
  • 打赏
  • 举报
回复

是的。编译内核就不应该用动态链接了。

并且,编译内核通常也不链接 libc
josling 2009-11-07
  • 打赏
  • 举报
回复
谢谢啊。。。。
查了有这个库
我是编译自己开发的内核,没写memset,memcpy。
那应该用静态链接的吧,查了下ld手册 命令是-static吗?

恩,那个链接脚本确实可以用的。

谢谢大侠啊。。。。。
yutaooo 2009-11-07
  • 打赏
  • 举报
回复

-dynamic-linker /lib/ld-linux.so.2

这里,-dynamic-linker 是指示连接器将“动态链接器”组件链入你的应用程序。

/lib/ld-linux.so.2 就是这个组件。你最好调查一下,是否有这个文件。


======

这样的方式是采用动态连接 libc 的方式。你是要动态连接 libc 吗?或者是用静态的?

你是在编译一个自己开发的内核?还是一个普通的应用程序?

=====

myos.ld 是否应该改名成 myos.lds ?不过链接脚本也无所谓。
josling 2009-11-07
  • 打赏
  • 举报
回复
谢谢,我加了-dynamic-linker /lib/ld-linux.so.2 还是不行啊。。。。
对了,可能还得提一下,我的链接命令是
ld ${LINK_FLAGS} -T myOS.ld ${OS_OBJS} -o myOS.elf //这里是把.o文件生成elf文件。。。并用自己的连接文件链接。。。
myos.ld 这个链接文件就是简单的吧text段放到一个地址,数据段放到一个地址。。。。

LINK_FLAGS = -dynamic-linker /lib/ld-linux.so.2

这样试了之后还是不行啊。。。
yutaooo 2009-11-07
  • 打赏
  • 举报
回复

gcc 作为驱动,会去调用 ld。这个时候,的确是把libc默认连接进来的。

如果用 ld。恐怕你要如下写法。

ld -dynamic-linker /lib/ld-linux.so.2 -o test -lc xxx_1.o xxx_2.o xxx_3.o
josling 2009-11-07
  • 打赏
  • 举报
回复
第2个问题是自己不小心造成的,已改。。。。
第1个问题怎么解决啊。。。

就是undefined reference to `memcpy'
在函数里添加了 “string。h”头文件啊。。是不是libgcc没连上,不是默认连这个库的吗。。。。。那怎么连啊?
josling 2009-11-07
  • 打赏
  • 举报
回复
恩build-essential 安装了的。。。。
yutaooo 2009-11-07
  • 打赏
  • 举报
回复

明白了。连接不是ld呀。应该是 gcc !

ld 的确是不自代那些库的。

应该是

gcc -o target xxx_1.o xxx_2.o xxx_3.o
do_fork 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 josling 的回复:]
连接就简单一个ld。。。。
[/Quote]

build-essential 安装了吗?
josling 2009-11-07
  • 打赏
  • 举报
回复
连接就简单一个ld。。。。
josling 2009-11-07
  • 打赏
  • 举报
回复
安装的是ubuntu自带的gcc,版本4.3.3。
加载更多回复(8)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧