• 重新造轮子之静态链接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的字符串

  • 相关阅读:
    Linux实时性分析-schedule-调度器
    中断解析
    网络商城-PrestaShop
    和学生的学习互动记录(10嵌)
    QQ记录
    Windows7硬盘安装Fedora16图文教程
    今目标登录时报网络错误E110
    vs环境配置——vs快捷键配置——vs插件配置——vs环境设置
    如何防止app接口被别人调用
    mvc4 找到多个与名为“xx”的控制器匹配的类型
  • 原文地址:https://www.cnblogs.com/beyond-Acm/p/4126171.html
Copyright © 2020-2023  润新知