• 重新造轮子之静态链接1(Static linking)


    最近学习计算机病毒学的过程中,又讲到了静态链接的问题,联想到了之前保健哥在信息安全的课堂上向我们展示了一个没有main()函数的C程序到底应该如何编写。个人觉得这个小实验对于加深静态链接的过程的理解也十分有帮助,于是今天就花了一点时间把这个小实验自己动手做了一遍,也是有些收获的。写一个不带main()函数的C程序也可以算作重新造了一个小小的轮子吧,233333333333!!!下面进入正题:

    实验环境为linux  编辑器采用了Vim  编译器为gcc:

    1.首先,我们新建了一个a.c的程序,为了与main()函数以示区别,我们这里特别把函数名字定义为 notmain(), 代码如下:

    1 /* a.c */
    2   2 
    3   3 int notmain()
    4   4 {   
    5   5     exit(0);
    6   6 }

    2.然后用gcc对a.c进行编译操作,注意这里要是用-c指令,即 $ gcc -c a.c 操作。如果直接是用gcc a.c操作则会报错,因为gcc默认情况下回去.C文件中寻找main()函数的入口地址, 而在此处我们并没有main()函数。使用 $gcc -c a.c 命令会先把.c文件编译成不完整的.o文件。如果顺利的话, 我们会得到一个a.o的目标文件。

    3.接下来我们再新建一个文件,文件名问exit.c,代码如下所示:

    1 /* exit.c */
    2   2 
    3   3 int exit(int n)
    4   4 {   
    5   5     __asm__("mov $1, %eax
    	"
    6   6             "mov $4, %ebx
    	"
    7   7             "int $0x80"
    8   8             );
    9   9 }

    此段代码中插入了一段汇编指令,这里可以先不用管它,后面会有文章专门介绍C语言中内嵌汇编,这里先理解为用汇编实现了exit()函数的功能,即终止执行并退出。

    4.然后在Linux命令行的模式下分别执行以下的命令:

    $ gcc -c exit.c //编译exit.c生成的exit.o文件,完成以后程序的结构如图所示:

     5.最后,我们只需要把生成的目标文件(.o文件)用链接器链接起来即可,命令如下:

    $ ld -e notmain a.o exit.o -o notmain

    这里-e notmain是指定程序的入口是notmain,其实如果这里不使用-e notmain的话,链接也可以通过,只不过会有一个警告,使用之后可以消除警告,完成此步骤以后的文件结构如图所示:

    6.对于已经链接生成的可执行文件notmain,只要运行即可观察结果,这里的notmain()函数执行的就是退出操作。

    $ ./notmain

    结果如图所示,致此就完成了一个最简单的重复造轮子的过程----如何编辑、编译、链接、运行一个没有主函数main()的C程序。

  • 相关阅读:
    《Java技术》第七次作业计科1501赵健宇
    《Java技术》第六次作业计科1501赵健宇
    《Java技术》第五次作业计科1501赵健宇
    《Java技术》第四次作业计科1501赵健宇
    《Java技术》第三次作业计科1501赵健宇
    整站灰度CSS 代码
    HTML中input输入框禁止复制粘贴剪切自动完成
    无法嵌入互操作类型“ApplicationClass”。请改用适用的接口
    添加右键VSCode打开
    async & await 异步编程小示例,一看就懂
  • 原文地址:https://www.cnblogs.com/beyond-Acm/p/4125701.html
Copyright © 2020-2023  润新知