1 | @section Linker Functions
|
---|
2 | @cindex Linker
|
---|
3 | The linker uses three special entry points in the BFD target
|
---|
4 | vector. It is not necessary to write special routines for
|
---|
5 | these entry points when creating a new BFD back end, since
|
---|
6 | generic versions are provided. However, writing them can
|
---|
7 | speed up linking and make it use significantly less runtime
|
---|
8 | memory.
|
---|
9 |
|
---|
10 | The first routine creates a hash table used by the other
|
---|
11 | routines. The second routine adds the symbols from an object
|
---|
12 | file to the hash table. The third routine takes all the
|
---|
13 | object files and links them together to create the output
|
---|
14 | file. These routines are designed so that the linker proper
|
---|
15 | does not need to know anything about the symbols in the object
|
---|
16 | files that it is linking. The linker merely arranges the
|
---|
17 | sections as directed by the linker script and lets BFD handle
|
---|
18 | the details of symbols and relocs.
|
---|
19 |
|
---|
20 | The second routine and third routines are passed a pointer to
|
---|
21 | a @code{struct bfd_link_info} structure (defined in
|
---|
22 | @code{bfdlink.h}) which holds information relevant to the link,
|
---|
23 | including the linker hash table (which was created by the
|
---|
24 | first routine) and a set of callback functions to the linker
|
---|
25 | proper.
|
---|
26 |
|
---|
27 | The generic linker routines are in @code{linker.c}, and use the
|
---|
28 | header file @code{genlink.h}. As of this writing, the only back
|
---|
29 | ends which have implemented versions of these routines are
|
---|
30 | a.out (in @code{aoutx.h}) and ECOFF (in @code{ecoff.c}). The a.out
|
---|
31 | routines are used as examples throughout this section.
|
---|
32 |
|
---|
33 | @menu
|
---|
34 | * Creating a Linker Hash Table::
|
---|
35 | * Adding Symbols to the Hash Table::
|
---|
36 | * Performing the Final Link::
|
---|
37 | @end menu
|
---|
38 |
|
---|
39 | @node Creating a Linker Hash Table, Adding Symbols to the Hash Table, Linker Functions, Linker Functions
|
---|
40 | @subsection Creating a linker hash table
|
---|
41 | @cindex _bfd_link_hash_table_create in target vector
|
---|
42 | @cindex target vector (_bfd_link_hash_table_create)
|
---|
43 | The linker routines must create a hash table, which must be
|
---|
44 | derived from @code{struct bfd_link_hash_table} described in
|
---|
45 | @code{bfdlink.c}. @xref{Hash Tables}, for information on how to
|
---|
46 | create a derived hash table. This entry point is called using
|
---|
47 | the target vector of the linker output file.
|
---|
48 |
|
---|
49 | The @code{_bfd_link_hash_table_create} entry point must allocate
|
---|
50 | and initialize an instance of the desired hash table. If the
|
---|
51 | back end does not require any additional information to be
|
---|
52 | stored with the entries in the hash table, the entry point may
|
---|
53 | simply create a @code{struct bfd_link_hash_table}. Most likely,
|
---|
54 | however, some additional information will be needed.
|
---|
55 |
|
---|
56 | For example, with each entry in the hash table the a.out
|
---|
57 | linker keeps the index the symbol has in the final output file
|
---|
58 | (this index number is used so that when doing a relocateable
|
---|
59 | link the symbol index used in the output file can be quickly
|
---|
60 | filled in when copying over a reloc). The a.out linker code
|
---|
61 | defines the required structures and functions for a hash table
|
---|
62 | derived from @code{struct bfd_link_hash_table}. The a.out linker
|
---|
63 | hash table is created by the function
|
---|
64 | @code{NAME(aout,link_hash_table_create)}; it simply allocates
|
---|
65 | space for the hash table, initializes it, and returns a
|
---|
66 | pointer to it.
|
---|
67 |
|
---|
68 | When writing the linker routines for a new back end, you will
|
---|
69 | generally not know exactly which fields will be required until
|
---|
70 | you have finished. You should simply create a new hash table
|
---|
71 | which defines no additional fields, and then simply add fields
|
---|
72 | as they become necessary.
|
---|
73 |
|
---|
74 | @node Adding Symbols to the Hash Table, Performing the Final Link, Creating a Linker Hash Table, Linker Functions
|
---|
75 | @subsection Adding symbols to the hash table
|
---|
76 | @cindex _bfd_link_add_symbols in target vector
|
---|
77 | @cindex target vector (_bfd_link_add_symbols)
|
---|
78 | The linker proper will call the @code{_bfd_link_add_symbols}
|
---|
79 | entry point for each object file or archive which is to be
|
---|
80 | linked (typically these are the files named on the command
|
---|
81 | line, but some may also come from the linker script). The
|
---|
82 | entry point is responsible for examining the file. For an
|
---|
83 | object file, BFD must add any relevant symbol information to
|
---|
84 | the hash table. For an archive, BFD must determine which
|
---|
85 | elements of the archive should be used and adding them to the
|
---|
86 | link.
|
---|
87 |
|
---|
88 | The a.out version of this entry point is
|
---|
89 | @code{NAME(aout,link_add_symbols)}.
|
---|
90 |
|
---|
91 | @menu
|
---|
92 | * Differing file formats::
|
---|
93 | * Adding symbols from an object file::
|
---|
94 | * Adding symbols from an archive::
|
---|
95 | @end menu
|
---|
96 |
|
---|
97 | @node Differing file formats, Adding symbols from an object file, Adding Symbols to the Hash Table, Adding Symbols to the Hash Table
|
---|
98 | @subsubsection Differing file formats
|
---|
99 | Normally all the files involved in a link will be of the same
|
---|
100 | format, but it is also possible to link together different
|
---|
101 | format object files, and the back end must support that. The
|
---|
102 | @code{_bfd_link_add_symbols} entry point is called via the target
|
---|
103 | vector of the file to be added. This has an important
|
---|
104 | consequence: the function may not assume that the hash table
|
---|
105 | is the type created by the corresponding
|
---|
106 | @code{_bfd_link_hash_table_create} vector. All the
|
---|
107 | @code{_bfd_link_add_symbols} function can assume about the hash
|
---|
108 | table is that it is derived from @code{struct
|
---|
109 | bfd_link_hash_table}.
|
---|
110 |
|
---|
111 | Sometimes the @code{_bfd_link_add_symbols} function must store
|
---|
112 | some information in the hash table entry to be used by the
|
---|
113 | @code{_bfd_final_link} function. In such a case the @code{creator}
|
---|
114 | field of the hash table must be checked to make sure that the
|
---|
115 | hash table was created by an object file of the same format.
|
---|
116 |
|
---|
117 | The @code{_bfd_final_link} routine must be prepared to handle a
|
---|
118 | hash entry without any extra information added by the
|
---|
119 | @code{_bfd_link_add_symbols} function. A hash entry without
|
---|
120 | extra information will also occur when the linker script
|
---|
121 | directs the linker to create a symbol. Note that, regardless
|
---|
122 | of how a hash table entry is added, all the fields will be
|
---|
123 | initialized to some sort of null value by the hash table entry
|
---|
124 | initialization function.
|
---|
125 |
|
---|
126 | See @code{ecoff_link_add_externals} for an example of how to
|
---|
127 | check the @code{creator} field before saving information (in this
|
---|
128 | case, the ECOFF external symbol debugging information) in a
|
---|
129 | hash table entry.
|
---|
130 |
|
---|
131 | @node Adding symbols from an object file, Adding symbols from an archive, Differing file formats, Adding Symbols to the Hash Table
|
---|
132 | @subsubsection Adding symbols from an object file
|
---|
133 | When the @code{_bfd_link_add_symbols} routine is passed an object
|
---|
134 | file, it must add all externally visible symbols in that
|
---|
135 | object file to the hash table. The actual work of adding the
|
---|
136 | symbol to the hash table is normally handled by the function
|
---|
137 | @code{_bfd_generic_link_add_one_symbol}. The
|
---|
138 | @code{_bfd_link_add_symbols} routine is responsible for reading
|
---|
139 | all the symbols from the object file and passing the correct
|
---|
140 | information to @code{_bfd_generic_link_add_one_symbol}.
|
---|
141 |
|
---|
142 | The @code{_bfd_link_add_symbols} routine should not use
|
---|
143 | @code{bfd_canonicalize_symtab} to read the symbols. The point of
|
---|
144 | providing this routine is to avoid the overhead of converting
|
---|
145 | the symbols into generic @code{asymbol} structures.
|
---|
146 |
|
---|
147 | @findex _bfd_generic_link_add_one_symbol
|
---|
148 | @code{_bfd_generic_link_add_one_symbol} handles the details of
|
---|
149 | combining common symbols, warning about multiple definitions,
|
---|
150 | and so forth. It takes arguments which describe the symbol to
|
---|
151 | add, notably symbol flags, a section, and an offset. The
|
---|
152 | symbol flags include such things as @code{BSF_WEAK} or
|
---|
153 | @code{BSF_INDIRECT}. The section is a section in the object
|
---|
154 | file, or something like @code{bfd_und_section_ptr} for an undefined
|
---|
155 | symbol or @code{bfd_com_section_ptr} for a common symbol.
|
---|
156 |
|
---|
157 | If the @code{_bfd_final_link} routine is also going to need to
|
---|
158 | read the symbol information, the @code{_bfd_link_add_symbols}
|
---|
159 | routine should save it somewhere attached to the object file
|
---|
160 | BFD. However, the information should only be saved if the
|
---|
161 | @code{keep_memory} field of the @code{info} argument is TRUE, so
|
---|
162 | that the @code{-no-keep-memory} linker switch is effective.
|
---|
163 |
|
---|
164 | The a.out function which adds symbols from an object file is
|
---|
165 | @code{aout_link_add_object_symbols}, and most of the interesting
|
---|
166 | work is in @code{aout_link_add_symbols}. The latter saves
|
---|
167 | pointers to the hash tables entries created by
|
---|
168 | @code{_bfd_generic_link_add_one_symbol} indexed by symbol number,
|
---|
169 | so that the @code{_bfd_final_link} routine does not have to call
|
---|
170 | the hash table lookup routine to locate the entry.
|
---|
171 |
|
---|
172 | @node Adding symbols from an archive, , Adding symbols from an object file, Adding Symbols to the Hash Table
|
---|
173 | @subsubsection Adding symbols from an archive
|
---|
174 | When the @code{_bfd_link_add_symbols} routine is passed an
|
---|
175 | archive, it must look through the symbols defined by the
|
---|
176 | archive and decide which elements of the archive should be
|
---|
177 | included in the link. For each such element it must call the
|
---|
178 | @code{add_archive_element} linker callback, and it must add the
|
---|
179 | symbols from the object file to the linker hash table.
|
---|
180 |
|
---|
181 | @findex _bfd_generic_link_add_archive_symbols
|
---|
182 | In most cases the work of looking through the symbols in the
|
---|
183 | archive should be done by the
|
---|
184 | @code{_bfd_generic_link_add_archive_symbols} function. This
|
---|
185 | function builds a hash table from the archive symbol table and
|
---|
186 | looks through the list of undefined symbols to see which
|
---|
187 | elements should be included.
|
---|
188 | @code{_bfd_generic_link_add_archive_symbols} is passed a function
|
---|
189 | to call to make the final decision about adding an archive
|
---|
190 | element to the link and to do the actual work of adding the
|
---|
191 | symbols to the linker hash table.
|
---|
192 |
|
---|
193 | The function passed to
|
---|
194 | @code{_bfd_generic_link_add_archive_symbols} must read the
|
---|
195 | symbols of the archive element and decide whether the archive
|
---|
196 | element should be included in the link. If the element is to
|
---|
197 | be included, the @code{add_archive_element} linker callback
|
---|
198 | routine must be called with the element as an argument, and
|
---|
199 | the elements symbols must be added to the linker hash table
|
---|
200 | just as though the element had itself been passed to the
|
---|
201 | @code{_bfd_link_add_symbols} function.
|
---|
202 |
|
---|
203 | When the a.out @code{_bfd_link_add_symbols} function receives an
|
---|
204 | archive, it calls @code{_bfd_generic_link_add_archive_symbols}
|
---|
205 | passing @code{aout_link_check_archive_element} as the function
|
---|
206 | argument. @code{aout_link_check_archive_element} calls
|
---|
207 | @code{aout_link_check_ar_symbols}. If the latter decides to add
|
---|
208 | the element (an element is only added if it provides a real,
|
---|
209 | non-common, definition for a previously undefined or common
|
---|
210 | symbol) it calls the @code{add_archive_element} callback and then
|
---|
211 | @code{aout_link_check_archive_element} calls
|
---|
212 | @code{aout_link_add_symbols} to actually add the symbols to the
|
---|
213 | linker hash table.
|
---|
214 |
|
---|
215 | The ECOFF back end is unusual in that it does not normally
|
---|
216 | call @code{_bfd_generic_link_add_archive_symbols}, because ECOFF
|
---|
217 | archives already contain a hash table of symbols. The ECOFF
|
---|
218 | back end searches the archive itself to avoid the overhead of
|
---|
219 | creating a new hash table.
|
---|
220 |
|
---|
221 | @node Performing the Final Link, , Adding Symbols to the Hash Table, Linker Functions
|
---|
222 | @subsection Performing the final link
|
---|
223 | @cindex _bfd_link_final_link in target vector
|
---|
224 | @cindex target vector (_bfd_final_link)
|
---|
225 | When all the input files have been processed, the linker calls
|
---|
226 | the @code{_bfd_final_link} entry point of the output BFD. This
|
---|
227 | routine is responsible for producing the final output file,
|
---|
228 | which has several aspects. It must relocate the contents of
|
---|
229 | the input sections and copy the data into the output sections.
|
---|
230 | It must build an output symbol table including any local
|
---|
231 | symbols from the input files and the global symbols from the
|
---|
232 | hash table. When producing relocateable output, it must
|
---|
233 | modify the input relocs and write them into the output file.
|
---|
234 | There may also be object format dependent work to be done.
|
---|
235 |
|
---|
236 | The linker will also call the @code{write_object_contents} entry
|
---|
237 | point when the BFD is closed. The two entry points must work
|
---|
238 | together in order to produce the correct output file.
|
---|
239 |
|
---|
240 | The details of how this works are inevitably dependent upon
|
---|
241 | the specific object file format. The a.out
|
---|
242 | @code{_bfd_final_link} routine is @code{NAME(aout,final_link)}.
|
---|
243 |
|
---|
244 | @menu
|
---|
245 | * Information provided by the linker::
|
---|
246 | * Relocating the section contents::
|
---|
247 | * Writing the symbol table::
|
---|
248 | @end menu
|
---|
249 |
|
---|
250 | @node Information provided by the linker, Relocating the section contents, Performing the Final Link, Performing the Final Link
|
---|
251 | @subsubsection Information provided by the linker
|
---|
252 | Before the linker calls the @code{_bfd_final_link} entry point,
|
---|
253 | it sets up some data structures for the function to use.
|
---|
254 |
|
---|
255 | The @code{input_bfds} field of the @code{bfd_link_info} structure
|
---|
256 | will point to a list of all the input files included in the
|
---|
257 | link. These files are linked through the @code{link_next} field
|
---|
258 | of the @code{bfd} structure.
|
---|
259 |
|
---|
260 | Each section in the output file will have a list of
|
---|
261 | @code{link_order} structures attached to the @code{link_order_head}
|
---|
262 | field (the @code{link_order} structure is defined in
|
---|
263 | @code{bfdlink.h}). These structures describe how to create the
|
---|
264 | contents of the output section in terms of the contents of
|
---|
265 | various input sections, fill constants, and, eventually, other
|
---|
266 | types of information. They also describe relocs that must be
|
---|
267 | created by the BFD backend, but do not correspond to any input
|
---|
268 | file; this is used to support -Ur, which builds constructors
|
---|
269 | while generating a relocateable object file.
|
---|
270 |
|
---|
271 | @node Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link
|
---|
272 | @subsubsection Relocating the section contents
|
---|
273 | The @code{_bfd_final_link} function should look through the
|
---|
274 | @code{link_order} structures attached to each section of the
|
---|
275 | output file. Each @code{link_order} structure should either be
|
---|
276 | handled specially, or it should be passed to the function
|
---|
277 | @code{_bfd_default_link_order} which will do the right thing
|
---|
278 | (@code{_bfd_default_link_order} is defined in @code{linker.c}).
|
---|
279 |
|
---|
280 | For efficiency, a @code{link_order} of type
|
---|
281 | @code{bfd_indirect_link_order} whose associated section belongs
|
---|
282 | to a BFD of the same format as the output BFD must be handled
|
---|
283 | specially. This type of @code{link_order} describes part of an
|
---|
284 | output section in terms of a section belonging to one of the
|
---|
285 | input files. The @code{_bfd_final_link} function should read the
|
---|
286 | contents of the section and any associated relocs, apply the
|
---|
287 | relocs to the section contents, and write out the modified
|
---|
288 | section contents. If performing a relocateable link, the
|
---|
289 | relocs themselves must also be modified and written out.
|
---|
290 |
|
---|
291 | @findex _bfd_relocate_contents
|
---|
292 | @findex _bfd_final_link_relocate
|
---|
293 | The functions @code{_bfd_relocate_contents} and
|
---|
294 | @code{_bfd_final_link_relocate} provide some general support for
|
---|
295 | performing the actual relocations, notably overflow checking.
|
---|
296 | Their arguments include information about the symbol the
|
---|
297 | relocation is against and a @code{reloc_howto_type} argument
|
---|
298 | which describes the relocation to perform. These functions
|
---|
299 | are defined in @code{reloc.c}.
|
---|
300 |
|
---|
301 | The a.out function which handles reading, relocating, and
|
---|
302 | writing section contents is @code{aout_link_input_section}. The
|
---|
303 | actual relocation is done in @code{aout_link_input_section_std}
|
---|
304 | and @code{aout_link_input_section_ext}.
|
---|
305 |
|
---|
306 | @node Writing the symbol table, , Relocating the section contents, Performing the Final Link
|
---|
307 | @subsubsection Writing the symbol table
|
---|
308 | The @code{_bfd_final_link} function must gather all the symbols
|
---|
309 | in the input files and write them out. It must also write out
|
---|
310 | all the symbols in the global hash table. This must be
|
---|
311 | controlled by the @code{strip} and @code{discard} fields of the
|
---|
312 | @code{bfd_link_info} structure.
|
---|
313 |
|
---|
314 | The local symbols of the input files will not have been
|
---|
315 | entered into the linker hash table. The @code{_bfd_final_link}
|
---|
316 | routine must consider each input file and include the symbols
|
---|
317 | in the output file. It may be convenient to do this when
|
---|
318 | looking through the @code{link_order} structures, or it may be
|
---|
319 | done by stepping through the @code{input_bfds} list.
|
---|
320 |
|
---|
321 | The @code{_bfd_final_link} routine must also traverse the global
|
---|
322 | hash table to gather all the externally visible symbols. It
|
---|
323 | is possible that most of the externally visible symbols may be
|
---|
324 | written out when considering the symbols of each input file,
|
---|
325 | but it is still necessary to traverse the hash table since the
|
---|
326 | linker script may have defined some symbols that are not in
|
---|
327 | any of the input files.
|
---|
328 |
|
---|
329 | The @code{strip} field of the @code{bfd_link_info} structure
|
---|
330 | controls which symbols are written out. The possible values
|
---|
331 | are listed in @code{bfdlink.h}. If the value is @code{strip_some},
|
---|
332 | then the @code{keep_hash} field of the @code{bfd_link_info}
|
---|
333 | structure is a hash table of symbols to keep; each symbol
|
---|
334 | should be looked up in this hash table, and only symbols which
|
---|
335 | are present should be included in the output file.
|
---|
336 |
|
---|
337 | If the @code{strip} field of the @code{bfd_link_info} structure
|
---|
338 | permits local symbols to be written out, the @code{discard} field
|
---|
339 | is used to further controls which local symbols are included
|
---|
340 | in the output file. If the value is @code{discard_l}, then all
|
---|
341 | local symbols which begin with a certain prefix are discarded;
|
---|
342 | this is controlled by the @code{bfd_is_local_label_name} entry point.
|
---|
343 |
|
---|
344 | The a.out backend handles symbols by calling
|
---|
345 | @code{aout_link_write_symbols} on each input BFD and then
|
---|
346 | traversing the global hash table with the function
|
---|
347 | @code{aout_link_write_other_symbol}. It builds a string table
|
---|
348 | while writing out the symbols, which is written to the output
|
---|
349 | file at the end of @code{NAME(aout,final_link)}.
|
---|
350 |
|
---|
351 | @findex bfd_link_split_section
|
---|
352 | @subsubsection @code{bfd_link_split_section}
|
---|
353 | @strong{Synopsis}
|
---|
354 | @example
|
---|
355 | bfd_boolean bfd_link_split_section(bfd *abfd, asection *sec);
|
---|
356 | @end example
|
---|
357 | @strong{Description}@*
|
---|
358 | Return nonzero if @var{sec} should be split during a
|
---|
359 | reloceatable or final link.
|
---|
360 | @example
|
---|
361 | #define bfd_link_split_section(abfd, sec) \
|
---|
362 | BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec))
|
---|
363 |
|
---|
364 | @end example
|
---|
365 |
|
---|