免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3345 | 回复: 3
打印 上一主题 下一主题

自定义printf,却提示“putchar未定义” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-25 22:13 |只看该作者 |倒序浏览
自己实现了一个简单的内核,自定义了
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时,就连接了这一个函数代码而去掉了其他函数代码?

论坛徽章:
0
2 [报告]
发表于 2009-11-25 22:32 |只看该作者
以上是我在虚拟机(公司的电脑)中的结果
同样的操作系统,同样版本的gcc,同样的代码
在我的电脑上(非虚拟机)编译通过

论坛徽章:
0
3 [报告]
发表于 2009-11-25 22:48 |只看该作者
原帖由 faku 于 2009-11-25 22:13 发表
自己实现了一个简单的内核,自定义了
vsprintf
sprintf
printf
这几个标准库的函数,
连接时,使用了 -nostdlib -nostdinc -Imy_include_path选项,
我把这几个函数编译成libc.a,然后内核其他模块连接这个 ...


gcc 某些版,好像是:

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

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


你自己做实验试一试

论坛徽章:
0
4 [报告]
发表于 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的情况啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP