在最简单的rootfs上运行statically linked或dynamically linked的hello程序
在简单的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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
有个笔误,"#gcc hello.c -static -o hello1”,这个没有-static这一项。
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!!
呵呵,看来有误解了,
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这个选项
谢谢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)