RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and John Gilmore.

This commit is contained in:
John Gilmore 1991-10-25 07:06:02 +00:00
parent c8c0a2bd59
commit cbdc790909
10 changed files with 621 additions and 420 deletions

View File

@ -1,3 +1,31 @@
Thu Oct 24 22:40:07 1991 John Gilmore (gnu at cygnus.com)
RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and
John Gilmore.
* Makefile.in: Add cpu-rs6000.c and rs6000coff.c.
* configure.in: Add rs6000 case.
* targets.c: Add rs6000 vector.
* archures.c: Add rs6000, fix comment on romp.
* bfd-in.h (enum bfd_error): Add no_debug_section error.
* libcoff-in.h (struct coff_tdata): Remove unused string_table.
* bfd.c (bfd_errmsgs): Add no_debug_section error message.
* section.c (bfd_make_section): Return NULL on attempt to create
a section twice.
* coffcode.h (bfd_swap_reloc_in): Handle r_type and r_size.
(bfd_swap_aouthdr_in): Handle lots more members.
(make_a_section_from_file): If section has already been seen,
just return false rather than overwriting it.
(coff_real_object_p): Understand incoming magic numbers.
(coff_set_flags): Understand outgoing magic numbers.
(coff_compute_section_file_positions): outgoing aouthdr magic #.
(build_debug_section): Add fn for reading debug string section.
(get_normalized_symtab): Handle symbol names in debug string section.
Remove unused obj_string_table.
(coff_slurp_symbol_table): Handle rs6000-specific storage classes.
* aoutx.h (translate_from_native_sym_flags, N_SET*): Check for
existing section before making one.
Thu Oct 24 02:03:24 1991 Fred Fish (fnf at cygnus.com)
* elf.c: Add partial support for ELF format corefiles. Still needs

View File

@ -43,12 +43,13 @@ CFLAGS = -g $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) # -DINTEL960VERSION
BFD_LIBS = libbfd.o opncls.o bfd.o archive.o targets.o cache.o \
archures.o core.o section.o format.o syms.o reloc.o init.o
BFD_MACHINES=cpu-h8300.o cpu-i960.o cpu-sparc.o cpu-m68k.o cpu-m88k.o \
cpu-vax.o cpu-mips.o cpu-a29k.o cpu-i386.o
BFD_MACHINES = cpu-h8300.o cpu-i960.o cpu-sparc.o cpu-m68k.o cpu-m88k.o \
cpu-vax.o cpu-mips.o cpu-a29k.o cpu-i386.o cpu-rs6000.o
BFD_BACKENDS = oasys.o ieee.o srec.o \
aout64.o aout32.o demo64.o sunos.o newsos3.o i386aout.o bout.o \
icoff.o amdcoff.o m68kcoff.o i386coff.o m88k-bcs.o ecoff.o elf.o
icoff.o amdcoff.o m68kcoff.o i386coff.o m88k-bcs.o ecoff.o elf.o \
rs6000coff.o
OPTIONAL_BACKENDS = trad-core.o
@ -58,11 +59,11 @@ BFD_H=$(INCDIR)/bfd.h
# C source files that correspond to .o's.
CFILES = libbfd.c opncls.c bfd.c archive.c targets.c cache.c archures.c \
i386coff.c aout64.c aout32.c sunos.c demo64.c icoff.c srec.c \
oasys.c ieee.c m68kcoff.c amdcoff.c \
oasys.c ieee.c m68kcoff.c amdcoff.c rs6000coff.c \
format.c section.c core.c syms.c reloc.c init.c \
m88k-bcs.c ecoff.c trad-core.c newsos3.c i386aout.c bout.c elf.c \
cpu-h8300.c cpu-i960.c cpu-sparc.c cpu-m68k.c cpu-m88k.c \
cpu-vax.c cpu-mips.c cpu-a29k.c cpu-i386.o
cpu-vax.c cpu-mips.c cpu-a29k.c cpu-i386.c cpu-rs6000.c
STAGESTUFF = $(TARGETLIB) $(OFILES)
@ -125,6 +126,9 @@ $(BFD_MACHINES): libbfd.h $(BFD_H) $(RECONFIG)
$(BFD_BACKENDS): libbfd.h $(BFD_H) $(RECONFIG)
$(OPTIONAL_BACKENDS): libbfd.h $(BFD_H) $(RECONFIG)
# Get around a Sun Make bug in SunOS 4.1.1 with VPATH
cpu-i386.o:cpu-i386.c
saber:
#suppress 65 on bfd_map_over_sections
#suppress 66 on bfd_map_over_sections
@ -262,6 +266,8 @@ m68kcoff.o : m68kcoff.c $(INCDIR)/bfd.h $(INCDIR)/obstack.h libbfd.h \
$(INCDIR)/m68kcoff.h $(INCDIR)/internalcoff.h libcoff.h coffcode.h
amdcoff.o : amdcoff.c $(INCDIR)/bfd.h $(INCDIR)/obstack.h libbfd.h \
$(INCDIR)/amdcoff.h $(INCDIR)/internalcoff.h libcoff.h coffcode.h
rs6000coff.o: rs6000coff.c $(INCDIR)/bfd.h $(INCDIR)/obstack.h libbfd.h \
$(INCDIR)/rs6000coff.h $(INCDIR)/internalcoff.h libcoff.h coffcode.h
format.o : format.c $(INCDIR)/bfd.h \
$(INCDIR)/obstack.h libbfd.h
section.o : section.c $(INCDIR)/bfd.h \

View File

@ -700,7 +700,10 @@ bfd *abfd)
asection *section ;
arelent_chain *reloc = (arelent_chain *)bfd_alloc(abfd, sizeof(arelent_chain));
strcpy(copy, cache_ptr->symbol.name);
section = bfd_make_section(abfd,copy);
section = bfd_get_section_by_name (abfd, copy);
if (!section)
section = bfd_make_section(abfd,copy);
switch ( (cache_ptr->type & N_TYPE) ) {
case N_SETA:
section->flags = SEC_CONSTRUCTOR;
@ -1700,9 +1703,9 @@ DEFUN(NAME(aout,find_nearest_line),(abfd,
}
int
DEFUN(NAME(aout,sizeof_headers),(ignore_abfd, execable),
bfd *ignore_abfd AND
DEFUN(NAME(aout,sizeof_headers),(abfd, execable),
bfd *abfd AND
boolean execable)
{
return EXEC_BYTES_SIZE;
return adata(abfd)->exec_bytes_size;
}

View File

@ -22,11 +22,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/*doc*
@section Architectures
BFD's idea of an architecture is implimented in @code{archures.c}. BFD
keeps one atoms in a BFD describing the architecture of the data
attached to the BFD; a pointer to a @code{bfd_arch_info_struct}.
keeps one atom in a BFD describing the architecture of the data
attached to the BFD; a pointer to a @code{bfd_arch_info_type}.
Pointers to structures can be requested independently of a bfd so that
an archictectures information can be interrogated without access to an
an architecture's information can be interrogated without access to an
open bfd.
The arch information is provided by each architecture package. The
@ -82,12 +82,13 @@ enum bfd_architecture
bfd_arch_ns32k, {* National Semiconductor 32xxx *}
bfd_arch_tahoe, {* CCI/Harris Tahoe *}
bfd_arch_i860, {* Intel 860 *}
bfd_arch_romp, {* IBM ROMP RS/6000 *}
bfd_arch_romp, {* IBM ROMP PC/RT *}
bfd_arch_alliant, {* Alliant *}
bfd_arch_convex, {* Convex *}
bfd_arch_m88k, {* Motorola 88xxx *}
bfd_arch_pyramid, {* Pyramid Technology *}
bfd_arch_h8300, {* Hitachi H8/300 *}
bfd_arch_rs6000, {* IBM RS/6000 *}
bfd_arch_last
};
*-
@ -100,16 +101,16 @@ stuff
/* $Id$ */
#include <sysdep.h>
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
/*proto* bfd_arch_info_struct
/*proto* bfd_arch_info
This structure contains information on architectures.
*+
typedef int bfd_reloc_code_enum_type;
typedef int bfd_reloc_code_type;
typedef struct bfd_arch_info_struct
typedef struct bfd_arch_info
{
int bits_per_word;
int bits_per_address;
@ -120,52 +121,25 @@ typedef struct bfd_arch_info_struct
CONST char *printable_name;
{* true if this is the default machine for the architecture *}
boolean the_default;
CONST struct bfd_arch_info_struct * EXFUN((*compatible),(CONST struct bfd_arch_info_struct *a,
CONST struct bfd_arch_info_struct *b));
CONST struct bfd_arch_info * EXFUN((*compatible),(CONST struct bfd_arch_info *a,
CONST struct bfd_arch_info *b));
boolean EXFUN((*scan),(CONST struct bfd_arch_info_struct *,CONST char *));
boolean EXFUN((*scan),(CONST struct bfd_arch_info *,CONST char *));
unsigned int EXFUN((*disassemble),(bfd_vma addr, CONST char *data,
PTR stream));
CONST struct reloc_howto_struct *EXFUN((*reloc_type_lookup), (bfd_reloc_code_enum_type code));
CONST struct reloc_howto_struct *EXFUN((*reloc_type_lookup), (CONST struct
bfd_arch_info *,
bfd_reloc_code_type code));
struct bfd_arch_info_struct *next;
struct bfd_arch_info *next;
} bfd_arch_info_struct_type;
} bfd_arch_info_type;
*-
*/
bfd_arch_info_struct_type *bfd_arch_info_list;
/*proto* bfd_printable_arch_mach
Return a printable string representing the architecture and machine
type.
NB. The use of this routine is depreciated.
*; PROTO(CONST char *,bfd_printable_arch_mach,
(enum bfd_architecture arch, unsigned long machine));
*/
CONST char *
DEFUN(bfd_printable_arch_mach,(arch, machine),
enum bfd_architecture arch AND
unsigned long machine)
{
bfd_arch_info_struct_type *ap;
bfd_check_init();
for (ap = bfd_arch_info_list;
ap != (bfd_arch_info_struct_type *)NULL;
ap = ap->next) {
if (ap->arch == arch &&
((ap->mach == machine) || (ap->the_default && machine == 0))) {
return ap->printable_name;
}
}
return "UNKNOWN!";
}
bfd_arch_info_type *bfd_arch_info_list;
/*proto* bfd_printable_name
@ -193,26 +167,24 @@ supports any cpu which could be described with the name provided. The
routine returns a pointer to an arch_info structure if a machine is
found, otherwise NULL.
*; bfd_arch_info_struct_type *EXFUN(bfd_scan_arch,(CONST char *));
*; bfd_arch_info_type *EXFUN(bfd_scan_arch,(CONST char *));
*/
bfd_arch_info_struct_type *
bfd_arch_info_type *
DEFUN(bfd_scan_arch,(string),
CONST char *string)
{
struct bfd_arch_info_struct *ap;
struct bfd_arch_info *ap;
/* Look through all the installed architectures */
for (ap = bfd_arch_info_list;
ap != (bfd_arch_info_struct_type *)NULL;
ap != (bfd_arch_info_type *)NULL;
ap = ap->next) {
/* Don't bother with anything if the first chars don't match */
if (ap->arch_name[0] != string[0])
continue;
if (ap->scan(ap, string))
return ap;
}
return (bfd_arch_info_struct_type *)NULL;
return (bfd_arch_info_type *)NULL;
}
@ -224,12 +196,12 @@ denominator between the two architectures and machine types implied by
the BFDs and returns a pointer to an arch_info structure describing
the compatible machine.
*; CONST bfd_arch_info_struct_type *EXFUN(bfd_arch_get_compatible,
*; CONST bfd_arch_info_type *EXFUN(bfd_arch_get_compatible,
(CONST bfd *abfd,
CONST bfd *bbfd));
*/
CONST bfd_arch_info_struct_type *
CONST bfd_arch_info_type *
DEFUN(bfd_arch_get_compatible,(abfd, bbfd),
CONST bfd *abfd AND
CONST bfd *bbfd)
@ -244,11 +216,11 @@ CONST bfd *bbfd)
What bfds are seeded with
*+
extern bfd_arch_info_struct_type bfd_default_arch_struct;
extern bfd_arch_info_type bfd_default_arch_struct;
*-
*/
bfd_arch_info_struct_type bfd_default_arch_struct =
bfd_arch_info_type bfd_default_arch_struct =
{
32,32,8,bfd_arch_unknown,0,"unknown","unknown",true,
bfd_default_compatible, bfd_default_scan,
@ -257,13 +229,13 @@ bfd_arch_info_struct_type bfd_default_arch_struct =
/*proto* bfd_set_arch_info
*; void EXFUN(bfd_set_arch_info,(bfd *, bfd_arch_info_struct_type *));
*; void EXFUN(bfd_set_arch_info,(bfd *, bfd_arch_info_type *));
*/
void DEFUN(bfd_set_arch_info,(abfd, arg),
bfd *abfd AND
bfd_arch_info_struct_type *arg)
bfd_arch_info_type *arg)
{
abfd->arch_info = arg;
}
@ -284,15 +256,15 @@ boolean DEFUN(bfd_default_set_arch_mach,(abfd, arch, mach),
enum bfd_architecture arch AND
unsigned long mach)
{
static struct bfd_arch_info_struct *old_ptr = &bfd_default_arch_struct;
static struct bfd_arch_info *old_ptr = &bfd_default_arch_struct;
boolean found = false;
/* run through the table to find the one we want, we keep a little
cache to speed things up */
if (old_ptr == 0 || arch != old_ptr->arch || mach != old_ptr->mach) {
bfd_arch_info_struct_type *ptr;
old_ptr = (bfd_arch_info_struct_type *)NULL;
bfd_arch_info_type *ptr;
old_ptr = (bfd_arch_info_type *)NULL;
for (ptr = bfd_arch_info_list;
ptr != (bfd_arch_info_struct_type *)NULL;
ptr != (bfd_arch_info_type *)NULL;
ptr= ptr->next) {
if (ptr->arch == arch &&
((ptr->mach == mach) || (ptr->the_default && mach == 0))) {
@ -385,6 +357,7 @@ extern void EXFUN(bfd_vax_arch,(void));
extern void EXFUN(bfd_a29k_arch,(void));
extern void EXFUN(bfd_mips_arch,(void));
extern void EXFUN(bfd_i386_arch,(void));
extern void EXFUN(bfd_rs6000_arch,(void));
@ -402,6 +375,7 @@ static void EXFUN((*archures_init_table[]),()) =
bfd_i960_arch,
bfd_m68k_arch,
bfd_vax_arch,
bfd_rs6000_arch,
#endif
0
};
@ -434,12 +408,12 @@ DEFUN_VOID(bfd_arch_init)
Link the provided arch info structure into the list
*; void EXFUN(bfd_arch_linkin,(bfd_arch_info_struct_type *));
*; void EXFUN(bfd_arch_linkin,(bfd_arch_info_type *));
*/
void DEFUN(bfd_arch_linkin,(ptr),
bfd_arch_info_struct_type *ptr)
bfd_arch_info_type *ptr)
{
ptr->next = bfd_arch_info_list;
bfd_arch_info_list = ptr;
@ -450,17 +424,17 @@ void DEFUN(bfd_arch_linkin,(ptr),
The default function for testing for compatibility
*; CONST bfd_arch_info_struct_type *EXFUN(bfd_default_compatible,
(CONST bfd_arch_info_struct_type *a,
CONST bfd_arch_info_struct_type *b));
*; CONST bfd_arch_info_type *EXFUN(bfd_default_compatible,
(CONST bfd_arch_info_type *a,
CONST bfd_arch_info_type *b));
*/
CONST bfd_arch_info_struct_type *
CONST bfd_arch_info_type *
DEFUN(bfd_default_compatible,(a,b),
CONST bfd_arch_info_struct_type *a AND
CONST bfd_arch_info_struct_type *b)
CONST bfd_arch_info_type *a AND
CONST bfd_arch_info_type *b)
{
if(a->arch != b->arch) return (bfd_arch_info_struct_type *)NULL;
if(a->arch != b->arch) return NULL;
if (a->mach > b->mach) {
return a;
@ -475,13 +449,13 @@ DEFUN(bfd_default_compatible,(a,b),
The default function for working out whether this is an architecture
hit and a machine hit
*; boolean EXFUN(bfd_default_scan,(CONST struct bfd_arch_info_struct *, CONST char *));
*; boolean EXFUN(bfd_default_scan,(CONST struct bfd_arch_info *, CONST char *));
*/
boolean
DEFUN(bfd_default_scan,(info, string),
CONST struct bfd_arch_info_struct *info AND
CONST struct bfd_arch_info *info AND
CONST char *string)
{
CONST char *ptr_src;
@ -554,6 +528,10 @@ CONST char *string)
arch = bfd_arch_i860;
break;
case 6000:
arch = bfd_arch_rs6000;
break;
default:
return false;
}
@ -571,13 +549,65 @@ CONST char *string)
/*proto* bfd_get_arch_info
*; bfd_arch_info_struct_type * EXFUN(bfd_get_arch_info,(bfd *));
*; bfd_arch_info_type * EXFUN(bfd_get_arch_info,(bfd *));
*/
bfd_arch_info_struct_type *
bfd_arch_info_type *
DEFUN(bfd_get_arch_info,(abfd),
bfd *abfd)
{
return abfd->arch_info;
}
/*proto* bfd_lookup_arch
*; bfd_arch_info_type * EXFUN(bfd_lookup_arch,(enum
bfd_architecture arch,long machine));
Look for the architecure info struct which matches the arguments
given. A machine of 0 will match the machine/architecture structure which
marks itself as the default.
*/
bfd_arch_info_type *
DEFUN(bfd_lookup_arch,(arch, machine),
enum bfd_architecture arch AND
long machine)
{
bfd_arch_info_type *ap;
bfd_check_init();
for (ap = bfd_arch_info_list;
ap != (bfd_arch_info_type *)NULL;
ap = ap->next) {
if (ap->arch == arch &&
((ap->mach == machine) || (ap->the_default && machine == 0))) {
return ap;
}
}
return (bfd_arch_info_type *)NULL;
}
/*proto* bfd_printable_arch_mach
Return a printable string representing the architecture and machine
type.
NB. The use of this routine is depreciated.
*; PROTO(CONST char *,bfd_printable_arch_mach,
(enum bfd_architecture arch, unsigned long machine));
*/
CONST char *
DEFUN(bfd_printable_arch_mach,(arch, machine),
enum bfd_architecture arch AND
unsigned long machine)
{
bfd_arch_info_type *ap = bfd_lookup_arch(arch, machine);
if(ap) return ap->printable_name;
return "UNKNOWN!";
}

View File

@ -204,7 +204,8 @@ typedef enum bfd_error {
no_more_archived_files, malformed_archive,
symbol_not_found, file_not_recognized,
file_ambiguously_recognized, no_contents,
bfd_error_nonrepresentable_section,
bfd_error_nonrepresentable_section,
no_debug_section,
invalid_error_code} bfd_ec;
extern bfd_ec bfd_error;
@ -220,10 +221,10 @@ PROTO (void, bfd_perror, (CONST char *message));
typedef enum bfd_print_symbol
{
bfd_print_symbol_name_enum,
bfd_print_symbol_type_enum,
bfd_print_symbol_all_enum
} bfd_print_symbol_enum_type;
bfd_print_symbol_name,
bfd_print_symbol_more,
bfd_print_symbol_all
} bfd_print_symbol_type;
@ -269,7 +270,14 @@ CAT(NAME,_bfd_debug_info_start),\
CAT(NAME,_bfd_debug_info_end),\
CAT(NAME,_bfd_debug_info_accumulate)
#define COFF_SWAP_TABLE coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
#define COFF_SWAP_TABLE \
coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \
coff_swap_aux_out, coff_swap_sym_out, \
coff_swap_lineno_out, coff_swap_reloc_out, \
coff_swap_filehdr_out, coff_swap_aouthdr_out, \
coff_swap_scnhdr_out
/* User program access to BFD facilities */

View File

@ -162,6 +162,7 @@ $};
#include "sysdep.h"
#include "libbfd.h"
#undef strerror
extern char *strerror();
@ -196,6 +197,7 @@ char *bfd_errmsgs[] = { "No error",
"File format is ambiguous",
"Section has no contents",
"Nonrepresentable section on output",
"Symbol needs debug section which does not exist",
"#<Invalid error code>"
};
@ -418,6 +420,27 @@ bfd_get_mtime (abfd)
#define bfd_set_arch_mach(abfd, arch, mach)\
BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
#define bfd_coff_swap_reloc_out(abfd, i, o) \
BFD_SEND (abfd, _bfd_coff_swap_reloc_out, (abfd, i, o))
#define bfd_coff_swap_lineno_out(abfd, i, o) \
BFD_SEND (abfd, _bfd_coff_swap_lineno_out, (abfd, i, o))
#define bfd_coff_swap_aux_out(abfd, i, t,c,o) \
BFD_SEND (abfd, _bfd_coff_swap_aux_out, (abfd, i,t,c, o))
#define bfd_coff_swap_sym_out(abfd, i,o) \
BFD_SEND (abfd, _bfd_coff_swap_sym_out, (abfd, i, o))
#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
BFD_SEND (abfd, _bfd_coff_swap_scnhdr_out, (abfd, i, o))
#define bfd_coff_swap_filehdr_out(abfd, i,o) \
BFD_SEND (abfd, _bfd_coff_swap_filehdr_out, (abfd, i, o))
#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o))
*-
*/

File diff suppressed because it is too large Load Diff

View File

@ -111,6 +111,12 @@ sony) bfd_target=news ;;
intel) bfd_target=${target_cpu}-coff ;;
cbm) bfd_target=${target_cpu}-elf ;;
ibm) my_host=rs6000
case "${target_cpu}" in
rs6000) bfd_target=rs6000 ;;
esac
;;
amd)
case "${target_os}" in
ebmon) bfd_target=a29k-coff ;;

View File

@ -34,20 +34,19 @@ the list.
* section prototypes::
@end menu
@node Section Input, Section Output,,Sections
@comment node-name, next, previous, up
@node Section Input, Section Output, Sections, Sections
@subsection Section Input
When a BFD is opened for reading, the section structures are created
and attatched to the BFD.
and attached to the BFD.
Each section has a name which describes the section in the outside
world - for example, @code{a.out} would contain at least three
sections, called @code{.text}, @code{.data} and @code{.bss}.
Sometimes a BFD will contain more than the 'natural' number of
sections. A back end may attatch other sections containing constructor
sections. A back end may attach other sections containing constructor
data, or an application may add a section (using bfd_make_section) to
the sections attatched to an already open BFD. For example, the linker
the sections attached to an already open BFD. For example, the linker
creates a supernumary section @code{COMMON} for each input file's BFD
to hold information about common storage.
@ -60,17 +59,17 @@ file doesn't contain raw data in sections, but data and relocation
expressions intermixed, so the data area has to be parsed to get out
the data and relocations.
@node Section Output,typedef asection,Section Input,Sections
@node Section Output, typedef asection, Section Input, Sections
@subsection Section Output
To write a new object style BFD, the various sections to be written
have to be created. They are attatched to the BFD in the same way as
have to be created. They are attached to the BFD in the same way as
input sections, data is written to the sections using
@code{bfd_set_section_contents}.
The linker uses the fields @code{output_section} and
@code{output_offset} to create an output file.
The data to be written comes from input sections attatched to the
The data to be written comes from input sections attached to the
output sections. The output section structure can be considered a
filter for the input section, the output section determines the vma of
the output data and the name, but the input section determines the
@ -97,13 +96,13 @@ subsections, "A" at offset 0x0 (ie at vma 0x100) and "B" at offset
*/
#include "sysdep.h"
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
/*doc*
@node typedef asection,section prototypes,Section Output,Sections
@node typedef asection, section prototypes, Section Output, Sections
@subsection typedef asection
*/
@ -171,7 +170,7 @@ The section contains constructor information. This section type is
used by the linker to create lists of constructors and destructors
used by @code{g++}. When a back end sees a symbol which should be used
in a constructor list, it creates a new section for the type of name
(eg @code{__CTOR_LIST__}), attatches the symbol to it and builds a
(eg @code{__CTOR_LIST__}), attaches the symbol to it and builds a
relocation. To build the lists of constructors, all the linker has to
to is catenate all the sections called @code{__CTOR_LIST__} and
relocte the data contained within - exactly the operations it would
@ -297,7 +296,7 @@ $} asection ;
*/
/*doc*
@node section prototypes,Section,typedef section,Sections
@node section prototypes, , typedef asection, Sections
@subsection section prototypes
*/
@ -322,10 +321,10 @@ DEFUN(bfd_get_section_by_name,(abfd, name),
/*proto* bfd_make_section
This function creates a new empty section called @var{name} and attatches it
This function creates a new empty section called @var{name} and attaches it
to the end of the chain of sections for the BFD supplied. An attempt to
create a section with a name which is already in use, returns the old
section by that name instead.
create a section with a name which is already in use, returns NULL without
changing the section chain.
Possible errors are:
@table @code
@ -355,7 +354,7 @@ DEFUN(bfd_make_section,(abfd, name),
}
while (sect) {
if (!strcmp(sect->name, name)) return sect;
if (!strcmp(sect->name, name)) return NULL;
prev = &sect->next;
sect = sect->next;
}
@ -418,7 +417,7 @@ DEFUN(bfd_set_section_flags,(abfd, section, flags),
/*proto* bfd_map_over_sections
Calls the provided function @var{func} for each section attatched to
Calls the provided function @var{func} for each section attached to
the BFD @var{abfd}, passing @var{obj} as an argument. The function
will be called as if by

View File

@ -341,6 +341,7 @@ extern bfd_target i386coff_vec;
extern bfd_target i386aout_vec;
extern bfd_target a29kcoff_big_vec;
extern bfd_target trad_core_vec;
extern bfd_target rs6000coff_vec;
#ifdef SELECT_VECS
@ -387,6 +388,7 @@ extern bfd_target DEFAULT_VECTOR;
#define I386COFF_VEC i386coff_vec
#define I386AOUT_VEC i386aout_vec
#define A29KCOFF_BIG_VEC a29kcoff_big_vec
#define RS6000COFF_VEC rs6000coff_vec
#endif
bfd_target *target_vector[] = {
@ -473,6 +475,10 @@ bfd_target *target_vector[] = {
&trad_core_vec,
#endif
#ifdef RS6000COFF_VEC
&RS6000COFF_VEC,
#endif
NULL, /* end of list marker */
};