Chinaunix首页 | 论坛 | 博客
  • 博客访问: 902571
  • 博文数量: 113
  • 博客积分: 3160
  • 博客等级: 少校
  • 技术积分: 1801
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-19 10:09
文章分类

全部博文(113)

分类: LINUX

2012-05-30 16:47:36

9.5 一个程序解析实例    

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

 

 

 

 

// 这是mystrcpymystrlen函数的定义,作为静态库函数链接到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

 

 

 

 

: 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

 

 

 

: 链接执行输出结果      

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的一些安装文件的命令:aptdpkg

6:  emacs命令大全

7:  王垠的主页

8:  emacs24

9:  linux环境下C编程指南(第二版)

10: gcc中文手册

11: GCC技术参考大全 胡恩华译

12: nasm中文手册

13 《跟我一起写makefile》 陈皓

14: 《链接器与加载器》 John R . Levine著  李勇译

阅读(2710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~