zoukankan      html  css  js  c++  java
  • 重新造轮子之静态链接2(Static linking)

    有了上一篇的基础, 这次写一个我们已经滚瓜烂熟的C程序 helloworld 。只不过这次我们不能用到到C语言中的main()函数。

    实验环境: linux  编译器: gcc  编辑器:Vim

    1. 新建一个b.c的程序,并编译生成目标文件:

    1 int notmain()
    2 {
    3     printf("hello world
    ");
    4     exit(0);
    5 }

    $ gcc -c b.c -fno-builtin 

    2. 新建一个strlen.c的程序,用于统计字符串的长度,主要是为后面的printf()函数服务

    1 int strlen(char *s) 
    2 {
    3     int len = 0;
    4     while(*s++)
    5     {   
    6         len++;
    7     }   
    8     return len;
    9 }

    $ gcc -c strlen.c 生成strlen.o的目标文件

    3. 新建printf.s的汇编源文件, 利用汇编语言重新编写一个最简单的printf()函数,实习打印字符串的功能:

     1 .global printf
     2 
     3 printf:
     4         pushl %ebp
     5         movl %esp, %ebp
     6         pushl %ebx
     7         movl $4, %eax
     8         movl $1, %ebx
     9         movl 8(%ebp), %ecx
    10         pushl %ecx
    11         call strlen
    12         mov %eax, %edx
    13         mov $4, %eax
    14         int $0x80
    15         leave
    16         ret 

     $ gcc -c printf.s 生成相应的目标文件printf.o 

    4. 我们还需要一个exit.c文件,并编译生成目标文件。(此处省略,与上一篇中的exit.c相同)

    5. 此时所有准备工作都已经完成,我们的文件结构应该如图所示:

    6. 把所有的目标文件用链接器链接起来生成我们所需要的可执行文件 :

    $ ld *.o -e notmain -o notmain

    7. 运行我们的notmain程序: $ ./notmain

    可以看到在屏幕上打印了helloworld的字符串

  • 相关阅读:
    微信端video去除最顶层播放
    MVC错误页面相关说明
    sublime使用
    linux或Mac下手动回滚代码
    用Python操作git命令
    利用pyinstaller打包加密Python项目
    进程、线程和协程的结合使用
    模块导入失败问题
    递归调用解压zip包或rar包
    随机验证码&发红包
  • 原文地址:https://www.cnblogs.com/beyond-Acm/p/4126171.html
Copyright © 2011-2022 走看看