重新造轮子之静态链接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 ...
随机推荐
- C#高级语法
委托 委托就是指针函数,委托的定义与类的属性定义类似都必须在类的方法体进行. 委托的定义: class Program { //定义委托:委托不能在方法体内定义. public delegate st ...
- 关于验证码在IE中不刷新的快速解决方法
今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...
- 移动端rem单位和px单位换算
rem单位是根据html元素的单位在页面根据不同的手机屏幕分辨率动态整体的按比例缩小或放大字体. 假如html{font-size: 14px;},那么1rem=14px; 一个div宽度48px,那 ...
- mui页面间传接值例子
传值页面index.html <!DOCTYPE html><html><head> <meta charset="utf-8"> ...
- GitHub 开启 Two-factor authentication,如何在命令行下更新和上传代码
最近在使用GitHub管理代码,在git命令行管理代码时候遇到一些问题. 如果开起了二次验证(Two-factor authentication两个要素认证),命令行会一直提示输入用户名和密码.查找了 ...
- Python+selenium之获取请求信息
basicConfig()所捕获的log信息.不过其开启的debug模式只能捕获到客户端像服务器发送的post()请求,而无法获取服务器所返回的应答信息. from random import ran ...
- ssh免密登录配置方法
方法一 1.#ssh-keygen -t rsa 在客户端生成密钥对 把公钥拷贝给要登录的目标主机, 目标主机上将这个公钥加入到授权列表 #cat id_rsa.pub >> author ...
- javaSe-反射2
//创建实体类 package com.java.chap07.sec03; public class Student { private String name; private Integer a ...
- 2017.10.2 QBXT 模拟赛
题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...
- GentleNet使用之详细图解[语法使用增强版]
目录 第一章 开发环境 第二章 简介 第三章 Gentle.Net-1.5.0 下载文件包介绍 第四章 使用步骤 第五章 源码下载 第一章.开发环境: Vs 2010 + Sql 2005 + Gen ...