zoukankan      html  css  js  c++  java
  • Hello World 十大秘密

    #include <stdio.h>
    
    int main(int argc, char* argv[], char* env[])
    {
        printf("Hello World
    ");
        
        return 0;
    }

    ①main函数原型: int main(int argc, char* argv[], char* env)

    ②mian函数返回值:

    main函数的返回值是返回给父进程的,父进程调用下面函数来获取进程的退出码

    pid_t wait(int* status);

    pid_t waitpid(pid_t pid, int* status, int options);

    main函数返回值存储于status

    ③被隐藏的细节:

    用strace命令(显示所有由用户空间程序发出的系统调用)跟踪Helloworld的执行过程(strace ./HelloWorld),发现其有数十次的系统调用。

    真正的打印字符串调用

    write(1, "Hello World ", 12Hello World)           = 12

    把字符串写入文件描述符为1的文件里

    在Linux系统中,

    (1) 标准输入的文件描述符为0

    (2) 标准输出的文件描述符为1

    (3) 标准错误输出的文件描述符为2

    ④printf不见了

    查看main函数汇编代码, 发现printf函数不见了(Gcc做了优化)

    int main()
    {
     80483b4:    55                       push   %ebp
     80483b5:    89 e5                    mov    %esp,%ebp
     80483b7:    83 e4 f0                 and    $0xfffffff0,%esp
     80483ba:    83 ec 10                 sub    $0x10,%esp
        printf("Hello World
    ");
     80483bd:    c7 04 24 94 84 04 08     movl   $0x8048494,(%esp)
     80483c4:    e8 27 ff ff ff           call   80482f0 <puts@plt>
    
        return 0;
     80483c9:    b8 00 00 00 00           mov    $0x0,%eax
    }

    ⑤链接了哪些共享库

    用ldd命令查看HelloWorld链接的共享库

    linux-gate.so.1 =>  (0x005aa000)
     libc.so.6 => /lib/libc.so.6 (0x00278000)
     /lib/ld-linux.so.2 (0x00252000)

    libc.so.6是glibc,他实现了像printf之类函数

    /lib/ld-linux.so.2是ELF可执行文件解析器

    /lib/ld-linux.so.2主要功能是加速系统调用(syscall)

    ⑥调用共享库中的函数

    ⑦函数解析过程

    ⑧偷梁换柱

    ⑨内存模型

    ⑩main函数不是第一个执行的函数

  • 相关阅读:
    块级元素与行级元素(内联元素)
    css中属性值继承小解
    form表单
    html,xhtml和xml
    html中的标签分类
    如何把HTML标记分类
    实现对HashMap的value排序
    装饰者模式
    实现一个简单的二叉树容器,并且实现中序、先序、后续遍历
    Java中java.util.concurrent包下的4中线程池代码示例
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9445829.html
Copyright © 2011-2022 走看看