LinuxSir.cn,穿越时空的Linuxsir!

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

一个奇怪的Linux库问题

[复制链接]
发表于 2007-4-6 12:44:46 | 显示全部楼层 |阅读模式
我写了一个名为test.c程序:
main()
{
    cos(12.1);
}
当我用下面命令:
gcc -o test test.c /usr/lib/libm.a
编译生成可执行程序test后,我用ls -l 查看生成的可执行程序test,其大小为11361
当我用下面命令:
gcc -o test test.c /usr/lib/libm.so
编译生成可执行程序test后,我用ls -l 查看生成的可执行程序test,其大小为11438

为什么用动态库生成的可执行程序还要大些, 库文件libm.a与libm.so的区别是什么.
发表于 2007-4-6 13:40:58 | 显示全部楼层
gcc --static .......
回复 支持 反对

使用道具 举报

发表于 2007-4-6 15:20:51 | 显示全部楼层
gcc -o test test.c /usr/lib/libm.a
虽然你指定了使用静态库,但是在linux中,它会先去查找动态库,所以此时你仍然还是使用的动态库.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-6 21:22:45 | 显示全部楼层

不会的

为什么两个可执行文件的大小不一样呢,而且用ldd分别查看两个可执行文件,得到的结果是不一样的.
回复 支持 反对

使用道具 举报

发表于 2007-4-6 22:27:41 | 显示全部楼层
ldd 得到的结果显然会不一样,两者链接的库都不一样(一个有libm.so, 一个没有)

你没有用 --static , 所以只有 cos 被静态链接进目标文件, 其他的库还是动态链接

至于为什么动态链接 libm 比静态还大, 你这个例子很可能是因为 cos 调用被编译器优化掉了, 用 libm.so 链接的话,会在目标文件里面多一项关于 libm,so 得信息(而 libm.a 没有,因为被优化掉了, 在目标文件中就没有了)  另外,即使没有被优化掉, 只有一个简单的调用,很难说哪个生成的文件更大(因为两者均有开销,虽然开销用的地方不一样)
回复 支持 反对

使用道具 举报

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

本版积分规则

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