分类: LINUX
2012-05-30 16:47:36
1 . 源代码
/*****************************************************/
/* 这是主函数,整个程序的入口,它通过链接静态库libmystring.a */
/* 以及libtest.a和目标文件myprintf实现整个函数 */
/*****************************************************/
#define MAX 15
char a[] = "Hello, World !\n";
int main(void)
{
char b[MAX];
mystrcpy(b , a);
myprintf(b , mystrlen(b));
test();
return 0;
}
;; void myprint(char* , const char*);函数原型
;; 它作为目标文件链接到my.c中
global myprintf ;; 导出便于ld链接器识别
myprintf:
mov edx, [esp + 8] ;; 字符串的长度
mov ecx, [esp + 4] ;; 字符串首地址
mov ebx, 1
mov eax, 4
int 0x80 ;; linux系统调用write
ret
// 这是mystrcpy和mystrlen函数的定义,作为静态库函数链接到my.o中
char* mystrcpy(char* strdes , const char* strsrc)
{
char* temp = strdes;
while('\0' != *strsrc)
{
*temp = *strsrc;
temp ++;
strsrc ++;
}
*temp = '\0';
return strdes;
}
int mystrlen(char* strsrc)
{
int len = 0;
while('\0' != *strsrc)
{
strsrc ++;
len ++;
}
return len;
}
;; 函数void test(void);的原型,作为静态库链接到my.o中
[section .data]
StrTest db "The Test Is Successed !", 0ah
StrLen equ $ - StrTest
[section .text]
global test
test:
mov edx, StrLen
mov ecx, StrTest
mov ebx, 1
mov eax, 4
int 0x80 ;;linux_write
mov ebx, 0
mov eax, 1
int 0x80 ;;linux_exit
2 : makefile文件的配置
###################################################
##
## makefile for program my
##
##################################################
# 编译器及命令选项
CC = cc
CFLAGS = -c
AS = nasm
ASFLAGS = -f elf -g -F stabs
AR = ar
ARFLAGS = -r
TARGET = my
# 所有的伪目标
.PHONY : everything clean all finalclean
# make会把第一个目标作为整个文件的最终生成目标,因此这是makefile开始的地方
everything : $(TARGET)
# 下面三个是伪目标,主要作为make的接口处理其它工作,比如清理文件
all : clean everything
clean :
rm -f my.o myprintf.o mystring.o
finalclean :
rm -f my.o myprintf.o mystring.o test.o
rm -f libmystring.a libtest.a my
# 下面是依赖关系,整个makefile的核心。
my : my.o myprintf.o libmystring.a libtest.a
$(CC) -o $@ $^
my.o : my.c
$(CC) $(CFLAGS) -o $@ $^
myprintf.o : myprintf.asm
$(AS) $(ASFLAGS) -o $@ $^
libmystring.a : mystring.c
$(CC) $(CFLAGS) -o mystring.o $^
$(AR) $(ARFLAGS) -o $@ mystring.o
libtest.a : test.asm
$(AS) $(ASFLAGS) -o test.o $^
$(AR) $(ARFLAGS) -o $@ test.o
3 : 链接执行输出结果
lishuo@lishuo-Rev-1-0:~/test/test$ ls
makefile my.c myprintf.asm mystring.c test.asm 结果.txt
makefile~ my.c~ myprintf.asm~ mystring.c~ test.asm~
lishuo@lishuo-Rev-1-0:~/test/test$ make
cc -c -o my.o my.c
nasm -f elf -g -F stabs -o myprintf.o myprintf.asm
cc -c -o mystring.o mystring.c
ar -r -o libmystring.a mystring.o
ar: creating libmystring.a
nasm -f elf -g -F stabs -o test.o test.asm
ar -r -o libtest.a test.o
ar: creating libtest.a
cc -o my my.o myprintf.o libmystring.a libtest.a
lishuo@lishuo-Rev-1-0:~/test/test$ make
make: 没有什么可以做的为 `everything'。
lishuo@lishuo-Rev-1-0:~/test/test$ ./my
Hello, World !
The Test Is Successed !
4 : 可执行文件反汇编
my: file format elf32-i386
08048404
8048404: 55 push %ebp
8048405: 89 e5 mov %esp,%ebp
8048407: 83 e4 f0 and $0xfffffff0,%esp
804840a: 83 ec 30 sub $0x30,%esp
804840d: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048413: 89 44 24 2c mov %eax,0x2c(%esp)
8048417: 31 c0 xor %eax,%eax
8048419: c7 44 24 04 14 a0 04 movl $0x804a014,0x4(%esp)
8048420: 08
8048421: 8d 44 24 1d lea 0x1d(%esp),%eax
8048425: 89 04 24 mov %eax,(%esp)
8048428: e8 5b 00 00 00 call 8048488
804842d: 8d 44 24 1d lea 0x1d(%esp),%eax
8048431: 89 04 24 mov %eax,(%esp)
8048434: e8 85 00 00 00 call 80484be
8048439: 89 44 24 04 mov %eax,0x4(%esp)
804843d: 8d 44 24 1d lea 0x1d(%esp),%eax
8048441: 89 04 24 mov %eax,(%esp)
8048444: e8 27 00 00 00 call 8048470
8048449: e8 a2 00 00 00 call 80484f0
804844e: b8 00 00 00 00 mov $0x0,%eax
8048453: 8b 54 24 2c mov 0x2c(%esp),%edx
8048457: 65 33 15 14 00 00 00 xor %gs:0x14,%edx
804845e: 74 05 je 8048465
8048460: e8 bb fe ff ff call 8048320 <__stack_chk_fail@plt>
8048465: c9 leave
8048466: c3 ret
8048467: 90 nop
8048468: 90 nop
8048469: 90 nop
804846a: 90 nop
804846b: 90 nop
804846c: 90 nop
804846d: 90 nop
804846e: 90 nop
804846f: 90 nop
08048470
8048470: 8b 54 24 08 mov 0x8(%esp),%edx
8048474: 8b 4c 24 04 mov 0x4(%esp),%ecx
8048478: bb 01 00 00 00 mov $0x1,%ebx
804847d: b8 04 00 00 00 mov $0x4,%eax
8048482: cd 80 int $0x80
8048484: c3 ret
8048485: 90 nop
8048486: 90 nop
8048487: 90 nop
08048488
8048488: 55 push %ebp
8048489: 89 e5 mov %esp,%ebp
804848b: 83 ec 10 sub $0x10,%esp
804848e: 8b 45 08 mov 0x8(%ebp),%eax
8048491: 89 45 fc mov %eax,-0x4(%ebp)
8048494: eb 13 jmp 80484a9
8048496: 8b 45 0c mov 0xc(%ebp),%eax
8048499: 0f b6 10 movzbl (%eax),%edx
804849c: 8b 45 fc mov -0x4(%ebp),%eax
804849f: 88 10 mov %dl,(%eax)
80484a1: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80484a5: 83 45 0c 01 addl $0x1,0xc(%ebp)
80484a9: 8b 45 0c mov 0xc(%ebp),%eax
80484ac: 0f b6 00 movzbl (%eax),%eax
80484af: 84 c0 test %al,%al
80484b1: 75 e3 jne 8048496
80484b3: 8b 45 fc mov -0x4(%ebp),%eax
80484b6: c6 00 00 movb $0x0,(%eax)
80484b9: 8b 45 08 mov 0x8(%ebp),%eax
80484bc: c9 leave
80484bd: c3 ret
080484be
80484be: 55 push %ebp
80484bf: 89 e5 mov %esp,%ebp
80484c1: 83 ec 10 sub $0x10,%esp
80484c4: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
80484cb: eb 08 jmp 80484d5
80484cd: 83 45 08 01 addl $0x1,0x8(%ebp)
80484d1: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80484d5: 8b 45 08 mov 0x8(%ebp),%eax
80484d8: 0f b6 00 movzbl (%eax),%eax
80484db: 84 c0 test %al,%al
80484dd: 75 ee jne 80484cd
80484df: 8b 45 fc mov -0x4(%ebp),%eax
80484e2: c9 leave
80484e3: c3 ret
80484e4: 90 nop
80484e5: 90 nop
80484e6: 90 nop
80484e7: 90 nop
80484e8: 90 nop
80484e9: 90 nop
80484ea: 90 nop
80484eb: 90 nop
80484ec: 90 nop
80484ed: 90 nop
80484ee: 90 nop
80484ef: 90 nop
080484f0
80484f0: ba 18 00 00 00 mov $0x18,%edx
80484f5: b9 24 a0 04 08 mov $0x804a024,%ecx
80484fa: bb 01 00 00 00 mov $0x1,%ebx
80484ff: b8 04 00 00 00 mov $0x4,%eax
8048504: cd 80 int $0x80
8048506: 90 nop
8048507: 90 nop
8048508: 90 nop
8048509: 90 nop
804850a: 90 nop
804850b: 90 nop
804850c: 90 nop
804850d: 90 nop
804850e: 90 nop
804850f: 90 nop
参考文档:
1: 《linux命令,编辑器与shell编程》 Mark G. Sobell著
2: 《linux命令,编辑器与shell编程实例大全》 杨明华 谭厉 于重重 著
3: 《linux命令详解词典》 施威铭研究室 著
4: Ubuntu下解压文件常用的方法
5: linux的一些安装文件的命令:apt和dpkg
6: emacs命令大全
7: 王垠的主页
8: emacs24
9: linux环境下C编程指南(第二版)
10: gcc中文手册
11: GCC技术参考大全 胡恩华译
12: nasm中文手册
13: 《跟我一起写makefile》 陈皓
14: 《链接器与加载器》 John R . Levine著 李勇译