最近学习计算机病毒学的过程中,又讲到了静态链接的问题,联想到了之前保健哥在信息安全的课堂上向我们展示了一个没有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)的更多相关文章

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

    有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld .只不过这次我们不能用到到C语言中的main()函数. 实验环境: linux  编译器: gcc  编辑器:Vim 1. ...

  2. 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包

    前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...

  3. vc下的静态链接库与动态链接库(一)

    一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...

  4. 动态链接库dll,静态链接库lib, 导入库lib

    转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html 目前以lib后缀的库有两种,一种为静态链接库(Static Libar ...

  5. 动态链接库dll,导入库lib,静态链接库lib

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库” ...

  6. 静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)

    静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib)     程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用 ...

  7. VC win32 static library静态链接库简单示例

    中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...

  8. C/C++ 静态链接库(.a) 与 动态链接库(.so)

    平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...

  9. 跟我一起造轮子 手写springmvc

    原创地址:https://www.cnblogs.com/xrog/p/9820168.html 作为java程序员,项目中使用到的主流框架多多少少和spring有关联,在面试的过程难免会问一些spr ...

随机推荐

  1. 开启 PHP 错误提示配置步骤详解

    PHP编码出错不提示,这对于开发来说,是很不方便的.下面讲解如何开启错误提示步骤: 1. 打开php.ini文件. 以我的ubuntu为例,这个文件在: /etc/php5/apache2 目录下. ...

  2. 路径方案数(mod)

    路径方案数(mod) [题目描述] 给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点, cyb 可以从 a 走到 b,当且仅当a到2的最短路,比b 到2的最短路长. 求 cy ...

  3. webpack分开打包和合并打包的瘦身

    webpack.config.js 记录一下优化webpack的几个点: 1.     devtool: false,   //产品阶段不应该有devtool entry: { bundle : pa ...

  4. 基于WebSocket和SpringBoot的群聊天室

    引入 普通请求-响应方式:例如Servlet中HttpServletRequest和HttpServletResponse相互配合先接受请求.解析数据,再发出响应,处理完成后连接便断开了,没有数据的实 ...

  5. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  6. MySQL如何找出未提交事务信息

    前阵子,我写了一篇博客"ORACLE中能否找到未提交事务的SQL语句", 那么在MySQL数据库中,我们能否找出未提交事务执行的SQL语句或未提交事务的相关信息呢? 实验验证了一下 ...

  7. Python之邮件发送

    Python的smtplib提供了一种很方便的途径用来发送电子邮件,它有SMTP协议进行简单的封装,可以使用SMTP对象的sendmail方法发送邮件,通过help()查看SMTP所提供的方法如下: ...

  8. hiho一下 第四十五周 博弈游戏·Nim游戏·二(转成NIm)

    Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿 ...

  9. 【Python图像特征的音乐序列生成】关于mingus一个bug的修复,兼改进情感模型

    mingus在输出midi文件的时候,使用这样的函数: from mingus.containers import NoteContainer from mingus.midi import midi ...

  10. SAP ERP和C4C Account和Contact的双向同步

    Account和Contact是C4C里唯一支持可以和ERP进行双向同步的主数据类别. C4C里创建一个Account:Mouser Electronics 在C4C里保存Account,自动同步到E ...