重新造轮子之静态链接1(Static linking)

最近学习计算机病毒学的过程中,又讲到了静态链接的问题,联想到了之前保健哥在信息安全的课堂上向我们展示了一个没有main()函数的C程序到底应该如何编写。个人觉得这个小实验对于加深静态链接的过程的理解也十分有帮助,于是今天就花了一点时间把这个小实验自己动手做了一遍,也是有些收获的。写一个不带main()函数的C程序也可以算作重新造了一个小小的轮子吧,233333333333!!!下面进入正题:

实验环境为linux  编辑器采用了Vim  编译器为gcc:

1.首先,我们新建了一个a.c的程序,为了与main()函数以示区别,我们这里特别把函数名字定义为 notmain(), 代码如下:

1 /* a.c */
2   2 
3   3 int notmain()
4   4 {   
5   5     exit(0);
6   6 }

2.然后用gcc对a.c进行编译操作,注意这里要是用-c指令,即 $ gcc -c a.c 操作。如果直接是用gcc a.c操作则会报错,因为gcc默认情况下回去.C文件中寻找main()函数的入口地址, 而在此处我们并没有main()函数。使用 $gcc -c a.c 命令会先把.c文件编译成不完整的.o文件。如果顺利的话, 我们会得到一个a.o的目标文件。

3.接下来我们再新建一个文件,文件名问exit.c,代码如下所示:

1 /* exit.c */
2   2 
3   3 int exit(int n)
4   4 {   
5   5     __asm__("mov $1, %eax
	"
6   6             "mov $4, %ebx
	"
7   7             "int $0x80"
8   8             );
9   9 }

此段代码中插入了一段汇编指令,这里可以先不用管它,后面会有文章专门介绍C语言中内嵌汇编,这里先理解为用汇编实现了exit()函数的功能,即终止执行并退出。

4.然后在Linux命令行的模式下分别执行以下的命令:

$ gcc -c exit.c //编译exit.c生成的exit.o文件,完成以后程序的结构如图所示:

 5.最后,我们只需要把生成的目标文件(.o文件)用链接器链接起来即可,命令如下:

$ ld -e notmain a.o exit.o -o notmain

这里-e notmain是指定程序的入口是notmain,其实如果这里不使用-e notmain的话,链接也可以通过,只不过会有一个警告,使用之后可以消除警告,完成此步骤以后的文件结构如图所示:

6.对于已经链接生成的可执行文件notmain,只要运行即可观察结果,这里的notmain()函数执行的就是退出操作。

$ ./notmain

结果如图所示,致此就完成了一个最简单的重复造轮子的过程----如何编辑、编译、链接、运行一个没有主函数main()的C程序。

原文地址:https://www.cnblogs.com/beyond-Acm/p/4125701.html