crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o 等目标文件和daemon.o(由我们自己的C程序文件产生)链接成一个执行文件。前面这5个目标文件的作用分别是启动、初始化、构造、析构和结束,它们 通常会被自动链接到应用程序中。例如,应用程序的main()函数就是通过这些文件来调用的。如果不进行标准的链接的话(编译选项-nostdlib), 我们就必须指明这些必要的目标文件,如果未指定,链接器就会提示找不到_start符号,并因此导致链接失败。且,将目标文件提供给编译器的次序也很重 要,因为GNU链接器(编译器会自动调用该链接器进行目标文件的链接)只是个单次处理链接器。

Glibc 有几个辅助程序运行的运行库 (C RunTime Library),分别是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o,其中crt1.o中包含程 序的入口函数_start以及两个未定义的符号__libc_start_main和main,由_start负责调用 __libc_start_main初始化libc,然后调用我们源代码中定义的main函数;另外,由于类似于全局静态对象这样的代码需要在main函 数之前执行,crti.o和crtn.o负责辅助启动这些代码。另外,Gcc中同样也有crtbegin.o和crtend.o两个文件,这两个目标文件 用于配合glibc来实现C++的全局构造和析构。

android bionic,这个C runtime library设计并不是功能特别强大,并且有些gnu glic中的函数没有实现,这是移植时会碰到的问题.而且,这个C runtime library也并没有采用crt0.o,crt1.o,crti.o crtn.o,crtbegin.o crtend.o,而是采用了android自己的crtbegin_dynamic.o, crtbegin_static.o 和crtend_android.o。crt1.o是crt0.o的后续演进版本,crt1.o中会非常重要的.init段和.fini 段以及_start函数的入口..init段和.fini段实际上是靠crti.o以及crtn.o来实现的. init段是main函数之前的初始化工作代码, 比如全局变量的构造. fini段则负责main函数之后的清理工作.crti.o crtn.o是负责C的初始化,而C++则必须依赖crtbegin.o和crtend.o来帮助实现.
        So,在标准的linux平台下,link的顺序是:ld crt1.o crti.o [user_objects] [system_libraries] crtn.o
        而在android下,link的顺序是:arm-eabi-g++ crtbegin_dynamic.o [user_objects] [system_libraries]crtend_android.o
        所以这就是从另一个方面说明为什么不适合codesourcery之类编译来开发android底层东西的原因了,这里不包括BSP之类.

main()也是一个函数。

这 是因为在编译连接时它将会作为crt0.s汇编程序的函数被调用。crt0.s是一个桩(stub)程序,名称中的“crt”是“C run-time”的缩写。该程序的目标文件将被链接在每个用户执行程序的开始部分,主要用于设置一些初始化全局变量。通常使用gcc编译链接生成文件 时,gcc会自动把该文件的代码作为第一个模块链接在可执行程序中。在编译时使用显示详细信息选项“-v”就可以明显地看出这个链接操作过程。因此在通常 的编译过程中,我们无需特别指定stub模块crt0.o。为了使用ELF格式的目标文件以及建立共享库模块文件,现在的编译器已经把crt0扩展成几个 模块:crt1.0、crti.o、crtbegin.o、crtend.o和crtn.o。 这些模块的链接顺序为crt1.o、crti.o、crtbegin.o(crtbeginS.o)、所有程序模块、 crtend.o(crtendS.o)、crtn.o、库模块文件。gcc的配置文件specfile指定了这种链接顺序。其中,crt1.o、 crti.o和crtn.o由C库提供,是C程序的“启动”模块;crtbegin.o和crtend.o是C++语言的启动模块,由编译器gcc提供; 而crt1.o则与crt0.o的作用类似,主要用于在调用main()之前做一些初始化工作,全局符号_start就定义在这个模块中。 crtbegin.o和crtend.o主要用于C++语言,在.ctors和.dtors区中执行全局构造(constructor)和析构 (destructor)函数。crtbeginS.o和crtendS.o的作用与前两者类似,但用于创建共享模块中。crti.o用于在.init区 中执行初始化函数init()。.init区中包含进程的初始化代码,即当程序开始执行时,系统会在调用main()之前先执行.init中的代码。 crtn.o则用于在.fini区中执行进程终止退出处理函数fini()函数,即当程序正常退出时(main()返回之后),系统会安排执行.fini 中的代码。

Glibc辅助运行库 (C RunTime Library): crt0.o,crt1.o,crti.o crtn.o,crtbegin.o crtend.o相关推荐

  1. C标准库和glibc(C运行库)的关系

    C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库.C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数.变量.类型声明和宏定义.要在一个平台上支持C语言,不仅要实现C编译器, ...

  2. Linux C语言运行库 glibc

    C运行库 任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行.这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合.另外包括各种标准库函数的实现.          ...

  3. CRT(C Runtime Library)—— C/C++运行时库

    C runtime library(part of the C standard library) 任何一个 C 程序,它的背后都有一套庞大的代码来进行支撑,使得该程序得以运行在更高级别上,而不必担心 ...

  4. 转:c/c++ 运行库

    转:c/c++ 运行库 (2011-09-21 11:14:53) 转载▼ 标签: 杂谈 分类:Programming_Languages http://book.csdn.net/bookfiles ...

  5. CRT (C run-time library)简介

    来自 https://mp.weixin.qq.com/s/qg1mFzMEYv7GDDM72H1DOQ  操作系统学习 1. 什么是CRT crt是C run-time library的简称,称为C ...

  6. 带你玩转Visual Studio(八)——带你跳出坑爹的Runtime Library坑

    在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT.MTd.MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时 ...

  7. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  8. VS2013运行库/MD、/MDd、/MT、/MTd

    有段时间在写cuda程序是出现过 error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR71D.dll) 中定义 等类似错误 原因应该是在vs2010 工程属性中 c/c ...

  9. PB运行库(PB6.5,PB7,PB8,PB9)

    [收藏]PB运行库(PB6.5,PB7,PB8,PB9)     一.PowerBuilder运行时动态链接库( Runtime Library ).不同版本的PB所需要的运行时动态链接库文件不尽相同 ...

最新文章

  1. python 报错 bs4 FeatureNotFound: Couldn‘t find a tree builder with the features you requested: lxml
  2. QT VS配置UNICODE问题
  3. android java 调用js,Android中Java和JavaScript交互实例
  4. 初识ABP vNext(8):ABP特征管理
  5. CAAnimation KeyPath学习总结
  6. python︱ collections模块(namedtuple/defaultdict/OrderedDict等)
  7. Java dom序列化字符串,java – 如何在序列化之前从DOM中剥离仅空白的文本节点?...
  8. 1-一、安装NVIDIA控制面板
  9. 十次方项目开发系列【3】:基于MyBatis Plus实现条件查询和分页
  10. Linux中top命令参数详解
  11. 画图工具graphics.h的下载安装
  12. C语言中空字符串长度,C语言中求字符串的长度
  13. C# 将方形图片剪切为圆形(winForm)
  14. 什么是非接触式IC卡
  15. CSDN【精品专栏】第28期
  16. 悬针纹怎么去除 悬针纹化解方法有哪些
  17. 这才叫高颜值的Markdown编辑神器!
  18. An unexpected connection driver error occured错误(亲测有效)
  19. 侏儒、精灵、巫师和国王
  20. 携程网被黑,谁干的??

热门文章

  1. RIM终于想通了-RIM开放新的API
  2. vscode安装python插件成功 调试时通知一直在载入_vscode写python时的代码错误提醒和自动格式化...
  3. xp系统电脑ntp服务器,xp 设置ntp服务器
  4. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
  5. Linux drm显示系统的两种方案
  6. html5 原生 弹窗,一起来看 HTML 5.2 中新的原生元素 dialog
  7. java游戏加入图片,急!急!求大神给这个小游戏加个背景图片
  8. poj3259(SPFA算法)
  9. HDU2899(二分查找+or+模拟退火算法)
  10. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)