#include <stdio.h>

int main(int argc, char* argv[], char* env[])
{
printf("Hello World\n"); return ;
}

①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\n", 12Hello World)           = 12

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

在Linux系统中,

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

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

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

④printf不见了

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

int main()
{
80483b4: push %ebp
80483b5: e5 mov %esp,%ebp
80483b7: e4 f0 and $0xfffffff0,%esp
80483ba: ec sub $0x10,%esp
printf("Hello World\n");
80483bd: c7 movl $0x8048494,(%esp)
80483c4: e8 ff ff ff call 80482f0 <puts@plt> return ;
80483c9: b8 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函数不是第一个执行的函数

Hello World 十大秘密的更多相关文章

  1. TCP/IP中你不得不知的十大秘密

    这段时间 有一点心很浮躁,不过希望自己马上要矫正过来.好好学习编程!这段时间我想好好地研究一下TCP/IP协议和网络传输这块!加油 一.TCP/IP模型 TCP/IP协议模型(Transmission ...

  2. Google十大惊人产品

    国外资讯网站BusinessInsider刊文细数了谷歌惊世骇俗的十大产品,范围从无人驾驶汽车到太空电梯再到高空风力发电,每一项都令人无限神往,充满未来感. 以下是谷歌十大惊人产品: 众所周知,谷歌并 ...

  3. 网络营销行业十大看了就想吐的“滥词”

    网络营销行业在国内的互联网界已"猖獗"数年之久,它是一个让企业爱让用户恨的行业.有互联网的地方,就有网络营销的机会,有了机会就有了相关产业的存在,只不过是业大业小的问题.但是随着互 ...

  4. 新版.Net开发必备十大工具(转)

    Snippet Compiler Snippet Compiler是一个基于 Windows 的小型应用程序,你可以通过它来编写.编译和运行代码.如果你具有较小的代码段,并且你不想创建完整的 Visu ...

  5. Spring常犯的十大错误,你踩过吗?

    1.错误一:太过关注底层 我们正在解决这个常见错误,是因为 "非我所创" 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的 ...

  6. 【十大经典数据挖掘算法】PageRank

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...

  7. 【十大经典数据挖掘算法】EM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...

  8. 【十大经典数据挖掘算法】AdaBoost

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...

  9. 【十大经典数据挖掘算法】SVM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...

随机推荐

  1. oracle数据库输入conn / as sysdba 出现ORA-01031: insufficient privileges + 忘记sys密码如何改密码

    今天忘记了oracle数据库sys用户的密码,想着直接改密码输入conn / as sysdba 出现了ORA-01031: insufficient privileges(权限不足)的错误,到处搜教 ...

  2. R: 常用操作:

    ################################################### #清除所有变量: rm(list=ls()) #查看变量类型 getwd() setwd() i ...

  3. c++ 类中模版成员函数

    C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 templa ...

  4. bzoj4619 4619: [Wf2016]Swap Space

    传送门 分析 首先不难想到我们要先处理容量变大的再处理容量变小的 对于第一种情况我们自然要选择x小的先格式化,因为这个样暂时存储所需空间较小,可以使得情况更优 而第二种情况y先考虑,因为这样对总空间的 ...

  5. Luogu 4363 [九省联考2018]一双木棋chess

    发现数据范围很小,想到状压dp,然后就愣住不会了. 表示太菜了并没有接触过轮廓线dp这种操作. 首先发现合法的操作过程中一定是这样子的: 按照行来看发现每一行单调不递增. 我们用$1$来表示竖着的轮廓 ...

  6. Bulma 源码结构

    源码基于 Bulma 0.4.0 版本. 一.入口文件 bulma.sass bulma.sass 是 Bulma 使用 SASS 编译的入口文件. sass bulma.sass css/bulma ...

  7. 完全离线安装VSCode插件--Eslint

    最近折腾了一番,总算把Eslint插件在离线的情况下安装好了.之前查了挺多,但是很多方法还是在没有完全离线的情况下进行的.之所以想完全离线安装,主要是因为我们工作的地方是禁止访问外网的,所以像直接执行 ...

  8. 解决:kali linux 在vmware 虚拟机中使用bridge模式上网的问题

    安装kali后,使用独立ip上网,但是设置bridge模式后依然上不了网,后来查了好多资料才解决。 能ping通网页,能ping通DNS,就是不能打开网页。 最后的原因是主机的防火墙拦截,把防火墙关了 ...

  9. 正经学C#_循环[do while,while,for]:[c#入门经典]

    在c#中循环语句总共三种,do...while ,while,for这三种语句. 循环语句,是为了解决一些繁琐的计算.比如输出0-10这10个数字. 在不循环的情况下你可以能这么写 Console.W ...

  10. 写一个Android输入法02——候选窗、转换

    上一篇介绍了完成Android输入法的最小化步骤,它只能将按键对应的字符上屏.一般的东亚语言都有一个转换的过程,比如汉语输入拼音,需要由拼音转成汉字再上屏.本文将在前文基础上加入完成转换过程所必需的候 ...