转一篇GCC相关的文章

http://blog.csdn.net/dadoneo/article/details/8201403

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

分类: Linux2012-11-19 21:46 6036人阅读 评论(2) 收藏 举报

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中的代码。

时间: 2024-11-10 01:33:24

转一篇GCC相关的文章的相关文章

DB 查询分析器 6.04 发布 ,本人为之撰写的相关技术文章达78篇

DB查询分析器 6.04 发布,本人为之撰写的相关技术文章达78篇 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员 http://www.csdn.net/article/2014-08-09/2821124)推出的个人作品----万能数据库查询分析器,中文版本<DB 查询分析器>.英文版本<DB QueryAnalyzer>.它具有强大的功能.友好的操作界面.良好的操作性.跨越各种数据库平台乃至于EXCEL和文本文件. 你可以通过它 ① 查询OD

2.5星|《数字货币:世界为我疯狂》:5年来《商业周刊》的区块链与比特币相关的文章16篇

商业周刊/中文版:数字货币:世界为我疯狂 这本书是2013年以来<商业周刊>上的区块链与比特币相关的文章的合集共16篇,大部分内容现在看文献价值更大. 总体评价2.5星,参考价值不大. 以下是书中一些内容的摘抄,#号后面是kindle电子版中的页码: 1:2010年,他不小心从电脑中删去了800个比特币,若放到今天,其价值将超过640万美元.但实际上Kenna并没有特别的沮丧:我还有很多,在当初每个20美分的时候,我买了5,000个.#29 2:近几个月里,黑客已经成功地实施了多次比特币抢劫,

A博娱乐十篇必读的Java文章

A博娱乐一个月前,我们发布了一份<十篇必读的SQL文章>清单,我们相信这些文章将为jOOQ博客的读者提供 极大的价值.jooQ是一个专注于Java和SQL的博客,所以一个月后的今天,我们发布一份同样令人兴奋 的<十篇必读的Java文章>清单,是再自然不过的事情. 请注意对于"必读的"这个描述,我们不仅仅特指某一篇链接的文章,也可能包含来自同一作者的其 它文章,这些作者在这些年一直是博客的中坚力量,总是能创造新的令人关注的内容. 让我们来看看吧! 1.Brian

转一篇DLL逆向的文章,适用于一般的dll逆向

转一篇DLL逆向的文章,适用于一般的dll逆向,我使用的库是一组DLL,都有强签名,如下方法不适合,编译会提示强签名错误. C# 带签名dll破解 Mar 9, 2016 | C# | 84 Hits 转自 http://blog.fwhyy.com/2016/03/csharp-with-signature-dll-crack/?utm_source=tuicool&utm_medium=referral 暂无评论 首先申明,本文只是从技术的角度来分析下怎样破解带签名的C#写的dll文件.大家

(转)干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)

干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码) 该博客来源自:https://mp.weixin.qq.com/s?__biz=MzA4NzE1NzYyMw==&mid=2247492203&idx=5&sn=3020c3a43bd4dd678782d8aa24996745&chksm=903f1c73a74895652ee688d070fd807771e3fe6a8947f77f3a15a44a65557da0313ac5ad592c

《转载-两篇很好的文章整合》Android中自定义控件

两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs.com/0616--ataozhijia/p/4003380.html Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图部分的基本结构--树形结构 View定义了绘图的基本操作 基本操作由三个函数完

看到一篇很有意思的文章,但是我们身边确实有这样的人

我在代码之路上曾经遇到过很多奇怪的对手,也遇到过奇怪的队友.我至少接触了五种不同的"代码斗士".其中一些有才的战友有助于开发工作的进行,而另一些看起来阻碍了我的每一个计划. 然而,他们全都在软件开发的"万神殿"中拥有一席之地.如果不能将这些不同风格的程序员协调好的话,你会发现你的项目会花费很多时间.不够稳定或者代码难以读懂等问题. 补漏灵型 该死,代码虽然不够完美,但是能工作就行了! 这种人是你公司的基础.当哪里出现差错的时候他会迅速的修补,在某种程度上,保证不会再

国外一些有价值的docker相关的文章

国外一些有价值的docker相关的文章 docker 每周都有周报进行更新,有一个网站列出了从开始2015年1月30日的一些有价值的链接: 关于Weave: 在Azure上一个CoreOS集群上安装Weave Docker虚拟网络https://github.com/chanezon/azure-linux/blob/master/coreos/weave/README.md Crate with Docker & Weavehttps://crate.io/blog/crate-with-do

【目录】数据挖掘与机器学习相关算法文章总目录

本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 数据挖掘与机器学习相关算法文章目录 1.数据挖掘之—基于ReliefF和K-means算法的医学应用实例  2.彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码]