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

原文地址:https://www.cnblogs.com/wulei0630/p/9445829.html