Browse Source

Documented the link stages

tags/v0.9.3
Michael Brown 19 years ago
parent
commit
93bb763ade
1 changed files with 226 additions and 7 deletions
  1. 226
    7
      src/doc/build_sys.dox

+ 226
- 7
src/doc/build_sys.dox View File

2
 
2
 
3
 @section overview Overview
3
 @section overview Overview
4
 
4
 
5
-Building an Etherboot image consists of two stages:
5
+Building an Etherboot image consists of three stages:
6
 
6
 
7
   -# @ref compilation : Compiling all the source files into object files
7
   -# @ref compilation : Compiling all the source files into object files
8
-
9
-  -# @ref linking : Building a particular image from select object files
8
+  -# @ref linking : Linking a particular image from selected object files
9
+  -# @ref finalisation : Producing the final output binary
10
 
10
 
11
 Though this is a remarkably complex process, it is important to note
11
 Though this is a remarkably complex process, it is important to note
12
 that it all happens automatically.  Whatever state your build tree is
12
 that it all happens automatically.  Whatever state your build tree is
23
 
23
 
24
 @section compilation Compilation
24
 @section compilation Compilation
25
 
25
 
26
-@subsection comp_general Overview
26
+@subsection comp_overview Overview
27
 
27
 
28
 Each source file (a @c .c or a @c .S file) is compiled into a @c .o
28
 Each source file (a @c .c or a @c .S file) is compiled into a @c .o
29
 file in the @c bin/ directory.  Etherboot makes minimal use of
29
 file in the @c bin/ directory.  Etherboot makes minimal use of
77
 
77
 
78
 @endcode
78
 @endcode
79
 
79
 
80
+@subsection comp_ar After compilation
81
+
82
+Once all objects have been compiled, they will be collected into a
83
+build library ("blib") in <tt>bin/blib.a</tt>.
84
+
80
 @subsection comp_custom Customising compilation
85
 @subsection comp_custom Customising compilation
81
 
86
 
82
 The Makefile rules for a particular object can be customised to a
87
 The Makefile rules for a particular object can be customised to a
190
 @endcode
195
 @endcode
191
 
196
 
192
 You will probably not need to use these targets directly, since a
197
 You will probably not need to use these targets directly, since a
193
-mechanism exists to select debugging levels at link-time; see @ref
194
-link_debug.
198
+mechanism exists to select debugging levels at build time; see @ref
199
+debug.
195
 
200
 
196
 @section linking Linking
201
 @section linking Linking
197
 
202
 
198
-@subsection link_debug Debugging-enabled builds
203
+@subsection link_overview Overview
204
+
205
+Etherboot is designed to be small and extremely customisable.  This is
206
+achieved by linking in only the features that are really wanted in any
207
+particular build.
208
+
209
+There are two places from which the list of desired features is
210
+obtained:
211
+
212
+  -# @ref link_config_h
213
+  -# @ref link_cmdline
214
+
215
+@subsection link_config_h config.h
216
+
217
+The config.h file is used to define global build options that are
218
+likely to apply to all images that you build, such as the console
219
+types, supported download protocols etc.  See the documentation for
220
+config.h for more details.
221
+
222
+@subsection link_cmdline The make command line
223
+
224
+When you type a command such as
225
+
226
+@code
227
+
228
+	make bin/dfe538.zrom
229
+
230
+@endcode
231
+
232
+it is used to derive the following information:
233
+
234
+   - We are building a compressed ROM image
235
+   - The DFE538 is a PCI NIC, so we need the decompressing PCI ROM prefix
236
+   - The PCI IDs for the DFE538 are 1186:1300
237
+   - The DFE538 is an rtl8139-based card, therefore we need the rtl8139 driver
238
+
239
+You can see this process in action using the command
240
+
241
+@code
242
+
243
+	make bin/dfe538.zrom.info
244
+
245
+@endcode
246
+
247
+which will print
248
+
249
+@code
250
+
251
+	Elements             : dfe538
252
+	Prefix               : zrom
253
+	Drivers              : rtl8139
254
+	ROM name             : dfe538
255
+	Media                : rom
256
+
257
+	ROM type             : pci
258
+	PCI vendor           : 0x1186
259
+	PCI device           : 0x1300
260
+
261
+	LD driver symbols    : obj_rtl8139
262
+	LD prefix symbols    : obj_zpciprefix
263
+	LD ID symbols        : pci_vendor_id=0x1186 pci_device_id=0x1300
264
+
265
+	LD target flags      :  -u obj_zpciprefix --defsym check_obj_zpciprefix=obj_zpciprefix   -u obj_rtl8139 --defsym check_obj_rtl8139=obj_rtl8139   -u obj_config --defsym check_obj_config=obj_config  --defsym pci_vendor_id=0x1186 --defsym pci_device_id=0x1300
266
+
267
+@endcode
268
+
269
+This should be interpreted as follows:
270
+
271
+@code
272
+
273
+	Elements             : dfe538
274
+	Prefix               : zrom
275
+
276
+@endcode
277
+
278
+"Elements" is the list of components preceding the first dot in the
279
+target name.  "Prefix" is the component following the first dot in the
280
+target name.  (It's called a "prefix" because the code that makes it a
281
+@c .zrom (rather than a @c .dsk, @c .zpxe or any other type of target)
282
+usually ends up at the start of the resulting binary image.)
283
+
284
+@code
285
+
286
+	Drivers              : rtl8139
287
+
288
+@endcode
289
+
290
+"Drivers" is the list of drivers corresponding to the "Elements".
291
+Most drivers support several network cards.  The PCI_ROM() and
292
+ISA_ROM() macros are used in the driver source files to list the cards
293
+that a particular driver can support.
294
+
295
+@code
296
+
297
+	ROM name             : dfe538
298
+
299
+@endcode
300
+
301
+"ROM name" is the first element in the "Elements" list.  It is used to
302
+select the PCI IDs for a PCI ROM.
303
+
304
+@code
305
+
306
+	Media                : rom
307
+
308
+@endcode
309
+
310
+"Media" is the "Prefix" minus the leading @c z, if any.
311
+
312
+@code
313
+
314
+	ROM type             : pci
315
+	PCI vendor           : 0x1186
316
+	PCI device           : 0x1300
317
+
318
+@endcode
319
+
320
+These are derived from the "ROM name" and the PCI_ROM() or ISA_ROM()
321
+macros in the driver source files.
322
+
323
+@code
324
+
325
+	LD driver symbols    : obj_rtl8139
326
+	LD prefix symbols    : obj_zpciprefix
327
+
328
+@endcode
329
+
330
+This is the interesting part.  At this point, we have established that
331
+we need the rtl8139 driver (i.e. @c rtl8139.o) and the decompressing
332
+PCI prefix (i.e. @c zpciprefix.o).  Our build system (via the
333
+compiler.h header file) arranges that every object exports a symbol
334
+obj_@<object@>; this can be seen by e.g.
335
+
336
+@code
337
+
338
+	objdump -t bin/rtl8139.o
339
+
340
+@endcode
341
+
342
+which will show the line
343
+
344
+@code
345
+
346
+	00000000 g       *ABS*  00000000 obj_rtl8139
347
+
348
+@endcode
349
+
350
+By instructing the linker that we need the symbols @c obj_rtl8139 and
351
+@c obj_zpciprefix, we can therefore ensure that these two objects are
352
+included in our build.  (The linker will also include any objects that
353
+these two objects require, since that's the whole purpose of the
354
+linker.)
355
+
356
+In a similar way, we always instruct the linker that we need the
357
+symbol @c obj_config, in order to include the object @c config.o.  @c
358
+config.o is used to drag in the objects that were specified via
359
+config.h; see @ref link_config_h.
360
+
361
+@code
362
+
363
+	LD target flags      :  -u obj_zpciprefix --defsym check_obj_zpciprefix=obj_zpciprefix   -u obj_rtl8139 --defsym check_obj_rtl8139=obj_rtl8139   -u obj_config --defsym check_obj_config=obj_config  --defsym pci_vendor_id=0x1186 --defsym pci_device_id=0x1300
364
+
365
+@endcode
366
+
367
+These are the flags that we pass to the linker in order to include the
368
+objects that we want in our build, and to check that they really get
369
+included.  (This latter check is needed to work around what seems to
370
+be a bug in @c ld).
371
+
372
+The linker does its job of linking all the required objects together
373
+into a coherent build.  The best way to see what is happening is to
374
+look at one of the resulting linker maps; try, for example
375
+
376
+@code
377
+
378
+	make bin/dfe538.dsk.map
379
+
380
+@endcode
381
+
382
+The linker map includes, amongst others:
383
+
384
+  - A list of which objects are included in the build, and why.
385
+  - The results of processing the linker script, line-by-line.
386
+  - A complete symbol table of the resulting build.
387
+
388
+It is worth spending time examining the linker map to see how an
389
+Etherboot image is assembled.
390
+
391
+Whatever format is selected, the Etherboot image is built into an ELF
392
+file, simply because this is the default format used by @c ld.
393
+
394
+@section finalisation Finalisation
395
+
396
+@subsection final_overview Overview
397
+
398
+The ELF file resulting from @ref linking "linking" needs to be
399
+converted into the final binary image.  Usually, this is just a case
400
+of running
401
+
402
+@code
403
+
404
+	objcopy -O binary <elf file> <output file>
405
+
406
+@endcode
407
+
408
+to convert the ELF file into a raw binary image.  Certain image
409
+formats require special additional treatment.
410
+
411
+@subsection final_rom ROM images
412
+
413
+ROM images must be rounded up to a suitable ROM size (e.g. 16kB or
414
+32kB), and certain header information such as checksums needs to be
415
+filled in.  This is done by the @c makerom.pl program.
416
+
417
+@section debug Debugging-enabled builds
199
 
418
 
200
 */
419
 */

Loading…
Cancel
Save