⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctor.c

📁 早期freebsd实现
💻 C
字号:
/* BFD library support routines for constructors   Copyright (C) 1990-1991 Free Software Foundation, Inc.   Hacked by Steve Chamberlain of Cygnus Support. With some help from   Judy Chamberlain too.This file is part of BFD, the Binary File Descriptor library.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  *//*SECTION	Constructors	Classes in C++ have 'constructors' and 'destructors'.  These	are functions which are called automatically by the language	whenever data of a class is created or destroyed.  Class data	which is static data may also be have a type which requires	'construction', the contructor must be called before the data	can be referenced, so the contructor must be called before the	program begins. 	The common solution to this problem is for the compiler to	call a magic function as the first statement <<main>>.	This magic function, (often called <<__main>>) runs around	calling the constructors for all the things needing it.	With COFF the compile has a bargain with the linker et al.	All constructors are given strange names, for example	<<__GLOBAL__$I$foo>> might be the label of a contructor for	the class @var{foo}.  The solution on unfortunate systems	(most system V machines) is to perform a partial link on all	the .o files, do an <<nm>> on the result, run <<awk>> or some	such over the result looking for strange <<__GLOBAL__$>>	symbols, generate a C program from this, compile it and link	with the partially linked input. This process is usually	called <<collect>>. 	Some versions of <<a.out>> use something called the	<<set_vector>> mechanism.  The constructor symbols are output	from the compiler with a special stab code saying that they	are constructors, and the linker can deal with them directly. 	BFD allows applications (ie the linker) to deal with	constructor information independently of their external	implimentation by providing a set of entry points for the	indiviual object back ends to call which maintains a database	of the contructor information.  The application can	interrogate the database to find out what it wants.  The	construction data essential for the linker to be able to	perform its job are: 	o asymbol -	The asymbol of the contructor entry point contains all the	information necessary to call the function. 	o table id -	The type of symbol, ie is it a contructor, a destructor or	something else someone dreamed up to make our lives difficult.	This module takes this information and then builds extra	sections attached to the bfds which own the entry points.  It	creates these sections as if they were tables of pointers to	the entry points, and builds relocation entries to go with	them so that the tables can be relocated along with the data	they reference. 	These sections are marked with a special bit	(<<SEC_CONSTRUCTOR>>) which the linker notices and do with	what it wants.*/#include <bfd.h>#include <sysdep.h>#include <libbfd.h>/*INTERNAL_FUNCTION	bfd_constructor_entry SYNOPSIS	void bfd_constructor_entry(bfd *abfd, 		asymbol **symbol_ptr_ptr,		CONST char*type);DESCRIPTION	This function is called with an a symbol describing the	function to be called, an string which descibes the xtor type,	eg something like "CTOR" or "DTOR" would be fine. And the bfd	which owns the function. Its duty is to create a section	called "CTOR" or "DTOR" or whatever if the bfd doesn't already	have one, and grow a relocation table for the entry points as	they accumulate.*/ void DEFUN(bfd_constructor_entry,(abfd, symbol_ptr_ptr, type),	   bfd *abfd AND	   asymbol **symbol_ptr_ptr AND	   CONST char *type){    /* Look up the section we're using to store the table in */    asection *rel_section = bfd_get_section_by_name (abfd, type);    if (rel_section == (asection *)NULL) {	rel_section = bfd_make_section (abfd, type);	rel_section->flags = SEC_CONSTRUCTOR;	rel_section->alignment_power = 2;    }    /* Create a relocation into the section which references the entry       point */   {       arelent_chain *reloc = (arelent_chain *)bfd_alloc(abfd,							 sizeof(arelent_chain));/*       reloc->relent.section = (asection *)NULL;*/       reloc->relent.addend = 0;       reloc->relent.sym_ptr_ptr = symbol_ptr_ptr;       reloc->next = rel_section->constructor_chain;       rel_section->constructor_chain = reloc;       reloc->relent.address = rel_section->_cooked_size;       /* ask the cpu which howto to use */       reloc->relent.howto = bfd_reloc_type_lookup(abfd, BFD_RELOC_CTOR);       rel_section->_cooked_size += sizeof(int *);       rel_section->reloc_count++;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -