在最简单的rootfs上运行statically linked或dynamically linked的hello程序

发布于 2022-09-18 05:16:37 字数 3183 浏览 11 评论 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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

单身狗的梦 2022-09-25 05:16:37

有个笔误,"#gcc hello.c -static -o hello1”,这个没有-static这一项。

許願樹丅啲祈禱 2022-09-25 05:16:37

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!!

我纯我任性 2022-09-25 05:16:37

呵呵,看来有误解了,
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这个选项

幸福还没到 2022-09-25 05:16:37

谢谢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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文