|
|
|
|
 我翻译的一段GCC Internals的内容 - shy828301 [ 2006-07-28 11:19 | 3,722 byte(s)]
 Re: 我翻译的一段GCC Internals的内容 - qiyoa [ 2006-07-30 14:34 | 70 byte(s)]
 Re: 我翻译的一段GCC Internals的内容 - EricFisher [ 2006-07-31 19:05 | 105 byte(s)]
 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - r00t [ 2006-07-30 16:22 | 0 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - qiyoa [ 2006-07-30 18:45 | 309 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - shy828301 [ 2006-07-31 09:44 | 102 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - alephman [ 2006-07-31 10:49 | 30 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - shy828301 [ 2006-07-31 12:05 | 34 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - qiyoa [ 2006-07-31 22:47 | 32 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - ccba [ 2006-08-02 12:47 | 100 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - qiyoa [ 2006-08-02 23:40 | 128 byte(s)]
 Re: 如果能把gcc相关的东西都翻译成中文,那么对中国的自由软件业来说,贡献是巨大的 - shy828301 [ 2006-08-03 09:45 | 100 byte(s)]
 Re: 我翻译的一段GCC Internals的内容 - teawater [ 2006-07-28 20:12 | 31 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
前段时间又看了一遍GCC Internals,翻译了一下关于GCC如何处理构造函数和析构函数的内容。我把我的译文贴上来,肯定还有很多错误在里面,希望各位大侠指出。
原文链接:
http://gcc.gnu.org/onlinedocs/gccint/Initialization.html#Initialization
译文:
用某些语言编译的代码包括构造函数(也称作初始化例程)——程序启动时用于初始化程序数据的函数。这些函数需要在程序开始之前调用——也就是说,在 main之前调用。编译一些语言产生析构函数(也称作终止例程),在程序结束时调用。为了使得初始化和终止函数工作,编译器必须在汇编代码中输出一些东西,使得这些函数在恰当的时间 被调用。当移植编译器到一个新的系统时,需要指定怎样做这件事。GCC目前支持构造函数和析构函数执行的两个主要的方法。每一种方法又有两个变种。连接器必须为这些函数构造两个链表,一个链表用于构造函数,称作__CTOR_LIST__,一个链表用于析构函数,称作__DTOR_LIST__。每个链表以一个忽略的函数指针开始。后面跟着一系列0或多个指向构造函数或析构函数的指针,然后是一个包含0的函数指针。crtstuff.c或者 libgcc2.c在启动时和退出时遍历这些链表,这依赖于操作系统和可执行文件的格式。构造函数以到序调用,析构函数正序调用。处理构造函数最好的方法,仅仅可以工作于提供可以任意命名段的目标文件格式。一个段留出用于构造函数,另一个段用于析构函数。传统上叫做".ctors"和".dtors"。定义了构造函数的目标文件也在构造函数段中放一个字,指向这个函数。连接器累加所有的这些字到一个连续的".ctors"段。析构函数的处理方法也一样。如果定义了TARGET_ASM_NAMED_SECTION将由target-def.h选择缺省的方法。那些不支持任意命名段的目标文件,但是支持特殊定义的构造函数和析构函数段的可以通过定义CTORS_SECTION_ASM_OP和DTORS_SECTION_ASM_OP来获得一样的效果。当任意命名的段可用时,有两个变种,依赖于在crtstuff.c中的代码怎样调用。在程序开始处,支持执行.init段的系统上,crtstuff.c中的一部分代码被编译到这个段中。程序被GCC驱动链接:
ld -o output_file crti.o crtbegin.o ... -lgcc crtend.o crtn.o
函数的prologue(__init)出现在crti.o的.init段中。epilogue出现在crtn.o中。同样的,函数__fini在. fine节中。通常这些文件由操作系统或者GNU C库提供,但是某些体系结构由GCC提供。目标文件crtbegin.o和crtend.o是从crtstuff.c编译的。他们包含在.init和. fini段中的分支到.text段例程的代码片断。链接器把段的所有部分都放在一起,导致一个完整的__init函数,我们需要在启动时调用的例程。为了使用这个变种,你必须恰当的定义INIT_SECTION_ASM_OP宏。当GCC编译任何叫做main的函数时(或者更确切的说,任何通过语言前端调用expand_main_function定义的,作为程序入口点的函 数),如果init段不可用,他插入一个到__main函数的过程调用,作为prologue后的第一个可执行代码。__main函数定义于 libgcc2.c中,运行全局构造函数。在不支持任意命名段的目标文件格式中又有两个变种。在最简单的变种中,GNU连接器(GNU ld)和一个"a.out"格式必须使用。在这种情况中,TARGET_ASM_CONSTRUCTOR被定义,产生一个类型是"N_SETT"的. stabs入口,引用名字__CTOR_LIST__,包含初始化代码的void函数的地址作为他的值。GNU链接器识别这个作为一个请求,加这个值到一个集合上。这些值被累加,最终放在可执行文件中,作为上面描述的格式中的一个向量,元素带有前导计数而且尾部为0。 TARGET_ASM_DESTRUCTOR的处理也是相似的。由于没有init段可用,没有INIT_SECTION_ASM_OP导致main的编译在上面调用__main,开始初始化过程。最后一个变种既不使用任意命名的段也不使用链接器。这个在你想要使用动态链接和GNU链接器不支持的目标文件格式,比如"ECOFF"时才这样做。在这种情况中,TARGET_HAVE_CTORS_DTORS为假,构造函数和析构函数简单的由他们的名字识别。这就在链接中要求一个额外的程序,称作collect2。这个程序假装是GCC使用的链接器。他不仅通过运行一般地链接器完成这个工作,也安排包含构造函数和析构函数的向量。这些函数通过__main调用,就像上面描述的一样。为了使用这个方法,use_collect2必须在config.gcc中定义。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
能说详细一点吗?
您觉得“gcc相关的东西” 除了 gcc internal,还有什么吗?
我以前看过gcc internal,觉得很多内容都不是很清楚。而且很多信息都包含在源代码的注释里边,比较零散,没有体系。
希望有高手带领我们,把这些东西搞清楚,:)
翻译internal也挺好的!我可以参与,:)
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
我最近在整理我以前的笔记,而且以前翻译的不是很全,会补充一些东西,会先发在我的blog上,先在上面连载了
|
|
----
我的blog:http://hi.baidu.com/juventus
|
|
[Original]
[Print]
[Top]
|
|
|