From: Steve Chamberlain Date: Thu, 22 Aug 1991 19:56:14 +0000 (+0000) Subject: Initial revision X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=80d29884b8b36ca12dcae2bd744d74ba7c749e42;p=deliverable%2Fbinutils-gdb.git Initial revision --- diff --git a/bfd/doc/Makefile b/bfd/doc/Makefile new file mode 100755 index 0000000000..3cb3f47972 --- /dev/null +++ b/bfd/doc/Makefile @@ -0,0 +1,56 @@ +.SUFFIXES: .texi .o .c .h .p .ip +VPATH=.. +.c.texi: + scanit $< $@ + +.h.texi: + scanit $< $@ + +.c.p: + scanph $< $@ + +.h.p: + scanph $< $@ + +.c.ip: + scanph -i $< $@ + + +DOCFILES = syms.texi bfd.texi cache.texi \ + format.texi section.texi archive.texi \ + core.texi libbfd.texi archures.texi \ + reloc.texi opncls.texi targets.texi \ + aoutx.texi coffcode.texi cache.texi + +PROTOS = opncls.p archures.p libbfd.p \ + section.p syms.p bfd.p \ + archive.p reloc.p targets.p \ + format.p coffcode.p core.p + +IPROTOS = cache.ip libbfd.ip reloc.ip + +docs: $(DOCFILES) + +protos: $(PROTOS) $(IPROTOS) + sed -f intobfd bfd-in.h > bfd.h + sed -f tolibbfd libbfd-in.h > libbfd.h + sed -f tolibcoff libcoff-in.h > libcoff.h + + + +clean: + rm -f $(PROTOS) *.p *.ip *.h bfd.?? $(DOCFILES) bfd.dvi bfd.ps *~* *# bfd.??? + +bfd.info: $(DOCFILES) bfd.texinfo + makeinfo +no-validate bfd.texinfo + +bfd.dvi: $(DOCFILES) bfd.texinfo + tex bfd.texinfo + texindex bfd.?? + tex bfd.texinfo + +bfd.ps: bfd.dvi + dvips bfd -o + +quickdoc: $(DSRC) docs + tex bfd.texinfo diff --git a/bfd/doc/awkscan b/bfd/doc/awkscan new file mode 100755 index 0000000000..69b0ceaa3b --- /dev/null +++ b/bfd/doc/awkscan @@ -0,0 +1,12 @@ +# NOTE: BEGIN pattern gives errors if other than 1st line; +# END ditto if other than last. +BEGIN { print "@c ------------------------------START TEXT FROM " FILENAME } +# +# Keep /*doc* blocks (terminated by either */ or *-*/) +/^\/\*doc\*/,/^\*\/|^\*-\*\// +# +# Also keep two kinds of /*proto blocks +/^\/\*proto\*/,/^\*\/|^\*-\*\// +/^\/\*proto-internal\*/,/^\*\/|^\*-\*\// +# +END { print "@c ------------------------------END TEXT FROM " FILENAME } diff --git a/bfd/doc/awkscan-ip b/bfd/doc/awkscan-ip new file mode 100755 index 0000000000..73bd61fa95 --- /dev/null +++ b/bfd/doc/awkscan-ip @@ -0,0 +1,8 @@ +# Awk filter, 1st filter for BFD internal prototype file extraction +# +# keep /*proto-internal blocks +/^\/\*proto-internal\*/,/^\*\/|^\*-\*\// +# +# Apparent bug in sed can discard last line in some situations; therefore +# make last line harmless. +END { print "\n" } diff --git a/bfd/doc/awkscan-p b/bfd/doc/awkscan-p new file mode 100755 index 0000000000..c7fe79fb34 --- /dev/null +++ b/bfd/doc/awkscan-p @@ -0,0 +1,8 @@ +# Awk filter, 1st filter for BFD prototype file extraction +# +# keep /*proto blocks +/^\/\*proto\*/,/^\*\/|^\*-\*\// +# +# Apparent bug in sed can discard last line in some situations; therefore +# make last line harmless. +END { print "\n" } diff --git a/bfd/doc/bfd.texinfo b/bfd/doc/bfd.texinfo new file mode 100644 index 0000000000..d8ce6f501a --- /dev/null +++ b/bfd/doc/bfd.texinfo @@ -0,0 +1,430 @@ +\input texinfo +@setfilename bfdinfo +@c $Id$ +@synindex ky cp +@ifinfo +This file documents the BFD library. + +Copyright (C) 1991 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, subject to the terms +of the GNU General Public License, which includes the provision that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end ifinfo +@iftex +@c@finalout +@setchapternewpage on +@c@setchapternewpage odd +@settitle LIB BFD, the Binary File Descriptor Library +@titlepage +@title{libbfd} +@subtitle{The Binary File Descriptor Library} +@sp 1 +@subtitle First Edition---BFD version < 2.0 +@subtitle April 1991 +@author {Steve Chamberlain} +@author {Cygnus Support} +@page + +@tex +\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$ +\xdef\manvers{\$Revision$} % For use in headers, footers too +{\parskip=0pt +\hfill Cygnus Support\par +\hfill steve\@cygnus.com\par +\hfill {\it BFD}, \manvers\par +\hfill \TeX{}info \texinfoversion\par +} +\global\parindent=0pt % Steve likes it this way +@end tex + +@vskip 0pt plus 1filll +Copyright @copyright{} 1991 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, subject to the terms +of the GNU General Public License, which includes the provision that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end titlepage +@end iftex + +@node Top, Overview, (dir), (dir) +@ifinfo +This file documents the binary file descriptor library libbfd. +@end ifinfo + +@menu +* Overview:: Overview of BFD +* History:: History of BFD +* Backends:: Backends +* Porting:: Porting +* Future:: Future +* Index:: Index + +BFD body: +* Memory usage:: +* Sections:: +* Symbols:: +* Archives:: +* Formats:: +* Relocations:: +* Core Files:: +* Targets:: +* Architecturs:: +* Opening and Closing:: +* Internal:: +* File Caching:: + +BFD backends: +* a.out backends:: +* coff backends:: +@end menu + +@node Overview, History, Top, Top +@chapter Introduction +@cindex BFD +@cindex what is it? +Simply put, BFD is a package which allows applications to use the +same routines to operate on object files whatever the object file +format. A different object file format can be supported simply by +creating a new BFD back end and adding it to the library. + +BFD is split into two parts; the front end and the many back ends. +@itemize @bullet +@item The front end of BFD provides the interface to the user. It manages +memory, and various canonical data structures. The front end also +decides which back end to use, and when to call back end routines. +@item The back ends provide BFD its view of the real world. Each back +end provides a set of calls which the BFD front end can use to maintain +its canonical form. The back ends also may keep around information for +their own use, for greater efficiency. +@end itemize +@node History, How It Works, Overview,Top +@section History + +One spur behind BFD was the desire, on the part of the GNU 960 team at +Intel Oregon, for interoperability of applications on their COFF and +b.out file formats. Cygnus was providing GNU support for the team, and +Cygnus was contracted to provide the required functionality. + +The name came from a conversation David Wallace was having with Richard +Stallman about the library: RMS said that it would be quite hard---David +said ``BFD''. Stallman was right, but the name stuck. + +At the same time, Ready Systems wanted much the same thing, but for +different object file formats: IEEE-695, Oasys, Srecords, a.out and 68k +coff. + +BFD was first implemented by Steve Chamberlain (steve@@cygnus.com), +John Gilmore (gnu@@cygnus.com), K. Richard Pixley (rich@@cygnus.com) and +David Wallace (gumby@@cygnus.com) at Cygnus Support in Palo Alto, +California. + +@node How It Works, History, Porting, Top +@section How It Works + +To use the library, include @code{bfd.h} and link with @code{libbfd.a}. + +BFD provides a common interface to the parts of an object file +for a calling application. + +When an application sucessfully opens a target file (object, archive or +whatever) a pointer to an internal structure is returned. This pointer +points to a structure called @code{bfd}, described in +@code{include/bfd.h}. Our convention is to call this pointer a BFD, and +instances of it within code @code{abfd}. All operations on +the target object file are applied as methods to the BFD. The mapping is +defined within @code{bfd.h} in a set of macros, all beginning +@samp{bfd}_. + +For example, this sequence would do what you would probably expect: +return the number of sections in an object file attached to a BFD +@code{abfd}. + +@lisp +@cartouche +#include "bfd.h" + +unsigned int number_of_sections(abfd) +bfd *abfd; +@{ + return bfd_count_sections(abfd); +@} +@end cartouche +@end lisp + +The abstraction used within BFD is that an object file has a header, +a number of sections containing raw data, a set of relocations, and some +symbol information. Also, BFDs opened for archives have the +additional attribute of an index and contain subordinate BFDs. This approach is +fine for a.out and coff, but loses efficiency when applied to formats +such as S-records and IEEE-695. + +@section What BFD Version 1 Can Do +As different information from the the object files is required, +BFD reads from different sections of the file and processes them. +For example a very common operation for the linker is processing symbol +tables. Each BFD back end provides a routine for converting +between the object file's representation of symbols and an internal +canonical format. When the linker asks for the symbol table of an object +file, it calls through the memory pointer to the relevant BFD +back end routine which reads and converts the table into a canonical +form. The linker then operates upon the canonical form. When the link is +finished and the linker writes the output file's symbol table, +another BFD back end routine is called which takes the newly +created symbol table and converts it into the chosen output format. + +@node BFD information loss, Mechanism, BFD outline, BFD +@subsection Information Loss +@emph{Some information is lost due to the nature of the file format.} The output targets +supported by BFD do not provide identical facilities, and +information which may be described in one form has nowhere to go in +another format. One example of this is alignment information in +@code{b.out}. There is nowhere in an @code{a.out} format file to store +alignment information on the contained data, so when a file is linked +from @code{b.out} and an @code{a.out} image is produced, alignment +information will not propagate to the output file. (The linker will +still use the alignment information internally, so the link is performed +correctly). + +Another example is COFF section names. COFF files may contain an +unlimited number of sections, each one with a textual section name. If +the target of the link is a format which does not have many sections (eg +@code{a.out}) or has sections without names (eg the Oasys format) the +link cannot be done simply. You can circumvent this problem by +describing the desired input-to-output section mapping with the linker command +language. + +@emph{Information can be lost during canonicalization.} The BFD +internal canonical form of the external formats is not exhaustive; there +are structures in input formats for which there is no direct +representation internally. This means that the BFD back ends +cannot maintain all possible data richness through the transformation +between external to internal and back to external formats. + +This limitation is only a problem when an application reads one +format and writes another. Each BFD back end is responsible for +maintaining as much data as possible, and the internal BFD +canonical form has structures which are opaque to the BFD core, +and exported only to the back ends. When a file is read in one format, +the canonical form is generated for BFD and the application. At the +same time, the back end saves away any information which may otherwise +be lost. If the data is then written back in the same format, the back +end routine will be able to use the canonical form provided by the +BFD core as well as the information it prepared earlier. Since +there is a great deal of commonality between back ends, this mechanism +is very useful. There is no information lost for this reason when +linking or copying big endian COFF to little endian COFF, or @code{a.out} to +@code{b.out}. When a mixture of formats is linked, the information is +only lost from the files whose format differs from the destination. + +@node Mechanism, , BFD information loss, BFD +@subsection Mechanism +The greatest potential for loss of information is when there is least +overlap between the information provided by the source format, that +stored by the canonical format, and the information needed by the +destination format. A brief description of the canonical form may help +you appreciate what kinds of data you can count on preserving across +conversions. +@cindex BFD canonical format +@cindex internal object-file format + +@table @emph +@item files +Information on target machine architecture, particular implementation +and format type are stored on a per-file basis. Other information +includes a demand pageable bit and a write protected bit. Note that +information like Unix magic numbers is not stored here---only the magic +numbers' meaning, so a @code{ZMAGIC} file would have both the demand +pageable bit and the write protected text bit set. The byte order of +the target is stored on a per-file basis, so that big- and little-endian +object files may be linked with one another. +@c FIXME: generalize above from "link"? + +@item sections +Each section in the input file contains the name of the section, the +original address in the object file, various flags, size and alignment +information and pointers into other BFD data structures. + +@item symbols +Each symbol contains a pointer to the object file which originally +defined it, its name, its value, and various flag bits. When a +BFD back end reads in a symbol table, the back end relocates all +symbols to make them relative to the base of the section where they were +defined. This ensures that each symbol points to its containing +section. Each symbol also has a varying amount of hidden data to contain +private data for the BFD back end. Since the symbol points to the +original file, the private data format for that symbol is accessible. +@code{gld} can operate on a collection of symbols of wildly different +formats without problems. + +Normal global and simple local symbols are maintained on output, so an +output file (no matter its format) will retain symbols pointing to +functions and to global, static, and common variables. Some symbol +information is not worth retaining; in @code{a.out} type information is +stored in the symbol table as long symbol names. This information would +be useless to most COFF debuggers; the linker has command line switches +to allow users to throw it away. + +There is one word of type information within the symbol, so if the +format supports symbol type information within symbols (for example COFF, +IEEE, Oasys) and the type is simple enough to fit within one word +(nearly everything but aggregates) the information will be preserved. + +@item relocation level +Each canonical BFD relocation record contains a pointer to the symbol to +relocate to, the offset of the data to relocate, the section the data +is in and a pointer to a relocation type descriptor. Relocation is +performed effectively by message passing through the relocation type +descriptor and symbol pointer. It allows relocations to be performed +on output data using a relocation method only available in one of the +input formats. For instance, Oasys provides a byte relocation format. +A relocation record requesting this relocation type would point +indirectly to a routine to perform this, so the relocation may be +performed on a byte being written to a COFF file, even though 68k COFF +has no such relocation type. + +@item line numbers +Object formats can contain, for debugging purposes, some form of mapping +between symbols, source line numbers, and addresses in the output file. +These addresses have to be relocated along with the symbol information. +Each symbol with an associated list of line number records points to the +first record of the list. The head of a line number list consists of a +pointer to the symbol, which allows divination of the address of the +function whose line number is being described. The rest of the list is +made up of pairs: offsets into the section and line numbers. Any format +which can simply derive this information can pass it successfully +between formats (COFF, IEEE and Oasys). +@end table + +@c FIXME: what is this line about? Do we want introductory remarks +@c FIXME... on back ends? commented out for now. +@c What is a backend +@node BFD front end, BFD back end, Mechanism, Top +@chapter BFD front end +@include bfd.texi + +@node Memory Usage, Sections, bfd, Top +@section Memory Usage +BFD keeps all its internal structures in obstacks. There is one obstack +per open BFD file, into which the current state is stored. When a BFD is +closed, the obstack is deleted, and so everything which has been +allocated by libbfd for the closing file will be thrown away. + +BFD will not free anything created by an application, but pointers into +@code{bfd} structures will be invalidated on a @code{bfd_close}; for example, +after a @code{bfd_close} the vector passed to +@code{bfd_canonicalize_symtab} will still be around, since it has been +allocated by the application, but the data that it pointed to will be +lost. + +The general rule is not to close a BFD until all operations dependent +upon data from the BFD have been completed, or all the data from within +the file has been copied. To help with the management of memory, there is a function +(@code{bfd_alloc_size}) which returns the number of bytes in obstacks +associated with the supplied BFD. This could be used to select the +greediest open BFD, close it to reclaim the memory, perform some +operation and reopen the BFD again, to get a fresh copy of the data structures. + +@node Sections,Symbols ,Memory Usage, Top +@include section.texi + +@node Symbols, Archives ,Sections, To +@include syms.texi + +@node Archives, Formats, Symbols, Top +@include archive.texi + +@node Formats, Relocations, Archives, Top +@include format.texi + +@node Relocations, Core Files,Formats, Top +@include reloc.texi + +@node Core Files, Targets, Relocations, Top +@include core.texi + +@node Targets, Architectures, Core Files, Top +@include targets.texi + +@node Architectures, Opening and Closing, Targets, Top +@include archures.texi + +@node Opening and Closing, Internal, Architectures, Top +@include opncls.texi + +@node Internal, File Caching, Opening and Closing, Top +@include libbfd.texi + +@node File Caching, Top, Internal, Top +@include cache.texi + +@chapter BFD back end +@node BFD back end, ,BFD front end, Top +@menu +* What to put where +* a.out backends:: +* coff backends:: +* oasys backend:: +* ieee backend:: +* srecord backend:: +@end menu +@node What to Put Where, aout backends, BFD back end, BFD back end +All of BFD lives in one directory. + +@node aout backends, coff backends, What to Put Where, BFD back end +@include aoutx.texi + +@node coff backends, oasys backends, aout backends, BFD back end +@include coffcode.texi + +@node Index, , BFD, Top +@unnumbered Function Index +@printindex fn +@unnumbered Index +@printindex cp + +@tex +% I think something like @colophon should be in texinfo. In the +% meantime: +\long\def\colophon{\hbox to0pt{}\vfill +\centerline{The body of this manual is set in} +\centerline{\fontname\tenrm,} +\centerline{with headings in {\bf\fontname\tenbf}} +\centerline{and examples in {\tt\fontname\tentt}.} +\centerline{{\it\fontname\tenit\/} and} +\centerline{{\sl\fontname\tensl\/}} +\centerline{are used for emphasis.}\vfill} +\page\colophon +% Blame: pesch@cygnus.com, 28mar91. +@end tex + + +@contents +@bye + + diff --git a/bfd/doc/bfdinfo b/bfd/doc/bfdinfo new file mode 100755 index 0000000000..5bb06ff489 --- /dev/null +++ b/bfd/doc/bfdinfo @@ -0,0 +1,1281 @@ +Info file bfdinfo, produced by Makeinfo, -*- Text -*- from input file +bfd.texinfo. + + This file documents the BFD library. + + Copyright (C) 1991 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, subject to the +terms of the GNU General Public License, which includes the provision +that the entire resulting derived work is distributed under the terms +of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions. + + +File: bfdinfo, Node: Top, Next: Overview, Prev: (dir), Up: (dir) + + This file documents the binary file descriptor library libbfd. + +* Menu: + +* Overview:: Overview of BFD +* History:: History of BFD +* Backends:: Backends +* Porting:: Porting +* Future:: Future +* Index:: Index + +BFD body: +* Memory usage:: +* Sections:: +* Symbols:: +* Archives:: +* Formats:: +* Relocations:: +* Core Files:: +* Targets:: +* Architecturs:: +* Opening and Closing:: +* Internal:: +* File Caching:: + +BFD backends: +* a.out backends:: +* coff backends:: + + +File: bfdinfo, Node: Overview, Next: History, Prev: Top, Up: Top + +Introduction +************ + + Simply put, BFD is a package which allows applications to use the +same routines to operate on object files whatever the object file +format. A different object file format can be supported simply by +creating a new BFD back end and adding it to the library. + + BFD is split into two parts; the front end and the many back ends. + + * memory, and various canonical data structures. The front end also + decides which back end to use, and when to call back end routines. + + * end provides a set of calls which the BFD front end can use to + maintain its canonical form. The back ends also may keep around + information for their own use, for greater efficiency. + + +File: bfdinfo, Node: History, Next: How It Works, Prev: Overview, Up: Top + +History +======= + + One spur behind BFD was the desire, on the part of the GNU 960 team +at Intel Oregon, for interoperability of applications on their COFF and +b.out file formats. Cygnus was providing GNU support for the team, and +Cygnus was contracted to provide the required functionality. + + The name came from a conversation David Wallace was having with +Richard Stallman about the library: RMS said that it would be quite +hard--David said "BFD". Stallman was right, but the name stuck. + + At the same time, Ready Systems wanted much the same thing, but for +different object file formats: IEEE-695, Oasys, Srecords, a.out and 68k +coff. + + BFD was first implemented by Steve Chamberlain (steve@cygnus.com), +John Gilmore (gnu@cygnus.com), K. Richard Pixley (rich@cygnus.com) and +David Wallace (gumby@cygnus.com) at Cygnus Support in Palo Alto, +California. + + +File: bfdinfo, Node: How It Works, Next: History, Prev: Porting, Up: Top + +How It Works +============ + + To use the library, include `bfd.h' and link with `libbfd.a'. + + BFD provides a common interface to the parts of an object file for +a calling application. + + When an application sucessfully opens a target file (object, +archive or whatever) a pointer to an internal structure is returned. +This pointer points to a structure called `bfd', described in +`include/bfd.h'. Our convention is to call this pointer a BFD, and +instances of it within code `abfd'. All operations on the target +object file are applied as methods to the BFD. The mapping is defined +within `bfd.h' in a set of macros, all beginning `bfd'_. + + For example, this sequence would do what you would probably expect: +return the number of sections in an object file attached to a BFD +`abfd'. + + + #include "bfd.h" + + unsigned int number_of_sections(abfd) + bfd *abfd; + { + return bfd_count_sections(abfd); + } + + lisp + + The abstraction used within BFD is that an object file has a header, +a number of sections containing raw data, a set of relocations, and +some symbol information. Also, BFDs opened for archives have the +additional attribute of an index and contain subordinate BFDs. This +approach is fine for a.out and coff, but loses efficiency when applied +to formats such as S-records and IEEE-695. + +What BFD Version 1 Can Do +========================= + + As different information from the the object files is required, BFD +reads from different sections of the file and processes them. For +example a very common operation for the linker is processing symbol +tables. Each BFD back end provides a routine for converting between +the object file's representation of symbols and an internal canonical +format. When the linker asks for the symbol table of an object file, +it calls through the memory pointer to the relevant BFD back end +routine which reads and converts the table into a canonical form. The +linker then operates upon the canonical form. When the link is +finished and the linker writes the output file's symbol table, another +BFD back end routine is called which takes the newly created symbol +table and converts it into the chosen output format. + + +File: bfdinfo, Node: BFD information loss, Next: Mechanism, Prev: BFD outline, Up: BFD + +Information Loss +---------------- + + *Some information is lost due to the nature of the file format.* +The output targets supported by BFD do not provide identical +facilities, and information which may be described in one form has +nowhere to go in another format. One example of this is alignment +information in `b.out'. There is nowhere in an `a.out' format file to +store alignment information on the contained data, so when a file is +linked from `b.out' and an `a.out' image is produced, alignment +information will not propagate to the output file. (The linker will +still use the alignment information internally, so the link is +performed correctly). + + Another example is COFF section names. COFF files may contain an +unlimited number of sections, each one with a textual section name. If +the target of the link is a format which does not have many sections +(eg `a.out') or has sections without names (eg the Oasys format) the +link cannot be done simply. You can circumvent this problem by +describing the desired input-to-output section mapping with the linker +command language. + + *Information can be lost during canonicalization.* The BFD internal +canonical form of the external formats is not exhaustive; there are +structures in input formats for which there is no direct +representation internally. This means that the BFD back ends cannot +maintain all possible data richness through the transformation between +external to internal and back to external formats. + + This limitation is only a problem when an application reads one +format and writes another. Each BFD back end is responsible for +maintaining as much data as possible, and the internal BFD canonical +form has structures which are opaque to the BFD core, and exported +only to the back ends. When a file is read in one format, the +canonical form is generated for BFD and the application. At the same +time, the back end saves away any information which may otherwise be +lost. If the data is then written back in the same format, the back +end routine will be able to use the canonical form provided by the BFD +core as well as the information it prepared earlier. Since there is a +great deal of commonality between back ends, this mechanism is very +useful. There is no information lost for this reason when linking or +copying big endian COFF to little endian COFF, or `a.out' to `b.out'. +When a mixture of formats is linked, the information is only lost from +the files whose format differs from the destination. + + +File: bfdinfo, Node: Mechanism, Prev: BFD information loss, Up: BFD + +Mechanism +--------- + + The greatest potential for loss of information is when there is +least overlap between the information provided by the source format, +that stored by the canonical format, and the information needed by the +destination format. A brief description of the canonical form may help +you appreciate what kinds of data you can count on preserving across +conversions. + +*files* + Information on target machine architecture, particular + implementation and format type are stored on a per-file basis. + Other information includes a demand pageable bit and a write + protected bit. Note that information like Unix magic numbers is + not stored here--only the magic numbers' meaning, so a `ZMAGIC' + file would have both the demand pageable bit and the write + protected text bit set. The byte order of the target is stored + on a per-file basis, so that big- and little-endian object files + may be linked with one another. + +*sections* + Each section in the input file contains the name of the section, + the original address in the object file, various flags, size and + alignment information and pointers into other BFD data structures. + +*symbols* + Each symbol contains a pointer to the object file which originally + defined it, its name, its value, and various flag bits. When a + BFD back end reads in a symbol table, the back end relocates all + symbols to make them relative to the base of the section where + they were defined. This ensures that each symbol points to its + containing section. Each symbol also has a varying amount of + hidden data to contain private data for the BFD back end. Since + the symbol points to the original file, the private data format + for that symbol is accessible. `gld' can operate on a collection + of symbols of wildly different formats without problems. + + Normal global and simple local symbols are maintained on output, + so an output file (no matter its format) will retain symbols + pointing to functions and to global, static, and common + variables. Some symbol information is not worth retaining; in + `a.out' type information is stored in the symbol table as long + symbol names. This information would be useless to most COFF + debuggers; the linker has command line switches to allow users to + throw it away. + + There is one word of type information within the symbol, so if the + format supports symbol type information within symbols (for + example COFF, IEEE, Oasys) and the type is simple enough to fit + within one word (nearly everything but aggregates) the + information will be preserved. + +*relocation level* + Each canonical BFD relocation record contains a pointer to the + symbol to relocate to, the offset of the data to relocate, the + section the data is in and a pointer to a relocation type + descriptor. Relocation is performed effectively by message + passing through the relocation type descriptor and symbol + pointer. It allows relocations to be performed on output data + using a relocation method only available in one of the input + formats. For instance, Oasys provides a byte relocation format. + A relocation record requesting this relocation type would point + indirectly to a routine to perform this, so the relocation may be + performed on a byte being written to a COFF file, even though 68k + COFF has no such relocation type. + +*line numbers* + Object formats can contain, for debugging purposes, some form of + mapping between symbols, source line numbers, and addresses in + the output file. These addresses have to be relocated along with + the symbol information. Each symbol with an associated list of + line number records points to the first record of the list. The + head of a line number list consists of a pointer to the symbol, + which allows divination of the address of the function whose line + number is being described. The rest of the list is made up of + pairs: offsets into the section and line numbers. Any format + which can simply derive this information can pass it successfully + between formats (COFF, IEEE and Oasys). + + +File: bfdinfo, Node: BFD front end, Next: BFD back end, Prev: Mechanism, Up: Top + +BFD front end +************* + +typedef bfd +=========== + + Pointers to bfd structs are the cornerstone of any application using +`libbfd'. References though the BFD and to data in the BFD give the +entire BFD functionality. + + Here is the BFD struct itself. This contains the major data about +the file, and contains pointers to the rest of the data. + + struct _bfd + { + + The filename the application opened the BFD with. + + CONST char *filename; + + A pointer to the target jump table. + + struct bfd_target *xvec; + + To avoid dragging too many header files into every file that +includes `bfd.h', IOSTREAM has been declared as a "char *", and MTIME +as a "long". Their correct types, to which they are cast when used, +are "FILE *" and "time_t". + + The iostream is the result of an fopen on the filename. + + char *iostream; + + Is the file being cached *Note File Caching::. + + boolean cacheable; + + Marks whether there was a default target specified when the BFD was +opened. This is used to select what matching algorithm to use to chose +the back end. + + boolean target_defaulted; + + The caching routines use these to maintain a least-recently-used +list of BFDs (*note File Caching::.). + + struct _bfd *lru_prev, *lru_next; + + When a file is closed by the caching routines, BFD retains state +information on the file here: + + file_ptr where; + + and here: + + boolean opened_once; + + boolean mtime_set; + + File modified time + + long mtime; + + Reserved for an unimplemented file locking extension. + + int ifd; + + The format which belongs to the BFD. + + bfd_format format; + + The direction the BFD was opened with + + enum bfd_direction {no_direction = 0, + read_direction = 1, + write_direction = 2, + both_direction = 3} direction; + + Format_specific flags + + flagword flags; + + Currently my_archive is tested before adding origin to anything. I +believe that this can become always an add of origin, with origin set +to 0 for non archive files. + + file_ptr origin; + + Remember when output has begun, to stop strange things happening. + + boolean output_has_begun; + + Pointer to linked list of sections + + struct sec *sections; + + The number of sections + + unsigned int section_count; + + Stuff only useful for object files: The start address. + + bfd_vma start_address; + + Used for input and output + + unsigned int symcount; + + Symbol table for output BFD + + struct symbol_cache_entry **outsymbols; + + Architecture of object machine, eg m68k + + enum bfd_architecture obj_arch; + + Particular machine within arch, e.g. 68010 + + unsigned long obj_machine; + + Stuff only useful for archives: + + PTR arelt_data; + struct _bfd *my_archive; + struct _bfd *next; + struct _bfd *archive_head; + boolean has_armap; + + Used by the back end to hold private data. + + PTR tdata; + + Used by the application to hold private data + + PTR usrdata; + + Where all the allocated stuff under this BFD goes (*note Memory +Usage::.). + + struct obstack memory; + }; + +`bfd_set_start_address' +....................... + + Marks the entry point of an output BFD. Returns `true' on success, +`false' otherwise. + + boolean bfd_set_start_address(bfd *, bfd_vma); + +`bfd_get_mtime' +............... + + Return cached file modification time (e.g. as read from archive +header for archive members, or from file system if we have been called +before); else determine modify time, cache it, and return it. + + long bfd_get_mtime(bfd *); + +`stuff' +....... + + + + #define bfd_sizeof_headers(abfd, reloc) \ + BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) + + #define bfd_find_nearest_line(abfd, section, symbols, offset, filename_ptr, func, line_ptr) \ + BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, section, symbols, offset, filename_ptr, func, line_ptr)) + + #define bfd_debug_info_start(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) + + #define bfd_debug_info_end(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) + + #define bfd_debug_info_accumulate(abfd, section) \ + BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) + + #define bfd_stat_arch_elt(abfd, stat) \ + BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) + + #define bfd_coff_swap_aux_in(a,e,t,c,i) \ + BFD_SEND (a, _bfd_coff_swap_aux_in, (a,e,t,c,i)) + + #define bfd_coff_swap_sym_in(a,e,i) \ + BFD_SEND (a, _bfd_coff_swap_sym_in, (a,e,i)) + + #define bfd_coff_swap_lineno_in(a,e,i) \ + BFD_SEND ( a, _bfd_coff_swap_lineno_in, (a,e,i)) + + lisp + + +File: bfdinfo, Node: Memory Usage, Next: Sections, Prev: bfd, Up: Top + +Memory Usage +============ + + BFD keeps all its internal structures in obstacks. There is one +obstack per open BFD file, into which the current state is stored. +When a BFD is closed, the obstack is deleted, and so everything which +has been allocated by libbfd for the closing file will be thrown away. + + BFD will not free anything created by an application, but pointers +into `bfd' structures will be invalidated on a `bfd_close'; for +example, after a `bfd_close' the vector passed to +`bfd_canonicalize_symtab' will still be around, since it has been +allocated by the application, but the data that it pointed to will be +lost. + + The general rule is not to close a BFD until all operations +dependent upon data from the BFD have been completed, or all the data +from within the file has been copied. To help with the management of +memory, there is a function (`bfd_alloc_size') which returns the +number of bytes in obstacks associated with the supplied BFD. This +could be used to select the greediest open BFD, close it to reclaim +the memory, perform some operation and reopen the BFD again, to get a +fresh copy of the data structures. + + +File: bfdinfo, Node: Sections, Next: Symbols, Prev: Memory Usage, Up: Top + +Sections +======== + + Sections are supported in BFD in `section.c'. + + The raw data contained within a BFD is maintained through the +section abstraction. A single BFD may have any number of sections, +and keeps hold of them by pointing to the first, each one points to +the next in the list. + +* Menu: + +* Section Input:: +* Section Output:: +* typedef asection:: +* section prototypes:: + + +File: bfdinfo, Node: Section Input, Next: Section Output, Up: Sections + +Section Input +------------- + + When a BFD is opened for reading, the section structures are created +and attached to the BFD. + + Each section has a name which describes the section in the outside +world - for example, `a.out' would contain at least three sections, +called `.text', `.data' and `.bss'. + + Sometimes a BFD will contain more than the 'natural' number of +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 attached to an already open BFD. For example, the linker +creates a supernumary section `COMMON' for each input file's BFD to +hold information about common storage. + + The raw data is not necessarily read in at the same time as the +section descriptor is created. Some targets may leave the data in +place until a `bfd_get_section_contents' call is made. Other back ends +may read in all the data at once - For example; an S-record file has +to be read once to determine the size of the data. An IEEE-695 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. + + +File: bfdinfo, Node: Section Output, Next: typedef asection, Prev: Section Input, Up: Sections + +Section Output +-------------- + + To write a new object style BFD, the various sections to be written +have to be created. They are attached to the BFD in the same way as +input sections, data is written to the sections using +`bfd_set_section_contents'. + + The linker uses the fields `output_section' and `output_offset' to +create an output file. + + 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 +offset into the output section of the data to be written. + + Eg to create a section "O", starting at 0x100, 0x123 long, +containing two subsections, "A" at offset 0x0 (ie at vma 0x100) and +"B" at offset 0x20 (ie at vma 0x120) the structures would look like: + + + + section name "A" + output_offset 0x00 + size 0x20 + output_section -----------> section name "O" + | vma 0x100 + section name "B" | size 0x123 + output_offset 0x20 | + size 0x103 | + output_section --------| + + lisp + + +File: bfdinfo, Node: typedef asection, Next: section prototypes, Prev: Section Output, Up: Sections + +typedef asection +---------------- + + The shape of a section struct: + + typedef struct sec { + + The name of the section, the name isn't a copy, the pointer is the +same as that passed to bfd_make_section. + + CONST char *name; + + The next section in the list belonging to the BFD, or NULL. + + struct sec *next; + + The field flags contains attributes of the section. Some of these +flags are read in from the object file, and some are synthesized from +other information. + + flagword flags; + + #define SEC_NO_FLAGS 0x000 + + Tells the OS to allocate space for this section when loaded. This +would clear for a section containing debug information only. + + #define SEC_ALLOC 0x001 + + Tells the OS to load the section from the file when loading. This +would be clear for a .bss section + + #define SEC_LOAD 0x002 + + The section contains data still to be relocated, so there will be +some relocation information too. + + #define SEC_RELOC 0x004 + + Obsolete + + #define SEC_BALIGN 0x008 + + A signal to the OS that the section contains read only data. + + #define SEC_READONLY 0x010 + + The section contains code only. + + #define SEC_CODE 0x020 + + The section contains data only. + + #define SEC_DATA 0x040 + + The section will reside in ROM. + + #define SEC_ROM 0x080 + + The section contains constructor information. This section type is +used by the linker to create lists of constructors and destructors +used by `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 +`__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 `__CTOR_LIST__' and relocte the data +contained within - exactly the operations it would peform on standard +data. + + #define SEC_CONSTRUCTOR 0x100 + + The section is a constuctor, and should be placed at the end of the +.. + + #define SEC_CONSTRUCTOR_TEXT 0x1100 + + #define SEC_CONSTRUCTOR_DATA 0x2100 + + #define SEC_CONSTRUCTOR_BSS 0x3100 + + The section has contents - a bss section could be `SEC_ALLOC' | +`SEC_HAS_CONTENTS', a debug section could be `SEC_HAS_CONTENTS' + + #define SEC_HAS_CONTENTS 0x200 + + An instruction to the linker not to output sections containing this +flag even if they have information which would normally be written. + + #define SEC_NEVER_LOAD 0x400 + + The base address of the section in the address space of the target. + + bfd_vma vma; + + The size of the section in bytes of the loaded section. This +contains a value even if the section has no contents (eg, the size of +`.bss'). + + bfd_size_type size; + + If this section is going to be output, then this value is the +offset into the output section of the first byte in the input section. +Eg, if this was going to start at the 100th byte in the output +section, this value would be 100. + + bfd_vma output_offset; + + The output section through which to map on output. + + struct sec *output_section; + + The alignment requirement of the section, as an exponent - eg 3 +aligns to 2^3 (or 8) + + unsigned int alignment_power; + + If an input section, a pointer to a vector of relocation records for +the data in this section. + + struct reloc_cache_entry *relocation; + + If an output section, a pointer to a vector of pointers to +relocation records for the data in this section. + + struct reloc_cache_entry **orelocation; + + The number of relocation records in one of the above + + unsigned reloc_count; + + Which section is it 0..nth + + int index; + + Information below is back end specific - and not always used or +updated + + File position of section data + + file_ptr filepos; + + File position of relocation info + + file_ptr rel_filepos; + + File position of line data + + file_ptr line_filepos; + + Pointer to data for applications + + PTR userdata; + + struct lang_output_section *otheruserdata; + + Attached line number information + + alent *lineno; + + Number of line number records + + unsigned int lineno_count; + + When a section is being output, this value changes as more +linenumbers are written out + + file_ptr moving_line_filepos; + + what the section number is in the target world + + unsigned int target_index; + + PTR used_by_bfd; + + If this is a constructor section then here is a list of the +relocations created to relocate items within it. + + struct relent_chain *constructor_chain; + + The BFD which owns the section. + + bfd *owner; + + } asection ; + + +File: bfdinfo, Node: section prototypes, Next: Section, Prev: typedef section, Up: Sections + +section prototypes +------------------ + +`bfd_get_section_by_name' +......................... + + Runs through the provided ABFD and returns the `asection' who's +name matches that provided, otherwise NULL. *Note Sections::, for more +information. + + asection * bfd_get_section_by_name(bfd *abfd, CONST char *name); + +`bfd_make_section' +.................. + + This function creates a new empty section called 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. + + Possible errors are: + +`invalid_operation' + If output has already started for this BFD. + +`no_memory' + If obstack alloc fails. + + asection * bfd_make_section(bfd *, CONST char *name); + +`bfd_set_section_flags' +....................... + + Attempts to set the attributes of the section named in the BFD +supplied to the value. Returns true on success, false on error. +Possible error returns are: + +`invalid operation' + The section cannot have one or more of the attributes requested. + For example, a .bss section in `a.out' may not have the + `SEC_HAS_CONTENTS' field set. + + boolean bfd_set_section_flags(bfd *, asection *, flagword); + +`bfd_map_over_sections' +....................... + + Calls the provided function FUNC for each section attached to the +BFD ABFD, passing OBJ as an argument. The function will be called as +if by + + func(abfd, the_section, obj); + + void bfd_map_over_sections(bfd *abfd, void (*func)(), PTR obj); + + This is the prefered method for iterating over sections, an +alternative would be to use a loop: + + section *p; + for (p = abfd->sections; p != NULL; p = p->next) + func(abfd, p, ...) + +`bfd_set_section_size' +...................... + + Sets SECTION to the size VAL. If the operation is ok, then `true' +is returned, else `false'. + + Possible error returns: + +`invalid_operation' + Writing has started to the BFD, so setting the size is invalid + + boolean bfd_set_section_size(bfd *, asection *, bfd_size_type val); + +`bfd_set_section_contents' +.......................... + + Sets the contents of the section SECTION in BFD ABFD to the data +starting in memory at DATA. The data is written to the output section +starting at offset OFFSET for COUNT bytes. + + Normally `true' is returned, else `false'. Possible error returns +are: + +`no_contents' + The output section does not have the `SEC_HAS_CONTENTS' + attribute, so nothing can be written to it. + +`and some more too' + This routine is front end to the back end function +`_bfd_set_section_contents'. + + boolean bfd_set_section_contents(bfd *abfd, + asection *section, + PTR data, + file_ptr offset, + bfd_size_type count); + +`bfd_get_section_contents' +.......................... + + This function reads data from SECTION in BFD ABFD into memory +starting at LOCATION. The data is read at an offset of OFFSET from the +start of the input section, and is read for COUNT bytes. + + If the contents of a constuctor with the `SEC_CONSTUCTOR' flag set +are requested, then the LOCATION is filled with zeroes. + + If no errors occur, `true' is returned, else `false'. Possible +errors are: + +`unknown yet' + boolean bfd_get_section_contents(bfd *abfd, asection *section, PTR location, + file_ptr offset, bfd_size_type count); + + +File: bfdinfo, Node: Symbols, Next: Archives, Prev: Sections, Up: To + +Symbols +======= + + BFD trys to maintain as much symbol information as it can when it +moves information from file to file. BFD passes information to +applications though the `asymbol' structure. When the application +requests the symbol table, BFD reads the table in the native form and +translates parts of it into the internal format. To maintain more than +the infomation passed to applications some targets keep some +information 'behind the sceans', in a structure only the particular +back end knows about. For example, the coff back end keeps the +original symbol table structure as well as the canonical structure +when a BFD is read in. On output, the coff back end can reconstruct +the output symbol table so that no information is lost, even +information unique to coff which BFD doesn't know or understand. If a +coff symbol table was read, but was written through an a.out back end, +all the coff specific information would be lost. (.. until BFD 2 :). + + The symbol table of a BFD is not necessarily read in until a +canonicalize request is made. Then the BFD back end fills in a table +provided by the application with pointers to the canonical information. + + To output symbols, the application provides BFD with a table of +pointers to pointers to `asymbol's. This allows applications like the +linker to output a symbol as read, since the 'behind the sceens' +information will be still available. + +* Menu: + +* Reading Symbols:: +* Writing Symbols:: +* typedef asymbol:: +* symbol handling functions:: + + +File: bfdinfo, Node: Reading Symbols, Next: Writing Symbols, Prev: Symbols, Up: Symbols + +Reading Symbols +--------------- + + There are two stages to reading a symbol table from a BFD; +allocating storage, and the actual reading process. This is an excerpt +from an appliction which reads the symbol table: + + + unsigned int storage_needed; + asymbol **symbol_table; + unsigned int number_of_symbols; + unsigned int i; + + storage_needed = get_symtab_upper_bound (abfd); + + if (storage_needed == 0) { + return ; + } + symbol_table = (asymbol **) malloc (storage_needed); + ... + number_of_symbols = + bfd_canonicalize_symtab (abfd, symbol_table); + + for (i = 0; i < number_of_symbols; i++) { + process_symbol (symbol_table[i]); + } + + lisp + + All storage for the symbols themselves is in an obstack connected to +the BFD, and is freed when the BFD is closed. + + +File: bfdinfo, Node: Writing Symbols, Next: typedef asymbol, Prev: Reading Symbols, Up: Symbols + +Writing Symbols +--------------- + + Writing of a symbol table is automatic when a BFD open for writing +is closed. The application attaches a vector of pointers to pointers +to symbols to the BFD being written, and fills in the symbol count. +The close and cleanup code reads through the table provided and +performs all the necessary operations. The outputing code must always +be provided with an 'owned' symbol; one which has come from another +BFD, or one which has been created using `bfd_make_empty_symbol'. + + An example showing the creation of a symbol table with only one +element: + + + #include "bfd.h" + main() + { + bfd *abfd; + asymbol *ptrs[2]; + asymbol *new; + + abfd = bfd_openw("foo","a.out-sunos-big"); + bfd_set_format(abfd, bfd_object); + new = bfd_make_empty_symbol(abfd); + new->name = "dummy_symbol"; + new->section = (asection *)0; + new->flags = BSF_ABSOLUTE | BSF_GLOBAL; + new->value = 0x12345; + + ptrs[0] = new; + ptrs[1] = (asymbol *)0; + + bfd_set_symtab(abfd, ptrs, 1); + bfd_close(abfd); + } + + ./makesym + nm foo + 00012345 A dummy_symbol + + lisp + + Many formats cannot represent arbitary symbol information; for +instance the `a.out' object format does not allow an arbitary number +of sections. A symbol pointing to a section which is not one of +`.text', `.data' or `.bss' cannot be described. + + +File: bfdinfo, Node: typedef asymbol, Next: symbol handling functions, Prev: Writing Symbols, Up: Symbols + +typedef asymbol +--------------- + + An `asymbol' has the form: + + typedef struct symbol_cache_entry + { + + A pointer to the BFD which owns the symbol. This information is +necessary so that a back end can work out what additional (invisible to +the application writer) information is carried with the symbol. + + struct _bfd *the_bfd; + + The text of the symbol. The name is left alone, and not copied - the +application may not alter it. + + CONST char *name; + + The value of the symbol. + + symvalue value; + + Attributes of a symbol: + + #define BSF_NO_FLAGS 0x00 + + The symbol has local scope; `static' in `C'. The value is the +offset into the section of the data. + + #define BSF_LOCAL 0x01 + + The symbol has global scope; initialized data in `C'. The value is +the offset into the section of the data. + + #define BSF_GLOBAL 0x02 + + Obsolete + + #define BSF_IMPORT 0x04 + + The symbol has global scope, and is exported. The value is the +offset into the section of the data. + + #define BSF_EXPORT 0x08 + + The symbol is undefined. `extern' in `C'. The value has no meaning. + + #define BSF_UNDEFINED 0x10 + + The symbol is common, initialized to zero; default in `C'. The +value is the size of the object in bytes. + + #define BSF_FORT_COMM 0x20 + + A normal `C' symbol would be one of: `BSF_LOCAL', `BSF_FORT_COMM', +`BSF_UNDEFINED' or `BSF_EXPORT|BSD_GLOBAL' + + The symbol is a debugging record. The value has an arbitary meaning. + + #define BSF_DEBUGGING 0x40 + + The symbol has no section attached, any value is the actual value +and is not a relative offset to a section. + + #define BSF_ABSOLUTE 0x80 + + Used by the linker + + #define BSF_KEEP 0x10000 + #define BSF_KEEP_G 0x80000 + + Unused + + #define BSF_WEAK 0x100000 + #define BSF_CTOR 0x200000 + #define BSF_FAKE 0x400000 + + The symbol used to be a common symbol, but now it is allocated. + + #define BSF_OLD_COMMON 0x800000 + + The default value for common data. + + #define BFD_FORT_COMM_DEFAULT_VALUE 0 + + In some files the type of a symbol sometimes alters its location in +an output file - ie in coff a `ISFCN' symbol which is also `C_EXT' +symbol appears where it was declared and not at the end of a section. +This bit is set by the target BFD part to convey this information. + + #define BSF_NOT_AT_END 0x40000 + + Signal that the symbol is the label of constructor section. + + #define BSF_CONSTRUCTOR 0x1000000 + + Signal that the symbol is a warning symbol. If the symbol is a +warning symbol, then the value field (I know this is tacky) will point +to the asymbol which when referenced will cause the warning. + + #define BSF_WARNING 0x2000000 + + Signal that the symbol is indirect. The value of the symbol is a +pointer to an undefined asymbol which contains the name to use instead. + + #define BSF_INDIRECT 0x4000000 + + flagword flags; + + A pointer to the section to which this symbol is relative, or 0 if +the symbol is absolute or undefined. Note that it is not sufficient to +set this location to 0 to mark a symbol as absolute - the flag +`BSF_ABSOLUTE' must be set also. + + struct sec *section; + + Back end special data. This is being phased out in favour of making +this a union. + + PTR udata; + } asymbol; + + +File: bfdinfo, Node: symbol handling functions, Next: Symbols, Prev: typedef asymbol, Up: Symbols + +Symbol Handling Functions +------------------------- + +`get_symtab_upper_bound' +........................ + + Returns the number of bytes required in a vector of pointers to +`asymbols' for all the symbols in the supplied BFD, including a +terminal NULL pointer. If there are no symbols in the BFD, then 0 is +returned. + + + #define get_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _get_symtab_upper_bound, (abfd)) + + lisp + +`bfd_canonicalize_symtab' +......................... + + Supplied a BFD and a pointer to an uninitialized vector of pointers. +This reads in the symbols from the BFD, and fills in the table with +pointers to the symbols, and a trailing NULL. The routine returns the +actual number of symbol pointers not including the NULL. + + + #define bfd_canonicalize_symtab(abfd, location) \ + BFD_SEND (abfd, _bfd_canonicalize_symtab,\ + (abfd, location)) + + lisp + +`bfd_set_symtab' +................ + + Provided a table of pointers to to symbols and a count, writes to +the output BFD the symbols when closed. + + boolean bfd_set_symtab(bfd *, asymbol **, unsigned int ); + +`bfd_print_symbol_vandf' +........................ + + Prints the value and flags of the symbol supplied to the stream +file. + + void bfd_print_symbol_vandf(PTR file, asymbol *symbol); + +`bfd_make_empty_symbol' +....................... + + This function creates a new `asymbol' structure for the BFD, and +returns a pointer to it. + + This routine is necessary, since each back end has private +information surrounding the `asymbol'. Building your own `asymbol' and +pointing to it will not create the private information, and will cause +problems later on. + + + #define bfd_make_empty_symbol(abfd) \ + BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) + + lisp + + +File: bfdinfo, Node: Archives, Next: Formats, Prev: Symbols, Up: Top + +Archives +======== + + Gumby, you promised to write this bit... + + Archives are supported in BFD in `archive.c'. + + An archive is represented internally just like another BFD, with a +pointer to a chain of contained BFDs. Archives can be created by +opening BFDs, linking them together and attaching them as children to +another BFD and then closing the parent BFD. + +`bfd_get_next_mapent' +..................... + + What this does + + symindex bfd_get_next_mapent(bfd *, symindex, carsym **); + +`bfd_set_archive_head' +...................... + + Used whilst processing archives. Sets the head of the chain of BFDs +contained in an archive to NEW_HEAD. (see chapter on archives) + + boolean bfd_set_archive_head(bfd *output, bfd *new_head); + +`bfd_get_elt_at_index' +...................... + + Return the sub bfd contained within the archive at archive index n. + + bfd * bfd_get_elt_at_index(bfd *, int); + +`bfd_openr_next_archived_file' +.............................. + + Initially provided a BFD containing an archive and NULL, opens a BFD +on the first contained element and returns that. Subsequent calls to +bfd_openr_next_archived_file should pass the archive and the previous +return value to return a created BFD to the next contained element. +NULL is returned when there are no more. + + bfd* bfd_openr_next_archived_file(bfd *archive, bfd *previous); + + +File: bfdinfo, Node: Formats, Next: Relocations, Prev: Archives, Up: Top + +File Formats +============ + + A format is a BFD concept of high level file contents. The formats +supported by BFD are: + +`bfd_object' + The BFD may contain data, symbols, relocations and debug info. + +`bfd_archive' + The \ No newline at end of file diff --git a/bfd/doc/blins-p b/bfd/doc/blins-p new file mode 100755 index 0000000000..858dcd7ecd --- /dev/null +++ b/bfd/doc/blins-p @@ -0,0 +1,8 @@ +# sed script for BFD header files +# Merge adjacent blank lines. Loop til no change. +:blin +/^$/,/^ *[^ ]*.*$/{ +/^$/N +s/^ *\n *$// +} +t blin diff --git a/bfd/doc/exfil1-p b/bfd/doc/exfil1-p new file mode 100755 index 0000000000..a57fc957ad --- /dev/null +++ b/bfd/doc/exfil1-p @@ -0,0 +1,5 @@ +# +# Locate and coalesce adjacent comments +/\*\/$/N +s/\*\/\n\/\*/\ +/ diff --git a/bfd/doc/exfil3-p b/bfd/doc/exfil3-p new file mode 100755 index 0000000000..c557a163ac --- /dev/null +++ b/bfd/doc/exfil3-p @@ -0,0 +1,16 @@ +# blank-line activity: +# Merge adjacent blank lines. Loop til no change. +:blin +/^$/,/^ *[^ ]*.*$/{ +/^$/N +s/^ *\n *$// +} +t blin +# +/^$/,/^ *[^ ]*.*$/{ +/^$/N +# Transpose +/^ *\n\*\/$/c\ +*\/\ + +} diff --git a/bfd/doc/exfilter b/bfd/doc/exfilter new file mode 100755 index 0000000000..7551607763 --- /dev/null +++ b/bfd/doc/exfilter @@ -0,0 +1,14 @@ +# SED script for preprocessing embedded doc from source (S. Chamberlain markup) +# Final pass; cleanup work is done here. +# +# Within examples, make '{' and '}' printable: +/^@lisp$/,/^@end lisp$/s/{/@{/ +/^@lisp$/,/^@end lisp$/s/}/@}/ +/^@example$/,/^@end example$/s/{/@{/ +/^@example$/,/^@end example$/s/}/@}/ +# +# Delete empty @findex and @subsubsection entries (resulting from *proto* +# with no further text on same line, in middle pass) +/^@findex $/d +/^@subsubsection @code{}/d +# diff --git a/bfd/doc/exfilter-p b/bfd/doc/exfilter-p new file mode 100755 index 0000000000..27a1d05a72 --- /dev/null +++ b/bfd/doc/exfilter-p @@ -0,0 +1,12 @@ +# SED script for preprocessing embedded headers from C source comments +# (S. Chamberlain markup) +# beginning of many passes of cleanup work +# +# Delete empty comment blocks +/^\/\*$/N +/^\/\*\n\*\/ *$/d +# +# Locate and coalesce adjacent comments +/\*\/$/N +s/\*\/\n\/\*/\ +/ diff --git a/bfd/doc/exfiltst b/bfd/doc/exfiltst new file mode 100755 index 0000000000..18bab5acfe --- /dev/null +++ b/bfd/doc/exfiltst @@ -0,0 +1,8 @@ +# Merge adjacent blank lines. Loop til no change. +:blin +/^$/,/^ *[^ ]*.*$/{ +/^$/N +s/^ *\n *$// +} +t blin + diff --git a/bfd/doc/exmerge b/bfd/doc/exmerge new file mode 100755 index 0000000000..dafa4244df --- /dev/null +++ b/bfd/doc/exmerge @@ -0,0 +1,4 @@ +# SED script for preprocessing embedded doc from source (S. Chamberlain markup) +# Locate and coalesce adjacent @example blocks +/^@end example/N +/^@end example\n@example$/d diff --git a/bfd/doc/intobfd b/bfd/doc/intobfd new file mode 100755 index 0000000000..b256f4bcca --- /dev/null +++ b/bfd/doc/intobfd @@ -0,0 +1,11 @@ +/\/\*:archive.c\*\//r archive.p +/\/\*:archures.c\*\//r archures.p +/\/\*:bfd.c\*\//r bfd.p +/\/\*:core.c\*\//r core.p +/\/\*:format.c\*\//r format.p +/\/\*:libbfd.c\*\//r libbfd.p +/\/\*:opncls.c\*\//r opncls.p +/\/\*:reloc.c\*\//r reloc.p +/\/\*:section.c\*\//r section.p +/\/\*:syms.c\*\//r syms.p +/\/\*:targets.c\*\//r targets.p diff --git a/bfd/doc/mergecom-p b/bfd/doc/mergecom-p new file mode 100755 index 0000000000..456478b7c4 --- /dev/null +++ b/bfd/doc/mergecom-p @@ -0,0 +1,5 @@ +# SED script for preprocessing embedded headers from C source comments +# Locate and coalesce adjacent comments +/\*\/$/N +s/\*\/\n\/\*/\ +/ diff --git a/bfd/doc/movecom-p b/bfd/doc/movecom-p new file mode 100755 index 0000000000..7ed04c7b11 --- /dev/null +++ b/bfd/doc/movecom-p @@ -0,0 +1,8 @@ +# sed script for BFD header files: +# Transpose +/^$/,/^ *[^ ]*.*$/{ +/^$/N +/^ *\n\*\/$/c\ +*\/\ + +} diff --git a/bfd/doc/scanit b/bfd/doc/scanit new file mode 100755 index 0000000000..4271bafcb2 --- /dev/null +++ b/bfd/doc/scanit @@ -0,0 +1,25 @@ +#!/bin/sh +# Script to coordinate parsing of S. Chamberlain source-embedded +# documentation markup language. + +# Four passes: +# 1) awk discards lines not intended for docn, and marks blocks of +# text with comments identifying source file; +# 2) first sed pass interprets Chamberlain markup; +# 3) second sed pass does cleanup that involves merging lines +# 4) third sed pass does remaining cleans up---making {} +# printable within examples, and eliminating empty index entries and +# headings. +#Third and second sed passes are separate because order of execution is hard +#to control otherwise, making one or another of the things involving @example +#inoperative. + +base=`echo $1 | cut -d '.' -f 1` +out=`echo $2 | cut -d '.' -f 1` + +awk -f awkscan $1 | \ +sed -f sedscript | \ +sed -f unPROTO | \ +sed -f exmerge | \ +sed -f exfilter >$out.texi + diff --git a/bfd/doc/scanph b/bfd/doc/scanph new file mode 100755 index 0000000000..4f36d684f7 --- /dev/null +++ b/bfd/doc/scanph @@ -0,0 +1,26 @@ +#!/bin/sh +# Script to coordinate parsing of S. Chamberlain source-embedded +# header-file markup language. + +# '-i' option means use *proto-internal* segments, else just *proto* +SFX=p +if [ $1 = "-i" ]; then + SFX=ip + shift +fi + +base=`echo $1 | cut -d '.' -f 1` +out=`echo $2 | cut -d '.' -f 1` + +# passes: +# 1) awk discards lines not intended for header, and marks blocks of +# text with comments identifying source file; +# 2) first sed pass interprets Chamberlain markup; +# 3) further sed passes clean up---merging adjacent comments etc. + +awk -f awkscan-$SFX $1 |\ +sed -f sedscript-p |\ +sed -f mergecom-p |\ +sed -f startcom-p |\ +sed -f blins-p |\ +sed -f movecom-p >$out.$SFX diff --git a/bfd/doc/sedscript b/bfd/doc/sedscript new file mode 100755 index 0000000000..e8e225daec --- /dev/null +++ b/bfd/doc/sedscript @@ -0,0 +1,85 @@ +# SED script for preprocessing embedded doc from source (S. Chamberlain markup) +# middle pass; most of the work is done here. +# +# First, get rid of /*doc* markers; they've done their job in the first pass. +/^\/\*doc\*/d +# +# /*proto* markers may be optionally followed by a *i-style subsubsec, findex +# entry. This will generate empty @findex and @subsubsection entries if +# the *proto* is on a line by itself; third pass removes them. +/^\/\*proto\*/s/^\/\*proto\* *\(.*\)$/@findex \1\ +@subsubsection @code{\1}/ +# +# /*proto-internal* is just like /*proto* from doc point of view. +/^\/\*proto-internal\*/s/^\/\*proto-internal\* *\(.*\)$/@findex \1\ +@subsubsection @code{\1}/ +# +# *i at beginning of line: rest of line is both a subsubsection heading +# and an entry in function index. +/^\*i/s/^\*i *\(.*\)$/@findex \1\ +@subsubsection @code{\1}/ +# +# Two alternative docn block ends, '*/' and '*-*/' on lines by themselves; +# replace by blank lines (for texinfo source readability). +/^\*\/$/c\ + +/^\*-\*\/$/c\ + +# {* and *} are standins for comment markers (originally embedded in .c +# comments)---turn into real comment markers: +s/{\*/\/\*/ +s/\*}/\*\// +# +# '*+++' and '*---' span a block of text that includes both example lines +# (marked by leading '$') and explanatory text (to be italicized). +# Italicize lines lacking '$': +/\*\+\+\+/,/\*---/s/^\([^$].*\)$/@i{\1}/ +# +# We don't need *+++ and *--- markers any more; kill them (trailing marker +# becomes blank line for readability) +/\*\+\+\+/d +/\*---/c\ + +# Any line beginning with '$' is made an example line; third pass later +# coalesces adjacent example blocks. *DO NOT* introduce extra space after +# @end example, so we can spot adjacent ones in third pass. +/^\$/i\ +@example +/^\$/a\ +@end example +# +# In any example line, turn '{' and '}' into '@{' and '@}' +###/^\$/s/{/@{/g +###/^\$/s/}/@}/g +# +# Now delete the '$' markers themselves: +/^\$/s/\$// +# +# *+ and *- delimit large examples to be enclosed in cartouches. +/^\*\+$/c\ +@lisp\ +@cartouche +/^\*-$/c\ +@end cartouche\ +@end lisp\ + +# '*;' introduces an example which may have a single line or multiple lines; +# it extends until the next semicolon (which is also printed). +# One-line case: (do this first; else second line address for multi-line case +# will include random text til we happen to end a line in a doc comment with +# a semicolon) +/^\*;.*;$/{ +s/^\*;/@example\ +/ +s/;$/;\ +@end example\ +/ +} +# Multi-line case: +/^\*;/,/.*;$/{ +s/^\*;/@example\ +/ +s/;$/;\ +@end example\ +/ +} diff --git a/bfd/doc/sedscript-p b/bfd/doc/sedscript-p new file mode 100755 index 0000000000..1f24900b4c --- /dev/null +++ b/bfd/doc/sedscript-p @@ -0,0 +1,63 @@ +# SED script for preprocessing embedded headers from source +# (S. Chamberlain markup) +# middle pass; most of the work is done here. +# +# First, get rid of /*proto* markers; they've done their job in the first pass. +# (They remain comment-introducers) +/^\/\*proto\*/s/^\/\*proto\*/\/*/ +/^\/\*proto-internal\*/s/^\/\*proto-internal\*/\/*/ +# +# *-*/ is an alternative (older) comment-block end. Remap for uniformity: +s/^\*-\*\//\*\// +# +# {* and *} are standins for comment markers (originally embedded in .c +# comments)---turn into real comment markers: +s/{\*/\/\*/ +s/\*}/\*\// +# +# '*+++' and '*---' span a block of text that includes both header lines +# (marked by leading '$') and explanatory text (to be comments). +# No need to start comment at "*+++", or end it at "*---", since we're +# already in a *proto* comment block. Just delete. +/\*\+\+\+/d +/\*---/d +# +# Any line beginning with '$' is made a line of code in the header; +# stuff in between is comments, so *precede* each '$' line with +# END-comment, *follow* each '$' line with START-comment; third pass later +# eliminates empty comment blocks. +/^\$/i\ +*/ +/^\$/a\ +/* +# +# Now delete the '$' markers themselves: +/^\$/s/\$// +# +# *+ and *- delimit larger blocks of code, treated the same as '$' lines +/^\*\+$/c\ +*/ +/^\*-$/c\ +/* +# +# '*;' introduces code which may have a single line or multiple lines; +# it extends until the next semicolon (which is also printed). +# +# One-line case: (do this first; else second line address for multi-line case +# will include random text til we happen to end a line in a proto comment with +# a semicolon) +/^\*;.*;$/{ +s/^\*;/*\/\ +/ +s/;$/;\ +\/*\ +/ +} +# Multi-line case: +/^\*;/,/.*;$/{ +s/^\*;/*\/\ +/ +s/;$/;\ +\/*\ +/ +} diff --git a/bfd/doc/startcom-p b/bfd/doc/startcom-p new file mode 100755 index 0000000000..0748faddbf --- /dev/null +++ b/bfd/doc/startcom-p @@ -0,0 +1,12 @@ +# sed script for preprocessing BFD header files +# activity: +/^\/\*$/{ +N +# Delete empty comment blocks +/^\/\*\n\*\/ *$/d +# Transpose +s/^\/\*\n *$/\ +\/*/ +# merge on line by itself with following line +s/^\/\*\n\(.*\)/\/* \1/ +} diff --git a/bfd/doc/tolibbfd b/bfd/doc/tolibbfd new file mode 100755 index 0000000000..ef9531ef88 --- /dev/null +++ b/bfd/doc/tolibbfd @@ -0,0 +1,4 @@ +/---------------START FROM/,/---------------END FROM/d +/\/\*:libbfd.c\*\//r libbfd.ip +/\/\*:cache.c\*\//r cache.ip +/\/\*:reloc.c\*\//r reloc.ip diff --git a/bfd/doc/tolibcoff b/bfd/doc/tolibcoff new file mode 100755 index 0000000000..548c8baa59 --- /dev/null +++ b/bfd/doc/tolibcoff @@ -0,0 +1 @@ +/\/\*:coffcode.h\*\//r coffcode.p diff --git a/bfd/doc/unPROTO b/bfd/doc/unPROTO new file mode 100755 index 0000000000..a6f95207db --- /dev/null +++ b/bfd/doc/unPROTO @@ -0,0 +1,18 @@ +# +# The PROTO macro is a subterfuge to be compatible with both ANSI and K&R +# declaration syntax. It's not widely known, so for the docn just map the +# thing to ANSI declaration syntax. +# +# First, join up defns broken across multiple lines in source---but leave +# any linebreaks, to prettify our examples +:pbegn +/PROTO(.*, *$/N +s/\n/?/ +t pbegn +s/?/\ +/g +# Now actually do the PROTO interpretation. +# A PROTO invocation looks like +# PROTO( resulttype, function, (arglist)); +s/[ ]*PROTO(\(.*\),[\n ]*\(.*\),[\n ]*\((.*)\));/\1 \2\3;/ +