免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2911 | 回复: 4

在最简单的rootfs上运行statically linked或dynamically linked的hello程序 [复制链接]

论坛徽章:
0
发表于 2009-11-15 02:02 |显示全部楼层
在简单的rootfs上运行hello程序来验证statically linked或dynamically linked程序的区别
rootfs: /dev/sda7
kernel: vmlinuz-2.6.29      
linux system:Ubuntu 9.10
步骤如下:              (......表示省略一些内容)
1.新建一个rootfs分区,并创建bin,dev,boot目录,并将自己编译的内核拷贝到rootfs的boot目录下
#cd /lfs                  (/lfs表示新建的rootfs挂载到根分区的目录)
#mkdir bin dev  boot
#cp /boot/vmlinuz-2.6.29 /lfs/boot
#cd boot
2.进入dev目录,创建console设备节点
#cd ../dev
#mknod console c 5 1
3.进入bin目录,编写一个hello程序   
#cd ../bin     
#vi hello.c              
####################################
#代码如下:
#include <stdio.h>
int main()
{
     printf("Hello MaxWit!\n");
     return 0;
}
####################################
3.statically link hello程序,dynamically link hello1程序,并作比较
#gcc hello.c -static -o hello                (statically linked  hello)
#gcc hello.c -static -o hello1               (dynamically linked   hello1)
#file hello                 (提示:ELF 64-bit...... statically linked .....)
#file hello1               (提示:ELF 64-bit...... dynamically linked (uses share libs).....)
#ls -lh                       (从hello和hello1可执行文件大小区别,dynamically linked程序大小明显比statically linked 程序的大)

4.重启,编辑grub 并启动
#grub>root (hd0,7)
#grub>linux /boot/vmlinuz-2.6.29 root=/dev/sda7 init=/bin/hello
#grub>boot
(加载内核后启动init指定的程序hello,屏幕显示:Hello MaxWit!)

5.重启,编辑grub 并启动
#grub>root (hd0,7)
#grub>linux /boot/vmlinuz-2.6.29 root=/dev/sda7 init=/bin/hello1
#grub>boot
(加载内核后启动init指定的程序hello,屏幕显示:Fail to execute /bin/hello1!)

6. 重启,进入正常系统,进入/lfs/bin目录
#cd /lfs/bin
#ldd ./hello1                        (显示执行hello1程序所调用的共享库)
linux->vdso.so.1 =>(0x000007ffffff)   
libc.so.6 => /lib/libc.so.6 ......
/lib64/ld-linux-x86-64.so.2 ......
7.创建相应目录,将系统分区的这些库文件拷贝到rootfs相应目录下
#mkdir lib lib64
#cp /lib/libc.so.6 /lfs/lib
#cp /lib64/ld-linux-x86-64.so.2 /lfs/lib64

8.重启,编辑grub 并启动
#grub>root (hd0,7)
#grub>linux /boot/vmlinuz-2.6.29 root=/dev/sda7 init=/bin/hello1
#grub>boot
(加载内核后启动init指定的程序hello,屏幕显示:Hello MaxWit!)

通过上述步骤,我的理解是dynamically linked程序会将用到的共享库一起编译链接成可执行文件,所以必须要有共享库的支持,而statically linked程序则没有,并不需要共享库。如果验证步骤或理解有误,请指正,不胜感激!

[ 本帖最后由 forkpower 于 2009-11-15 15:48 编辑 ]

论坛徽章:
0
发表于 2009-11-15 09:19 |显示全部楼层
有个笔误,"#gcc hello.c -static -o hello1”,这个没有-static这一项。

论坛徽章:
0
发表于 2009-11-15 11:28 |显示全部楼层
2 floor is wrong! I make a test  that prove 1 floor is right.


   root@nnoo:/work/source# gcc  1.c -static  -o 1
   root@nnoo:/work/source# ls
   1  1.c  pkg  VirtualBox_disk
   root@nnoo:/work/source# ./1
   hello world!!

论坛徽章:
0
发表于 2009-11-15 13:53 |显示全部楼层
呵呵,看来有误解了,
HELLO_MAX说到“有个笔误,"#gcc hello.c -static -o hello1”,这个没有-static这一项。
是说LZ的
3.statically link hello程序,dynamically link hello1程序,并作比较
#gcc hello.c -static -o hello
#gcc hello.c -static -o hello1

#file hello                 (提示:ELF 64-bit...... statically linked .....)

#file hello1               (提示:ELF 64-bit...... dynamically linked (uses share libs).....)
显然hello和hello1都是静态编译的,照LZ的意思应该是hello1是动态链接的才是

#gcc hello.c -o hello1  (不加-static)

而不是

gcc 没有-static这个选项

论坛徽章:
0
发表于 2009-11-15 15:37 |显示全部楼层

回复 #4 fleyahjj 的帖子

谢谢fleyahjj的指正!
#gcc hello.c -static -o hello
#gcc hello.c -static -o hello1
应该为
#gcc hello.c -static -o hello
#gcc hello.c -o hello1  (不加static)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP