- 论坛徽章:
- 0
|
在简单的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 编辑 ] |
|