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