\input texinfo@setfilename ldint.info@c Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,@c 2003, 2007@c Free Software Foundation, Inc.@ifinfo@formatSTART-INFO-DIR-ENTRY* Ld-Internals: (ldint). The GNU linker internals.END-INFO-DIR-ENTRY@end format@end ifinfo@copyingThis file documents the internals of the GNU linker ld.Copyright @copyright{} 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2007Free Software Foundation, Inc.Contributed by Cygnus Support.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1 orany later version published by the Free Software Foundation; with theInvariant Sections being ``GNU General Public License'' and ``FundingFree Software'', the Front-Cover texts being (a) (see below), and withthe Back-Cover Texts being (b) (see below). A copy of the license isincluded in the section entitled ``GNU Free Documentation License''.(a) The FSF's Front-Cover Text is:A GNU Manual(b) The FSF's Back-Cover Text is:You have freedom to copy and modify this GNU Manual, like GNUsoftware. Copies published by the Free Software Foundation raisefunds for GNU development.@end copying@iftex@finalout@setchapternewpage off@settitle GNU Linker Internals@titlepage@title{A guide to the internals of the GNU linker}@author Per Bothner, Steve Chamberlain, Ian Lance Taylor, DJ Delorie@author Cygnus Support@page@tex\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$\xdef\manvers{2.10.91} % For use in headers, footers too{\parskip=0pt\hfill Cygnus Support\par\hfill \manvers\par\hfill \TeX{}info \texinfoversion\par}@end tex@vskip 0pt plus 1filllCopyright @copyright{} 1992, 93, 94, 95, 96, 97, 1998, 2000Free Software Foundation, Inc.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1or any later version published by the Free Software Foundation;with no Invariant Sections, with no Front-Cover Texts, and with noBack-Cover Texts. A copy of the license is included in thesection entitled "GNU Free Documentation License".@end titlepage@end iftex@node Top@topThis file documents the internals of the GNU linker @code{ld}. It is acollection of miscellaneous information with little form at this point.Mostly, it is a repository into which you can put information aboutGNU @code{ld} as you discover it (or as you design changes to @code{ld}).This document is distributed under the terms of the GNU FreeDocumentation License. A copy of the license is included in thesection entitled "GNU Free Documentation License".@menu* README:: The README File* Emulations:: How linker emulations are generated* Emulation Walkthrough:: A Walkthrough of a Typical Emulation* Architecture Specific:: Some Architecture Specific Notes* GNU Free Documentation License:: GNU Free Documentation License@end menu@node README@chapter The @file{README} FileCheck the @file{README} file; it often has useful information that does notappear anywhere else in the directory.@node Emulations@chapter How linker emulations are generatedEach linker target has an @dfn{emulation}. The emulation includes thedefault linker script, and certain emulations also modify certain typesof linker behaviour.Emulations are created during the build process by the shell script@file{genscripts.sh}.The @file{genscripts.sh} script starts by reading a file in the@file{emulparams} directory. This is a shell script which sets variousshell variables used by @file{genscripts.sh} and the other shell scriptsit invokes.The @file{genscripts.sh} script will invoke a shell script in the@file{scripttempl} directory in order to create default linker scriptswritten in the linker command language. The @file{scripttempl} scriptwill be invoked 5 (or, in some cases, 6) times, with differentassignments to shell variables, to create different default scripts.The choice of script is made based on the command line options.After creating the scripts, @file{genscripts.sh} will invoke yet anothershell script, this time in the @file{emultempl} directory. That shellscript will create the emulation source file, which contains C code.This C code permits the linker emulation to override various linkerbehaviours. Most targets use the generic emulation code, which is in@file{emultempl/generic.em}.To summarize, @file{genscripts.sh} reads three shell scripts: anemulation parameters script in the @file{emulparams} directory, a linkerscript generation script in the @file{scripttempl} directory, and anemulation source file generation script in the @file{emultempl}directory.For example, the Sun 4 linker sets up variables in@file{emulparams/sun4.sh}, creates linker scripts using@file{scripttempl/aout.sc}, and creates the emulation code using@file{emultempl/sunos.em}.Note that the linker can support several emulations simultaneously,depending upon how it is configured. An emulation can be selected withthe @code{-m} option. The @code{-V} option will list all supportedemulations.@menu* emulation parameters:: @file{emulparams} scripts* linker scripts:: @file{scripttempl} scripts* linker emulations:: @file{emultempl} scripts@end menu@node emulation parameters@section @file{emulparams} scriptsEach target selects a particular file in the @file{emulparams} directoryby setting the shell variable @code{targ_emul} in @file{configure.tgt}.This shell variable is used by the @file{configure} script to controlbuilding an emulation source file.Certain conventions are enforced. Suppose the @code{targ_emul} variableis set to @var{emul} in @file{configure.tgt}. The name of the emulationshell script will be @file{emulparams/@var{emul}.sh}. The@file{Makefile} must have a target named @file{e@var{emul}.c}; thistarget must depend upon @file{emulparams/@var{emul}.sh}, as well as theappropriate scripts in the @file{scripttempl} and @file{emultempl}directories. The @file{Makefile} target must invoke @code{GENSCRIPTS}with two arguments: @var{emul}, and the value of the make variable@code{tdir_@var{emul}}. The value of the latter variable will be set bythe @file{configure} script, and is used to set the default targetdirectory to search.By convention, the @file{emulparams/@var{emul}.sh} shell script shouldonly set shell variables. It may set shell variables which are to beinterpreted by the @file{scripttempl} and the @file{emultempl} scripts.Certain shell variables are interpreted directly by the@file{genscripts.sh} script.Here is a list of shell variables interpreted by @file{genscripts.sh},as well as some conventional shell variables interpreted by the@file{scripttempl} and @file{emultempl} scripts.@table @code@item SCRIPT_NAMEThis is the name of the @file{scripttempl} script to use. If@code{SCRIPT_NAME} is set to @var{script}, @file{genscripts.sh} will usethe script @file{scripttempl/@var{script}.sc}.@item TEMPLATE_NAMEThis is the name of the @file{emultempl} script to use. If@code{TEMPLATE_NAME} is set to @var{template}, @file{genscripts.sh} willuse the script @file{emultempl/@var{template}.em}. If this variable isnot set, the default value is @samp{generic}.@item GENERATE_SHLIB_SCRIPTIf this is set to a nonempty string, @file{genscripts.sh} will invokethe @file{scripttempl} script an extra time to create a shared libraryscript. @ref{linker scripts}.@item OUTPUT_FORMATThis is normally set to indicate the BFD output format use (e.g.,@samp{"a.out-sunos-big"}. The @file{scripttempl} script will normallyuse it in an @code{OUTPUT_FORMAT} expression in the linker script.@item ARCHThis is normally set to indicate the architecture to use (e.g.,@samp{sparc}). The @file{scripttempl} script will normally use it in an@code{OUTPUT_ARCH} expression in the linker script.@item ENTRYSome @file{scripttempl} scripts use this to set the entry address, in an@code{ENTRY} expression in the linker script.@item TEXT_START_ADDRSome @file{scripttempl} scripts use this to set the start address of the@samp{.text} section.@item SEGMENT_SIZEThe @file{genscripts.sh} script uses this to set the default value of@code{DATA_ALIGNMENT} when running the @file{scripttempl} script.@item TARGET_PAGE_SIZEIf @code{SEGMENT_SIZE} is not defined, the @file{genscripts.sh} scriptuses this to define it.@item ALIGNMENTSome @file{scripttempl} scripts set this to a number to pass to@code{ALIGN} to set the required alignment for the @code{end} symbol.@end table@node linker scripts@section @file{scripttempl} scriptsEach linker target uses a @file{scripttempl} script to generate thedefault linker scripts. The name of the @file{scripttempl} script isset by the @code{SCRIPT_NAME} variable in the @file{emulparams} script.If @code{SCRIPT_NAME} is set to @var{script}, @code{genscripts.sh} willinvoke @file{scripttempl/@var{script}.sc}.The @file{genscripts.sh} script will invoke the @file{scripttempl}script 5 to 9 times. Each time it will set the shell variable@code{LD_FLAG} to a different value. When the linker is run, theoptions used will direct it to select a particular script. (Scriptselection is controlled by the @code{get_script} emulation entry point;this describes the conventional behaviour).The @file{scripttempl} script should just write a linker script, writtenin the linker command language, to standard output. If the emulationname--the name of the @file{emulparams} file without the @file{.sc}extension--is @var{emul}, then the output will be directed to@file{ldscripts/@var{emul}.@var{extension}} in the build directory,where @var{extension} changes each time the @file{scripttempl} script isinvoked.Here is the list of values assigned to @code{LD_FLAG}.@table @code@item (empty)The script generated is used by default (when none of the followingcases apply). The output has an extension of @file{.x}.@item nThe script generated is used when the linker is invoked with the@code{-n} option. The output has an extension of @file{.xn}.@item NThe script generated is used when the linker is invoked with the@code{-N} option. The output has an extension of @file{.xbn}.@item rThe script generated is used when the linker is invoked with the@code{-r} option. The output has an extension of @file{.xr}.@item uThe script generated is used when the linker is invoked with the@code{-Ur} option. The output has an extension of @file{.xu}.@item sharedThe @file{scripttempl} script is only invoked with @code{LD_FLAG} set tothis value if @code{GENERATE_SHLIB_SCRIPT} is defined in the@file{emulparams} file. The @file{emultempl} script must arrange to usethis script at the appropriate time, normally when the linker is invokedwith the @code{-shared} option. The output has an extension of@file{.xs}.@item cThe @file{scripttempl} script is only invoked with @code{LD_FLAG} set tothis value if @code{GENERATE_COMBRELOC_SCRIPT} is defined in the@file{emulparams} file or if @code{SCRIPT_NAME} is @code{elf}. The@file{emultempl} script must arrange to use this script at the appropriatetime, normally when the linker is invoked with the @code{-z combreloc}option. The output has an extension of@file{.xc}.@item csharedThe @file{scripttempl} script is only invoked with @code{LD_FLAG} set tothis value if @code{GENERATE_COMBRELOC_SCRIPT} is defined in the@file{emulparams} file or if @code{SCRIPT_NAME} is @code{elf} and@code{GENERATE_SHLIB_SCRIPT} is defined in the @file{emulparams} file.The @file{emultempl} script must arrange to use this script at theappropriate time, normally when the linker is invoked with the @code{-shared-z combreloc} option. The output has an extension of @file{.xsc}.@item auto_importThe @file{scripttempl} script is only invoked with @code{LD_FLAG} set tothis value if @code{GENERATE_AUTO_IMPORT_SCRIPT} is defined in the@file{emulparams} file. The @file{emultempl} script must arrange touse this script at the appropriate time, normally when the linker isinvoked with the @code{--enable-auto-import} option. The output hasan extension of @file{.xa}.@end tableBesides the shell variables set by the @file{emulparams} script, and the@code{LD_FLAG} variable, the @file{genscripts.sh} script will setcertain variables for each run of the @file{scripttempl} script.@table @code@item RELOCATINGThis will be set to a non-empty string when the linker is doing a finalrelocation (e.g., all scripts other than @code{-r} and @code{-Ur}).@item CONSTRUCTINGThis will be set to a non-empty string when the linker is buildingglobal constructor and destructor tables (e.g., all scripts other than@code{-r}).@item DATA_ALIGNMENTThis will be set to an @code{ALIGN} expression when the output should bepage aligned, or to @samp{.} when generating the @code{-N} script.@item CREATE_SHLIBThis will be set to a non-empty string when generating a @code{-shared}script.@item COMBRELOCThis will be set to a non-empty string when generating @code{-z combreloc}scripts to a temporary file name which can be used during script generation.@end tableThe conventional way to write a @file{scripttempl} script is to firstset a few shell variables, and then write out a linker script using@code{cat} with a here document. The linker script will use variablesubstitutions, based on the above variables and those set in the@file{emulparams} script, to control its behaviour.When there are parts of the @file{scripttempl} script which should onlybe run when doing a final relocation, they should be enclosed within avariable substitution based on @code{RELOCATING}. For example, on manytargets special symbols such as @code{_end} should be defined when doinga final link. Naturally, those symbols should not be defined when doinga relocatable link using @code{-r}. The @file{scripttempl} scriptcould use a construct like this to define those symbols:@smallexample$@{RELOCATING+ _end = .;@}@end smallexampleThis will do the symbol assignment only if the @code{RELOCATING}variable is defined.The basic job of the linker script is to put the sections in the correctorder, and at the correct memory addresses. For some targets, thelinker script may have to do some other operations.For example, on most MIPS platforms, the linker is responsible fordefining the special symbol @code{_gp}, used to initialize the@code{$gp} register. It must be set to the start of the small datasection plus @code{0x8000}. Naturally, it should only be defined whendoing a final relocation. This will typically be done like this:@smallexample$@{RELOCATING+ _gp = ALIGN(16) + 0x8000;@}@end smallexampleThis line would appear just before the sections which compose the smalldata section (@samp{.sdata}, @samp{.sbss}). All those sections would becontiguous in memory.Many COFF systems build constructor tables in the linker script. Thecompiler will arrange to output the address of each global constructorin a @samp{.ctor} section, and the address of each global destructor ina @samp{.dtor} section (this is done by defining@code{ASM_OUTPUT_CONSTRUCTOR} and @code{ASM_OUTPUT_DESTRUCTOR} in the@code{gcc} configuration files). The @code{gcc} runtime supportroutines expect the constructor table to be named @code{__CTOR_LIST__}.They expect it to be a list of words, with the first word being thecount of the number of entries. There should be a trailing zero word.(Actually, the count may be -1 if the trailing word is present, and thetrailing word may be omitted if the count is correct, but, as the@code{gcc} behaviour has changed slightly over the years, it is safestto provide both). Here is a typical way that might be handled in a@file{scripttempl} file.@smallexample$@{CONSTRUCTING+ __CTOR_LIST__ = .;@}$@{CONSTRUCTING+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)@}$@{CONSTRUCTING+ *(.ctors)@}$@{CONSTRUCTING+ LONG(0)@}$@{CONSTRUCTING+ __CTOR_END__ = .;@}$@{CONSTRUCTING+ __DTOR_LIST__ = .;@}$@{CONSTRUCTING+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)@}$@{CONSTRUCTING+ *(.dtors)@}$@{CONSTRUCTING+ LONG(0)@}$@{CONSTRUCTING+ __DTOR_END__ = .;@}@end smallexampleThe use of @code{CONSTRUCTING} ensures that these linker script commandswill only appear when the linker is supposed to be building theconstructor and destructor tables. This example is written for a targetwhich uses 4 byte pointers.Embedded systems often need to set a stack address. This is normallybest done by using the @code{PROVIDE} construct with a default stackaddress. This permits the user to easily override the stack addressusing the @code{--defsym} option. Here is an example:@smallexample$@{RELOCATING+ PROVIDE (__stack = 0x80000000);@}@end smallexampleThe value of the symbol @code{__stack} would then be used in the startupcode to initialize the stack pointer.@node linker emulations@section @file{emultempl} scriptsEach linker target uses an @file{emultempl} script to generate theemulation code. The name of the @file{emultempl} script is set by the@code{TEMPLATE_NAME} variable in the @file{emulparams} script. If the@code{TEMPLATE_NAME} variable is not set, the default is@samp{generic}. If the value of @code{TEMPLATE_NAME} is @var{template},@file{genscripts.sh} will use @file{emultempl/@var{template}.em}.Most targets use the generic @file{emultempl} script,@file{emultempl/generic.em}. A different @file{emultempl} script isonly needed if the linker must support unusual actions, such as linkingagainst shared libraries.The @file{emultempl} script is normally written as a simple invocationof @code{cat} with a here document. The document will use a fewvariable substitutions. Typically each function names uses asubstitution involving @code{EMULATION_NAME}, for ease of debugging whenthe linker supports multiple emulations.Every function and variable in the emitted file should be static. Theonly globally visible object must be named@code{ld_@var{EMULATION_NAME}_emulation}, where @var{EMULATION_NAME} isthe name of the emulation set in @file{configure.tgt} (this is also thename of the @file{emulparams} file without the @file{.sh} extension).The @file{genscripts.sh} script will set the shell variable@code{EMULATION_NAME} before invoking the @file{emultempl} script.The @code{ld_@var{EMULATION_NAME}_emulation} variable must be a@code{struct ld_emulation_xfer_struct}, as defined in @file{ldemul.h}.It defines a set of function pointers which are invoked by the linker,as well as strings for the emulation name (normally set from the shellvariable @code{EMULATION_NAME} and the default BFD target name (normallyset from the shell variable @code{OUTPUT_FORMAT} which is normally setby the @file{emulparams} file).The @file{genscripts.sh} script will set the shell variable@code{COMPILE_IN} when it invokes the @file{emultempl} script for thedefault emulation. In this case, the @file{emultempl} script shouldinclude the linker scripts directly, and return them from the@code{get_scripts} entry point. When the emulation is not the default,the @code{get_scripts} entry point should just return a file name. See@file{emultempl/generic.em} for an example of how this is done.At some point, the linker emulation entry points should be documented.@node Emulation Walkthrough@chapter A Walkthrough of a Typical EmulationThis chapter is to help people who are new to the way emulationsinteract with the linker, or who are suddenly thrust into the positionof having to work with existing emulations. It will discuss the filesyou need to be aware of. It will tell you when the given "hooks" inthe emulation will be called. It will, hopefully, give you enoughinformation about when and how things happen that you'll be able toget by. As always, the source is the definitive reference to this.The starting point for the linker is in @file{ldmain.c} where@code{main} is defined. The bulk of the code that's emulationspecific will initially be in @code{emultempl/@var{emulation}.em} butwill end up in @code{e@var{emulation}.c} when the build is done.Most of the work to select and interface with emulations is in@code{ldemul.h} and @code{ldemul.c}. Specifically, @code{ldemul.h}defines the @code{ld_emulation_xfer_struct} structure your emulationexports.Your emulation file exports a symbol@code{ld_@var{EMULATION_NAME}_emulation}. If your emulation isselected (it usually is, since usually there's only one),@code{ldemul.c} sets the variable @var{ld_emulation} to point to it.@code{ldemul.c} also defines a number of API functions that interfaceto your emulation, like @code{ldemul_after_parse} which simply callsyour @code{ld_@var{EMULATION}_emulation.after_parse} function. Forthe rest of this section, the functions will be mentioned, but youshould assume the indirect reference to your emulation also.We will also skip or gloss over parts of the link process that don'trelate to emulations, like setting up internationalization.After initialization, @code{main} selects an emulation by pre-scanningthe command line arguments. It calls @code{ldemul_choose_target} tochoose a target. If you set @code{choose_target} to@code{ldemul_default_target}, it picks your @code{target_name} bydefault.@code{main} calls @code{ldemul_before_parse}, then @code{parse_args}.@code{parse_args} calls @code{ldemul_parse_args} for each arg, whichmust update the @code{getopt} globals if it recognizes the argument.If the emulation doesn't recognize it, then parse_args checks to seeif it recognizes it.Now that the emulation has had access to all its command-line options,@code{main} calls @code{ldemul_set_symbols}. This can be used for anyinitialization that may be affected by options. It is also supposedto set up any variables needed by the emulation script.@code{main} now calls @code{ldemul_get_script} to get the emulationscript to use (based on arguments, no doubt, @pxref{Emulations}) andruns it. While parsing, @code{ldgram.y} may call @code{ldemul_hll} or@code{ldemul_syslib} to handle the @code{HLL} or @code{SYSLIB}commands. It may call @code{ldemul_unrecognized_file} if you askedthe linker to link a file it doesn't recognize. It will call@code{ldemul_recognized_file} for each file it does recognize, in casethe emulation wants to handle some files specially. All the while,it's loading the files (possibly calling@code{ldemul_open_dynamic_archive}) and symbols and stuff. After it'sdone reading the script, @code{main} calls @code{ldemul_after_parse}.Use the after-parse hook to set up anything that depends on stuff thescript might have set up, like the entry point.@code{main} next calls @code{lang_process} in @code{ldlang.c}. Thisappears to be the main core of the linking itself, as far as emulationhooks are concerned(*). It first opens the output file's BFD, calling@code{ldemul_set_output_arch}, and calls@code{ldemul_create_output_section_statements} in case you need to useother means to find or create object files (i.e. shared librariesfound on a path, or fake stub objects). Despite the name, nobodycreates output sections here.(*) In most cases, the BFD library does the bulk of the actuallinking, handling symbol tables, symbol resolution, relocations, andbuilding the final output file. See the BFD reference for all thedetails. Your emulation is usually concerned more with managingthings at the file and section level, like "put this here, add thissection", etc.Next, the objects to be linked are opened and BFDs created for them,and @code{ldemul_after_open} is called. At this point, you have allthe objects and symbols loaded, but none of the data has been placedyet.Next comes the Big Linking Thingy (except for the parts BFD does).All input sections are mapped to output sections according to thescript. If a section doesn't get mapped by default,@code{ldemul_place_orphan} will get called to figure out where it goes.Next it figures out the offsets for each section, calling@code{ldemul_before_allocation} before and@code{ldemul_after_allocation} after deciding where each input sectionends up in the output sections.The last part of @code{lang_process} is to figure out all the symbols'values. After assigning final values to the symbols,@code{ldemul_finish} is called, and after that, any undefined symbolsare turned into fatal errors.OK, back to @code{main}, which calls @code{ldwrite} in@file{ldwrite.c}. @code{ldwrite} calls BFD's final_link, which doesall the relocation fixups and writes the output bfd to disk, and we'redone.In summary,@itemize @bullet@item @code{main()} in @file{ldmain.c}@item @file{emultempl/@var{EMULATION}.em} has your code@item @code{ldemul_choose_target} (defaults to your @code{target_name})@item @code{ldemul_before_parse}@item Parse argv, calls @code{ldemul_parse_args} for each@item @code{ldemul_set_symbols}@item @code{ldemul_get_script}@item parse script@itemize @bullet@item may call @code{ldemul_hll} or @code{ldemul_syslib}@item may call @code{ldemul_open_dynamic_archive}@end itemize@item @code{ldemul_after_parse}@item @code{lang_process()} in @file{ldlang.c}@itemize @bullet@item create @code{output_bfd}@item @code{ldemul_set_output_arch}@item @code{ldemul_create_output_section_statements}@item read objects, create input bfds - all symbols exist, but have no values@item may call @code{ldemul_unrecognized_file}@item will call @code{ldemul_recognized_file}@item @code{ldemul_after_open}@item map input sections to output sections@item may call @code{ldemul_place_orphan} for remaining sections@item @code{ldemul_before_allocation}@item gives input sections offsets into output sections, places output sections@item @code{ldemul_after_allocation} - section addresses valid@item assigns values to symbols@item @code{ldemul_finish} - symbol values valid@end itemize@item output bfd is written to disk@end itemize@node Architecture Specific@chapter Some Architecture Specific NotesThis is the place for notes on the behavior of @code{ld} onspecific platforms. Currently, only Intel x86 is documented (andof that, only the auto-import behavior for DLLs).@menu* ix86:: Intel x86@end menu@node ix86@section Intel x86@table @emph@code{ld} can create DLLs that operate with various runtimes availableon a common x86 operating system. These runtimes include native (usingthe mingw "platform"), cygwin, and pw.@item auto-import from DLLs@enumerate@itemWith this feature on, DLL clients can import variables from DLLwithout any concern from their side (for example, without any sourcecode modifications). Auto-import can be enabled using the@code{--enable-auto-import} flag, or disabled via the@code{--disable-auto-import} flag. Auto-import is disabled by default.@itemThis is done completely in bounds of the PE specification (to be fair,there's a minor violation of the spec at one point, but in practiceauto-import works on all known variants of that common x86 operatingsystem) So, the resulting DLL can be used with any other PEcompiler/linker.@itemAuto-import is fully compatible with standard import method, in whichvariables are decorated using attribute modifiers. Libraries of eithertype may be mixed together.@itemOverhead (space): 8 bytes per imported symbol, plus 20 for eachreference to it; Overhead (load time): negligible; Overhead(virtual/physical memory): should be less than effect of DLLrelocation.@end enumerateMotivationThe obvious and only way to get rid of dllimport insanity isto make client access variable directly in the DLL, bypassingthe extra dereference imposed by ordinary DLL runtime linking.I.e., whenever client contains something like@code{mov dll_var,%eax,}address of dll_var in the command should be relocated to pointinto loaded DLL. The aim is to make OS loader do so, and thanmake ld help with that. Import section of PE made followingway: there's a vector of structures each describing importsfrom particular DLL. Each such structure points to two otherparallel vectors: one holding imported names, and one whichwill hold address of corresponding imported name. So, thesolution is de-vectorize these structures, making importlocations be sparse and pointing directly into code.ImplementationFor each reference of data symbol to be imported from DLL (toset of which belong symbols with name <sym>, if __imp_<sym> isfound in implib), the import fixup entry is generated. Thatentry is of type IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3subsection. Each fixup entry contains pointer to symbol's addresswithin .text section (marked with __fuN_<sym> symbol, where N isinteger), pointer to DLL name (so, DLL name is referenced bymultiple entries), and pointer to symbol name thunk. Symbol namethunk is singleton vector (__nm_th_<symbol>) pointing toIMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly containingimported name. Here comes that "om the edge" problem mentioned above:PE specification rambles that name vector (OriginalFirstThunk) shouldrun in parallel with addresses vector (FirstThunk), i.e. that theyshould have same number of elements and terminated with zero. We violatethis, since FirstThunk points directly into machine code. But inpractice, OS loader implemented the sane way: it goes thruOriginalFirstThunk and puts addresses to FirstThunk, not somethingelse. It once again should be noted that dll and symbol namestructures are reused across fixup entries and should be thereanyway to support standard import stuff, so sustained overhead is20 bytes per reference. Other question is whether having severalIMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes,it is done even by native compiler/linker (libth32's functions are infact resident in windows9x kernel32.dll, so if you use it, you havetwo IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question iswhether referencing the same PE structures several times is valid.The answer is why not, prohibiting that (detecting violation) wouldrequire more work on behalf of loader than not doing it.@end table@node GNU Free Documentation License@chapter GNU Free Documentation LicenseGNU Free Documentation LicenseVersion 1.1, March 2000Copyright (C) 2000 Free Software Foundation, Inc.51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USAEveryone is permitted to copy and distribute verbatim copiesof this license document, but changing it is not allowed.0. PREAMBLEThe purpose of this License is to make a manual, textbook, or otherwritten document "free" in the sense of freedom: to assure everyonethe effective freedom to copy and redistribute it, with or withoutmodifying it, either commercially or noncommercially. Secondarily,this License preserves for the author and publisher a way to getcredit for their work, while not being considered responsible formodifications made by others.This License is a kind of "copyleft", which means that derivativeworks of the document must themselves be free in the same sense. Itcomplements the GNU General Public License, which is a copyleftlicense designed for free software.We have designed this License in order to use it for manuals for freesoftware, because free software needs free documentation: a freeprogram should come with manuals providing the same freedoms that thesoftware does. But this License is not limited to software manuals;it can be used for any textual work, regardless of subject matter orwhether it is published as a printed book. We recommend this Licenseprincipally for works whose purpose is instruction or reference.1. APPLICABILITY AND DEFINITIONSThis License applies to any manual or other work that contains anotice placed by the copyright holder saying it can be distributedunder the terms of this License. The "Document", below, refers to anysuch manual or work. Any member of the public is a licensee, and isaddressed as "you".A "Modified Version" of the Document means any work containing theDocument or a portion of it, either copied verbatim, or withmodifications and/or translated into another language.A "Secondary Section" is a named appendix or a front-matter section ofthe Document that deals exclusively with the relationship of thepublishers or authors of the Document to the Document's overall subject(or to related matters) and contains nothing that could fall directlywithin that overall subject. (For example, if the Document is in part atextbook of mathematics, a Secondary Section may not explain anymathematics.) The relationship could be a matter of historicalconnection with the subject or with related matters, or of legal,commercial, philosophical, ethical or political position regardingthem.The "Invariant Sections" are certain Secondary Sections whose titlesare designated, as being those of Invariant Sections, in the noticethat says that the Document is released under this License.The "Cover Texts" are certain short passages of text that are listed,as Front-Cover Texts or Back-Cover Texts, in the notice that says thatthe Document is released under this License.A "Transparent" copy of the Document means a machine-readable copy,represented in a format whose specification is available to thegeneral public, whose contents can be viewed and edited directly andstraightforwardly with generic text editors or (for images composed ofpixels) generic paint programs or (for drawings) some widely availabledrawing editor, and that is suitable for input to text formatters orfor automatic translation to a variety of formats suitable for inputto text formatters. A copy made in an otherwise Transparent fileformat whose markup has been designed to thwart or discouragesubsequent modification by readers is not Transparent. A copy that isnot "Transparent" is called "Opaque".Examples of suitable formats for Transparent copies include plainASCII without markup, Texinfo input format, LaTeX input format, SGMLor XML using a publicly available DTD, and standard-conforming simpleHTML designed for human modification. Opaque formats includePostScript, PDF, proprietary formats that can be read and edited onlyby proprietary word processors, SGML or XML for which the DTD and/orprocessing tools are not generally available, and themachine-generated HTML produced by some word processors for outputpurposes only.The "Title Page" means, for a printed book, the title page itself,plus such following pages as are needed to hold, legibly, the materialthis License requires to appear in the title page. For works informats which do not have any title page as such, "Title Page" meansthe text near the most prominent appearance of the work's title,preceding the beginning of the body of the text.2. VERBATIM COPYINGYou may copy and distribute the Document in any medium, eithercommercially or noncommercially, provided that this License, thecopyright notices, and the license notice saying this License appliesto the Document are reproduced in all copies, and that you add no otherconditions whatsoever to those of this License. You may not usetechnical measures to obstruct or control the reading or furthercopying of the copies you make or distribute. However, you may acceptcompensation in exchange for copies. If you distribute a large enoughnumber of copies you must also follow the conditions in section 3.You may also lend copies, under the same conditions stated above, andyou may publicly display copies.3. COPYING IN QUANTITYIf you publish printed copies of the Document numbering more than 100,and the Document's license notice requires Cover Texts, you must enclosethe copies in covers that carry, clearly and legibly, all these CoverTexts: Front-Cover Texts on the front cover, and Back-Cover Texts onthe back cover. Both covers must also clearly and legibly identifyyou as the publisher of these copies. The front cover must presentthe full title with all words of the title equally prominent andvisible. You may add other material on the covers in addition.Copying with changes limited to the covers, as long as they preservethe title of the Document and satisfy these conditions, can be treatedas verbatim copying in other respects.If the required texts for either cover are too voluminous to fitlegibly, you should put the first ones listed (as many as fitreasonably) on the actual cover, and continue the rest onto adjacentpages.If you publish or distribute Opaque copies of the Document numberingmore than 100, you must either include a machine-readable Transparentcopy along with each Opaque copy, or state in or with each Opaque copya publicly-accessible computer-network location containing a completeTransparent copy of the Document, free of added material, which thegeneral network-using public has access to download anonymously at nocharge using public-standard network protocols. If you use the latteroption, you must take reasonably prudent steps, when you begindistribution of Opaque copies in quantity, to ensure that thisTransparent copy will remain thus accessible at the stated locationuntil at least one year after the last time you distribute an Opaquecopy (directly or through your agents or retailers) of that edition tothe public.It is requested, but not required, that you contact the authors of theDocument well before redistributing any large number of copies, to givethem a chance to provide you with an updated version of the Document.4. MODIFICATIONSYou may copy and distribute a Modified Version of the Document underthe conditions of sections 2 and 3 above, provided that you releasethe Modified Version under precisely this License, with the ModifiedVersion filling the role of the Document, thus licensing distributionand modification of the Modified Version to whoever possesses a copyof it. In addition, you must do these things in the Modified Version:A. Use in the Title Page (and on the covers, if any) a title distinctfrom that of the Document, and from those of previous versions(which should, if there were any, be listed in the History sectionof the Document). You may use the same title as a previous versionif the original publisher of that version gives permission.B. List on the Title Page, as authors, one or more persons or entitiesresponsible for authorship of the modifications in the ModifiedVersion, together with at least five of the principal authors of theDocument (all of its principal authors, if it has less than five).C. State on the Title page the name of the publisher of theModified Version, as the publisher.D. Preserve all the copyright notices of the Document.E. Add an appropriate copyright notice for your modificationsadjacent to the other copyright notices.F. Include, immediately after the copyright notices, a license noticegiving the public permission to use the Modified Version under theterms of this License, in the form shown in the Addendum below.G. Preserve in that license notice the full lists of Invariant Sectionsand required Cover Texts given in the Document's license notice.H. Include an unaltered copy of this License.I. Preserve the section entitled "History", and its title, and add toit an item stating at least the title, year, new authors, andpublisher of the Modified Version as given on the Title Page. Ifthere is no section entitled "History" in the Document, create onestating the title, year, authors, and publisher of the Document asgiven on its Title Page, then add an item describing the ModifiedVersion as stated in the previous sentence.J. Preserve the network location, if any, given in the Document forpublic access to a Transparent copy of the Document, and likewisethe network locations given in the Document for previous versionsit was based on. These may be placed in the "History" section.You may omit a network location for a work that was published atleast four years before the Document itself, or if the originalpublisher of the version it refers to gives permission.K. In any section entitled "Acknowledgements" or "Dedications",preserve the section's title, and preserve in the section all thesubstance and tone of each of the contributor acknowledgementsand/or dedications given therein.L. Preserve all the Invariant Sections of the Document,unaltered in their text and in their titles. Section numbersor the equivalent are not considered part of the section titles.M. Delete any section entitled "Endorsements". Such a sectionmay not be included in the Modified Version.N. Do not retitle any existing section as "Endorsements"or to conflict in title with any Invariant Section.If the Modified Version includes new front-matter sections orappendices that qualify as Secondary Sections and contain no materialcopied from the Document, you may at your option designate some or allof these sections as invariant. To do this, add their titles to thelist of Invariant Sections in the Modified Version's license notice.These titles must be distinct from any other section titles.You may add a section entitled "Endorsements", provided it containsnothing but endorsements of your Modified Version by variousparties--for example, statements of peer review or that the text hasbeen approved by an organization as the authoritative definition of astandard.You may add a passage of up to five words as a Front-Cover Text, and apassage of up to 25 words as a Back-Cover Text, to the end of the listof Cover Texts in the Modified Version. Only one passage ofFront-Cover Text and one of Back-Cover Text may be added by (orthrough arrangements made by) any one entity. If the Document alreadyincludes a cover text for the same cover, previously added by you orby arrangement made by the same entity you are acting on behalf of,you may not add another; but you may replace the old one, on explicitpermission from the previous publisher that added the old one.The author(s) and publisher(s) of the Document do not by this Licensegive permission to use their names for publicity for or to assert orimply endorsement of any Modified Version.5. COMBINING DOCUMENTSYou may combine the Document with other documents released under thisLicense, under the terms defined in section 4 above for modifiedversions, provided that you include in the combination all of theInvariant Sections of all of the original documents, unmodified, andlist them all as Invariant Sections of your combined work in itslicense notice.The combined work need only contain one copy of this License, andmultiple identical Invariant Sections may be replaced with a singlecopy. If there are multiple Invariant Sections with the same name butdifferent contents, make the title of each such section unique byadding at the end of it, in parentheses, the name of the originalauthor or publisher of that section if known, or else a unique number.Make the same adjustment to the section titles in the list ofInvariant Sections in the license notice of the combined work.In the combination, you must combine any sections entitled "History"in the various original documents, forming one section entitled"History"; likewise combine any sections entitled "Acknowledgements",and any sections entitled "Dedications". You must delete all sectionsentitled "Endorsements."6. COLLECTIONS OF DOCUMENTSYou may make a collection consisting of the Document and other documentsreleased under this License, and replace the individual copies of thisLicense in the various documents with a single copy that is included inthe collection, provided that you follow the rules of this License forverbatim copying of each of the documents in all other respects.You may extract a single document from such a collection, and distributeit individually under this License, provided you insert a copy of thisLicense into the extracted document, and follow this License in allother respects regarding verbatim copying of that document.7. AGGREGATION WITH INDEPENDENT WORKSA compilation of the Document or its derivatives with other separateand independent documents or works, in or on a volume of a storage ordistribution medium, does not as a whole count as a Modified Versionof the Document, provided no compilation copyright is claimed for thecompilation. Such a compilation is called an "aggregate", and thisLicense does not apply to the other self-contained works thus compiledwith the Document, on account of their being thus compiled, if theyare not themselves derivative works of the Document.If the Cover Text requirement of section 3 is applicable to thesecopies of the Document, then if the Document is less than one quarterof the entire aggregate, the Document's Cover Texts may be placed oncovers that surround only the Document within the aggregate.Otherwise they must appear on covers around the whole aggregate.8. TRANSLATIONTranslation is considered a kind of modification, so you maydistribute translations of the Document under the terms of section 4.Replacing Invariant Sections with translations requires specialpermission from their copyright holders, but you may includetranslations of some or all Invariant Sections in addition to theoriginal versions of these Invariant Sections. You may include atranslation of this License provided that you also include theoriginal English version of this License. In case of a disagreementbetween the translation and the original English version of thisLicense, the original English version will prevail.9. TERMINATIONYou may not copy, modify, sublicense, or distribute the Document exceptas expressly provided for under this License. Any other attempt tocopy, modify, sublicense or distribute the Document is void, and willautomatically terminate your rights under this License. However,parties who have received copies, or rights, from you under thisLicense will not have their licenses terminated so long as suchparties remain in full compliance.10. FUTURE REVISIONS OF THIS LICENSEThe Free Software Foundation may publish new, revised versionsof the GNU Free Documentation License from time to time. Such newversions will be similar in spirit to the present version, but maydiffer in detail to address new problems or concerns. Seehttp://www.gnu.org/copyleft/.Each version of the License is given a distinguishing version number.If the Document specifies that a particular numbered version of thisLicense "or any later version" applies to it, you have the option offollowing the terms and conditions either of that specified version orof any later version that has been published (not as a draft) by theFree Software Foundation. If the Document does not specify a versionnumber of this License, you may choose any version ever published (notas a draft) by the Free Software Foundation.ADDENDUM: How to use this License for your documentsTo use this License in a document you have written, include a copy ofthe License in the document and put the following copyright andlicense notices just after the title page:@smallexampleCopyright (c) YEAR YOUR NAME.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.1or any later version published by the Free Software Foundation;with the Invariant Sections being LIST THEIR TITLES, with theFront-Cover Texts being LIST, and with the Back-Cover Texts being LIST.A copy of the license is included in the section entitled "GNUFree Documentation License".@end smallexampleIf you have no Invariant Sections, write "with no Invariant Sections"instead of saying which ones are invariant. If you have noFront-Cover Texts, write "no Front-Cover Texts" instead of"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.If your document contains nontrivial examples of program code, werecommend releasing these examples in parallel under your choice offree software license, such as the GNU General Public License,to permit their use in free software.@contents@bye