#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. Node 中的 stream (流)

    流的概念 流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface). stream 模块提供了基础的 API .使用这些 API 可以很容易地来构建实现流 ...

  2. resize函数有五种插值算法

    转自http://blog.csdn.net/fengbingchun/article/details/17335477 最新版OpenCV2.4.7中,cv::resize函数有五种插值算法:最近邻 ...

  3. 算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-007按位置,找出数组相关最大值

    Given an array a[] of N real numbers, design a linear-time algorithm to find the maximum value of a[ ...

  4. 杭电ACM刷题(2):1005,Number Sequence 标签: 杭电acmC语言 2017-05-11 22:43 116人阅读

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  5. SDUT 3374 数据结构实验之查找二:平衡二叉树

    数据结构实验之查找二:平衡二叉树 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定的输 ...

  6. TypeError: document.body is null_js报错解决办法

    今天在使用如下js代码的时候,发现报错:document.body is null <script type="text/javascript"> var dw=doc ...

  7. Android之Home键监听封装

    众所周知,我们监听返回键事件,无法是下面两个方法: @Override public void onBackPressed() { //do something //super.onBackPress ...

  8. SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)

    Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...

  9. 如何使用Visual Studio 2010在数据库中生成随机测试数据

    测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...

  10. 在RobotFramework--RIDE中把日期转化为整型进行运算

    在RobotFramework--RIDE中把日期转化为整型进行运算 运行结果: 20180906 16:10:17.919 : INFO : ${time} = 2018-09-06 16:10:1 ...