重新造轮子之静态链接2(Static linking)
有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld 。只不过这次我们不能用到到C语言中的main()函数。
实验环境: linux 编译器: gcc 编辑器:Vim
1. 新建一个b.c的程序,并编译生成目标文件:
int notmain()
{
printf("hello world\n");
exit();
}
$ gcc -c b.c -fno-builtin
2. 新建一个strlen.c的程序,用于统计字符串的长度,主要是为后面的printf()函数服务
int strlen(char *s)
{
int len = ;
while(*s++)
{
len++;
}
return len;
}
$ gcc -c strlen.c 生成strlen.o的目标文件
3. 新建printf.s的汇编源文件, 利用汇编语言重新编写一个最简单的printf()函数,实习打印字符串的功能:
.global printf printf:
pushl %ebp
movl %esp, %ebp
pushl %ebx
movl $, %eax
movl $, %ebx
movl (%ebp), %ecx
pushl %ecx
call strlen
mov %eax, %edx
mov $, %eax
int $0x80
leave
ret
$ gcc -c printf.s 生成相应的目标文件printf.o
4. 我们还需要一个exit.c文件,并编译生成目标文件。(此处省略,与上一篇中的exit.c相同)
5. 此时所有准备工作都已经完成,我们的文件结构应该如图所示:

6. 把所有的目标文件用链接器链接起来生成我们所需要的可执行文件 :
$ ld *.o -e notmain -o notmain
7. 运行我们的notmain程序: $ ./notmain
可以看到在屏幕上打印了helloworld的字符串

重新造轮子之静态链接2(Static linking)的更多相关文章
- 重新造轮子之静态链接1(Static linking)
最近学习计算机病毒学的过程中,又讲到了静态链接的问题,联想到了之前保健哥在信息安全的课堂上向我们展示了一个没有main()函数的C程序到底应该如何编写.个人觉得这个小实验对于加深静态链接的过程的理解也 ...
- 目前以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 ...
随机推荐
- Fedora12下yum安装低版本gcc
1.Fedora12下gcc位置及其版本如下: 2.根据需要,要安装低版本的gcc,直接用"yum install gcc"安装时默认是安装最新版本的gcc,如下: 3.可先通过& ...
- sqlserver跟据当天年月日日期查询数据库当天数据
select * from Client where CONVERT(varchar(100), Cli_Datetime, 23) ='2017-11-06' 在查询之前要对表中datetime类 ...
- dubbo rest返回值异常Incompatible types: declared root type
2018-08-28 17:26:02,208 [http-bio-9090-exec-1][][][][][] ERROR com.wjs.member.plugin.intercepter.Ser ...
- JS计算24节气的方法
function getjq(yyyy,mm,dd){ mm = mm-1; var sTermInfo = new Array(0,21208,42467,63836,85337,107014,12 ...
- MapReduce的编程思想(1)
MapReduce的编程思想(1) MapReduce的过程(2) 1. MapReduce采用分而治之的思想,将数据处理拆分为主要的Map(映射)与Reduce(化简)两步,MapReduce操作数 ...
- 编写SQL语句操作数据库(慕课SQLite笔记)
安卓常用数据存储方式之一SQLite学习及操作笔记 0.视频地址:http://www.imooc.com/video/3382 1.每个程序都有自己的数据库 默认情况下是各自互不干扰 1)创建一个数 ...
- 使用Python+selenium过程中所需安装的库和软件
一.下载地址: 1.setuptools:https://pypi.python.org/pypi/setuptools#downloads 中file对应的后缀为zip的软件 pip:https:/ ...
- 对比java和python对比
对比java和python 对比java和python 2011年04月18日 1.难易度而言.python远远简单于java. 2.开发速度.Python远优于java 3.运行速度.java远优于 ...
- 51nod 1572 宝岛地图
题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 勇敢的水手们到达了一个小岛,在这个小岛上,曾经有海盗在这里埋下了一些宝藏.然而,我 ...
- 将SQL2008升级为SQL2008 r2
我的SQL2008版本信息 Microsoft SQL Server Management Studio 10.0.1600.22 ((SQL_PreRelease).080709-1414 ...