重新造轮子之静态链接1(Static linking)
最近学习计算机病毒学的过程中,又讲到了静态链接的问题,联想到了之前保健哥在信息安全的课堂上向我们展示了一个没有main()函数的C程序到底应该如何编写。个人觉得这个小实验对于加深静态链接的过程的理解也十分有帮助,于是今天就花了一点时间把这个小实验自己动手做了一遍,也是有些收获的。写一个不带main()函数的C程序也可以算作重新造了一个小小的轮子吧,233333333333!!!下面进入正题:
实验环境为linux 编辑器采用了Vim 编译器为gcc:
1.首先,我们新建了一个a.c的程序,为了与main()函数以示区别,我们这里特别把函数名字定义为 notmain(), 代码如下:
/* a.c */
int notmain()
{
exit();
}
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,代码如下所示:
/* exit.c */
int exit(int n)
{
__asm__("mov $1, %eax\n\t"
"mov $4, %ebx\n\t"
"int $0x80"
);
}
此段代码中插入了一段汇编指令,这里可以先不用管它,后面会有文章专门介绍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程序。
重新造轮子之静态链接1(Static linking)的更多相关文章
- 重新造轮子之静态链接2(Static linking)
有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld .只不过这次我们不能用到到C语言中的main()函数. 实验环境: linux 编译器: gcc 编辑器:Vim 1. ...
- 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包
前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...
- vc下的静态链接库与动态链接库(一)
一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...
- 动态链接库dll,静态链接库lib, 导入库lib
转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html 目前以lib后缀的库有两种,一种为静态链接库(Static Libar ...
- 动态链接库dll,导入库lib,静态链接库lib
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库” ...
- 静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)
静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib) 程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用 ...
- VC win32 static library静态链接库简单示例
中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...
- C/C++ 静态链接库(.a) 与 动态链接库(.so)
平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...
- 跟我一起造轮子 手写springmvc
原创地址:https://www.cnblogs.com/xrog/p/9820168.html 作为java程序员,项目中使用到的主流框架多多少少和spring有关联,在面试的过程难免会问一些spr ...
随机推荐
- Eclipse的安装与使用
1安装 下载 http://www.eclipse.org 安装 (最好下载解压版的,不用安装) 安装目录中,不要出现空格与中文 例如,解压到:D:\codetool 2项目的创建 双击运行.exe文 ...
- 洛谷 P1690 贪婪的Copy
题目 本题难度较低,操作比较简单,首先对于范围较小的N(<=100),我们可以先跑一遍floyd,求出任意两点之间的最短路.对于很小的p(<=15),我们可以直接考虑全排列,运用到next ...
- C语言的time函数和localtime函数
1.获取当前时间,并获取当前时间(即系统时间)距离1970年1月1日的时间间隔,以秒为单位. 2.获取指定时间距离1970年1月1日的时间间隔,以秒为单位.
- 在Office 365 添加就地保留用户邮箱
基于客户需求,要求将用户批量添加到Office 365中的现有就地保留.如您所了解的,我们可以通过Exchange在线图形用户GUI界面完成,也可以通过PowerShell完成. 要将用户批量添加到O ...
- 转载《五大免费采集器哪个好,火车头,海纳,ET,三人行,狂人采集 》
在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,ET,三人行,狂人. 下面我们对这几款采集工具作一个简单的评比. 1.火车头 基本上人人都知道,那就 ...
- CF Gym 100187M Heaviside Function(二分)
题意:给你一个函数和一些系数,给你一堆询问,求函数值. 根据s的符号,分成两组讨论,函数值与比x小的系数数量有关,二分输出答案. #include<cstdio> #include< ...
- Meaningful Mean
You are given an integer sequence of length N, a= {a1,a2,…,aN}, and an integer K.a has N(N+1)⁄2 non- ...
- HTML_4
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 字符编码:WideCharToMultiByte
WideCharToMultiByte 编辑 目录 1基本介绍及功能 2相关变量 1基本介绍及功能编辑 WideCharToMultiByte 函数功能:该函数映射一个unicode字符串 ...
- 字符串的驻留(String Interning)
http://www.cnblogs.com/artech/archive/2007/03/04/663728.html 关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大 ...