• 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函数不是第一个执行的函数

  • 相关阅读:
    Silverlight 皮肤的使用(二)
    EF Core – Temporal Table 时态表
    SQL Server – Schema
    SQL Server – Temporal Table 时态表
    EF Core – QueryFilter & Interception
    SQL Server – Work with JSON
    EF Core – Soft Delete 实现
    C# – 10.0
    ASP.NET Core – 读写 Request / Response
    ASP.NET Core – Middleware
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9445829.html
Copyright © 2020-2023  润新知