关闭

操作系统原理番外篇 - 可执行文件

标签: 操作系统
1661人阅读 评论(0) 收藏 举报
分类:

From: ongoingcre

不知道谁说过,回忆是一座桥 - 佚名

同样是2011年的夏天,我接触了程序语言界的鼻祖C Language,而教我们课的老师却恰好是我的老乡-陈老师,一口方言+普通话!让我很是记忆犹新。人都是从无知开始的,谁都不例外!渐渐的确实喜欢上了,但是这种模式只开始了一学期就结束了,大学里的一学期说长不长,说短也不短!可是蓦然回首,发现自己变得更无知了,越学越没入门!然后自己呢,就开始变得急躁,总是想着自己能做点什么?会做点什么?那一学期是我大学生活中过的最纠结的一学期!
故事到这里就暂时告别一段落了…
我们都知道写出来的程序是需要被编译的?那么这个神秘的编译工具究竟是如何工作的呢? 记得那个使用用的是VC++6.0,这里我不打算以它为例子!作为一个工作和生活的百分之95都在使用Linux的人来说,我觉得开始学C就应该在Linux上!那么显而易见,我们这里的主角就是大胡子倡导的GNU家族的GCC了!

1、编译器构造

在早期的编译器设计中,都是用汇编代码写的!可想而知,随着90年代江湖上各种体系架构各种处理器的推出!显然使用汇编语言已经不能满足当前市场的需求,总不能出现一款编译器就使用汇编重构一次?高级语言些的编译器就显得很V5了!就拿GCC来说,其实他还是使用C写的!那么构造就是函数和参数了!(听说在以前绝大多数编译器中,编译器并不是一个单独庞大的程序,而是由几个小程序组成的_每个模块都有elf可执行文件)!那么现在我们的GCC也是模块化!但是却是用参数来让我们一步一步的进行!

2、再说 Hello World

那么写一段程序是必不可少的!我们都知道入门代码就是Hello World!那么此处也就入乡随俗!

#include <stdio.h>
int main()
{
printf(“Hello World\n”);
return 0;
}
a、预处理   gcc  -E --替换头文件以及宏
b、编译           gcc  -S --编译为汇编语言
c、汇编           gcc  -c   --编译为机器语言
d、链接     gcc  file.o -o elf --生成可执行文件

链接最终生成可执行文件 在linux 上一般为a.out 如果不加-o指定输出的话!

3、a.out 的命名故事

为什么要生成a.out 此处的名称到底由何而来?
就像刚刚发布的苹果新版的系统OS X Yosemite一样!每个命名都是有一段故事的!
而这里的故事则是这样的!
a.out 是汇编程序输出(assembler output)的缩写形式!在早期的unix系统文档(此处为BSD文档非system v)中是有记载的!
NAME:
a.out - 汇编程序和链接编辑输出格式
这里只为链接输出,并不是汇编程序输出!
早期的PDP-7(比C他爹B语言还早)的时候采用的就是a.out格式,之后被system V的coff格式所替换,一直到SVR4的出现才被统一为elf!现在基本上大多数都是elf!
说到这里,也会发现开源的一大优点也算是小缺点,那就是一堆的发行版以及各种的衍生版横空出世!导致了各种接口的不统一性!还好,总是会有那么些人专门为制定标准而生,诸如POSIX,ANSI等!这也使得我们学习选择之余可以去创新和改变它!我们的Linux和mac os显然就是这种,青出于蓝而胜于蓝!

4、a.out 的详细剖析

使用nm 、readelf、objdump 命令就可以窥探他们的内部结构!
而使用size 就可以分析到底该变量存放于那个段!
下面使用nm分析上述hello world

0000000000600e50 d _DYNAMIC
0000000000600fe8 d _GLOBAL_OFFSET_TABLE_
00000000004005f8 R _IO_stdin_used
                 w _Jv_RegisterClasses
0000000000600e30 d __CTOR_END__
0000000000600e28 d __CTOR_LIST__
0000000000600e40 D __DTOR_END__
0000000000600e38 d __DTOR_LIST__
00000000004006d8 r __FRAME_END__
0000000000600e48 d __JCR_END__
0000000000600e48 d __JCR_LIST__
0000000000601020 A __bss_start
0000000000601010 D __data_start
00000000004005b0 t __do_global_ctors_aux
0000000000400460 t __do_global_dtors_aux
0000000000601018 D __dso_handle
                 w __gmon_start__
0000000000600e24 d __init_array_end
0000000000600e24 d __init_array_start
00000000004005a0 T __libc_csu_fini
0000000000400510 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000601020 A _edata
0000000000601030 A _end
00000000004005e8 T _fini
00000000004003c8 T _init
0000000000400410 T _start
000000000040043c t call_gmon_start
0000000000601020 b completed.6531
0000000000601010 W data_start
0000000000601028 b dtor_idx.6533
00000000004004d0 t frame_dummy
00000000004004f4 T main
                 U puts@@GLIBC_2.2.5

再让我们来用一张图简单的描述内部结构!
a.out_keven

5、让a.out 跑起来

程序编译出来在计算机上运行,我们称之为进程!
图解进程..
process_keven
那么如何知道各个变量存放在什么位置?
这里我推荐使用size a.out 然后逐项进行比较。
未初始化 – BSS
初始化的全局或者静态 – Data
局部栈区,指针 – 堆栈
字符串常量 – 栈区
共享库其实是内切进去 – 一 般都用extern 做标识
进程作为载体可以处理不同的任务,一切神奇的事情都将会发生!
Note:
在Linux的堆栈中,当进程需要更多的空间时候,堆栈会变长!尤其在当今64位的处理器可以想象为无限大!当你试图去访问你不能访问的地方的时候,内核会发出警告,如(段错误)!就表示你看了不该看的东西!

By: Keven - 点滴积累

0
0
查看评论

操作系统原理番外篇 - 硬件架构

From: ongoingcre 不知道谁说过,回忆是一座桥 - 佚名依稀记得那是一个记得那是2011年的夏天,都已经到了穿凉拖的地步了。那个时候的自己感觉很阳光,哈哈!总是那么的无畏,那么的潇洒! 就这样子,我接触到了我们所谓的计算机原理课,那个时候感觉很是高大上,所以就一直尝试着努力的去听。。...
  • ongoingcre
  • ongoingcre
  • 2015-11-17 21:15
  • 2237

操作系统原理--总结

操作系统原理   我们每天都同操作系统打交道,了解一些操作系统原理上的知识是绝对有必要的,它可以让你了解操作系统内部是怎么工作的,为什么会出现这样那样的问题,为我们解决这些问题提供思路。     本文完全是为普通电脑用户写的,省略了所有难以理解的算法、原...
  • I_love_linux_
  • I_love_linux_
  • 2014-12-06 17:43
  • 1232

理解操作系统原理——Linux操作系统的真实面目

  • u010665216
  • u010665216
  • 2017-01-13 12:04
  • 338

Windows操作系统原理笔记

2.2 Windows 2000/xp 操作系统模型 这个系统融合了分层操作系统和客户/服务器(微内核)操作系统的特点.通过硬件机制实现了 核心态 Kernel mode 和 用户态 user mode 2个特权级别. 内存管理器,告诉缓存管理器,对象及安全管理器,网络协议,...
  • xue_you
  • xue_you
  • 2013-06-30 17:40
  • 2549

Linux操作系统原理及应用

1、  Linux概述 什么是Linux            简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。其...
  • chenleismr
  • chenleismr
  • 2015-06-12 16:24
  • 414

操作系统原理常见面试题总结

进程和线程有何区别? 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。线程上下文切换比进程上下文切换要快得多。与进程的控制表PCB相似,线程也有自己的控...
  • u011919407
  • u011919407
  • 2015-06-04 23:45
  • 1461

Linux操作系统原理与应用(陈莉君)

《Linux操作系统原理与应用》作者陈莉君是翻译《深入理解Linux内核》的作者。 虽然我不觉得《深入理解Linux内核》翻译得很好,但是从作者这种为推广Linux内 核而努力的精神还是挺佩服的,因此,这里无私分享出学习《Linux操作系统原理与应用》 的学习笔记。 书中给出了许多代码实...
  • zjy900507
  • zjy900507
  • 2017-07-05 16:32
  • 368

操作系统原理学习总结

1.操作系统本质上属于软件的范畴,是一种比较特殊的,系统级的应用软件,所以,我们就可以用应用软件开发的普遍原理来理解操作系统。操作系统从字符界面到图形界面的进化和发展过程,就是就是不断满足用户需求的过程,软件工程讲究用户需求,在这里表现的比较突出,虽然字符界面比较灵活和功能强大,但是其操作比较复杂;...
  • u013467442
  • u013467442
  • 2015-08-08 16:21
  • 1918

【聚沙成塔系列】之《UML九种图

一、包 (一)相关概念: 1、包: 一个包=一层=一个命名空间=一个文件夹 2、包的命名:       简单名:王老二       路径名:中国.河北省.廊坊市.廊坊师范学院.信息技术提高...
  • dyllove98
  • dyllove98
  • 2013-08-01 19:51
  • 5854

编程珠玑番外篇-D. 高级语言怎么来的

编程珠玑番外篇-D. 高级语言怎么来的-1 作者:徐宥 原文:http://blog.youxu.info/2009/05/13/hpl/ 终于放暑假了, 有心情来八卦了. 我主要想八卦一下高级语言的设计思想和各种范式的来龙去脉, 也就是回答这个问题:&...
  • xiaojianpitt
  • xiaojianpitt
  • 2012-07-01 17:11
  • 3628
    Smart L 开源项目分享群
    Smart L
    个人资料
    • 访问:160421次
    • 积分:1852
    • 等级:
    • 排名:千里之外
    • 原创:48篇
    • 转载:4篇
    • 译文:1篇
    • 评论:4条
    最新评论