faku 发表于 2009-11-25 22:13

自定义printf,却提示“putchar未定义”

自己实现了一个简单的内核,自定义了
vsprintf
sprintf
printf
这几个标准库的函数,
连接时,使用了 -nostdlib -nostdinc -Imy_include_path选项,
我把这几个函数编译成libc.a,然后内核其他模块连接这个libc.a,这个库写在了命令的最后一个
但是, vsprintf和sprintf使用没啥问题, printf的使用却出错了,错误大意是
“无法解析的外部符号:putchar”
我将printf改个名字,比如__printf,就不报错了, 使用也正常,
printf仅仅调用了我自己定义的一个系统调用write,没有调用putchar

问题1:以上错误可能的原因是啥?
问题2:据说现在的内核当用到vsprintf这样的函数时,直接使用了c库,不明白原理是什么,首先,不可能动态连接,静态连接似乎也不可能,c静态库动辄上M(兆)大小,难道是编译内核时,使用vsprintf时,就连接了这一个函数代码而去掉了其他函数代码?

faku 发表于 2009-11-25 22:32

以上是我在虚拟机(公司的电脑)中的结果
同样的操作系统,同样版本的gcc,同样的代码
在我的电脑上(非虚拟机)编译通过

mik 发表于 2009-11-25 22:48

原帖由 faku 于 2009-11-25 22:13 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
自己实现了一个简单的内核,自定义了
vsprintf
sprintf
printf
这几个标准库的函数,
连接时,使用了 -nostdlib -nostdinc -Imy_include_path选项,
我把这几个函数编译成libc.a,然后内核其他模块连接这个 ...

gcc 某些版,好像是:

printf('a');    会自使用 putchar('a');

printf("hello\n");      会使用 puts("hello\n")


你自己做实验试一试

faku 发表于 2009-11-26 07:26

版主好厉害,啥都知道

但是,你说的情况应该使用标准库内的printf的情况

而我自己定义的printf原型是
int printf(const char * fmt, ...);
调用的时候是这样的,确实同时使用了字符串和字符
printf("%d%s%c%x", 0, "hello", 'A',0xaa);//主要是为了测试各种格式化输出是否正常

如果程序使用的是我自己定义的printf(我想应该是这样的,因为我阻止了C库的连接),那么就不应该出现使用
putchar和puts的情况啊
页: [1]
查看完整版本: 自定义printf,却提示“putchar未定义”