1 /* NLM (NetWare Loadable Module) executable support for BFD.
2 Copyright (C) 1993 Free Software Foundation, Inc.
4 Written by Fred Fish @ Cygnus Support, using ELF support as the
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include <string.h> /* For strrchr and friends */
29 /* The functions in this file do not use the names they appear to use.
30 This file is actually compiled multiple times, once for each size
31 of NLM target we are using. At each size we use a different name,
32 constructed by the macro nlmNAME. For example, the function which
33 is named nlm_symbol_type below is actually named nlm32_symbol_type
34 in the final executable. */
36 #define Nlm_External_Fixed_Header NlmNAME(External_Fixed_Header)
37 #define Nlm_External_Version_Header NlmNAME(External_Version_Header)
38 #define Nlm_External_Copyright_Header NlmNAME(External_Copyright_Header)
39 #define Nlm_External_Extended_Header NlmNAME(External_Extended_Header)
40 #define Nlm_External_Custom_Header NlmNAME(External_Custom_Header)
41 #define Nlm_External_Cygnus_Ext_Header NlmNAME(External_Cygnus_Ext_Header)
43 #define nlm_symbol_type nlmNAME(symbol_type)
44 #define nlm_get_symtab_upper_bound nlmNAME(get_symtab_upper_bound)
45 #define nlm_get_symtab nlmNAME(get_symtab)
46 #define nlm_make_empty_symbol nlmNAME(make_empty_symbol)
47 #define nlm_print_symbol nlmNAME(print_symbol)
48 #define nlm_get_symbol_info nlmNAME(get_symbol_info)
49 #define nlm_get_reloc_upper_bound nlmNAME(get_reloc_upper_bound)
50 #define nlm_canonicalize_reloc nlmNAME(canonicalize_reloc)
51 #define nlm_object_p nlmNAME(object_p)
52 #define nlm_set_section_contents nlmNAME(set_section_contents)
53 #define nlm_write_object_contents nlmNAME(write_object_contents)
55 #define nlm_swap_fixed_header_in(abfd,src,dst) \
56 (nlm_swap_fixed_header_in_func(abfd))(abfd,src,dst)
57 #define nlm_swap_fixed_header_out(abfd,src,dst) \
58 (nlm_swap_fixed_header_out_func(abfd))(abfd,src,dst)
60 /* Forward declarations of static functions */
62 static boolean add_bfd_section
63 PARAMS ((bfd
*, char *, file_ptr
, bfd_size_type
, flagword
));
64 static boolean nlm_swap_variable_header_in
66 static boolean nlm_swap_variable_header_out
68 static boolean find_nonzero
69 PARAMS ((PTR
, size_t));
70 static boolean nlm_swap_auxiliary_headers_in
72 static boolean nlm_swap_auxiliary_headers_out
74 static boolean nlm_slurp_symbol_table
76 static boolean nlm_slurp_reloc_fixups
78 static boolean nlm_compute_section_file_positions
80 static int nlm_external_reloc_compare
81 PARAMS ((const void *, const void *));
83 /* Should perhaps use put_offset, put_word, etc. For now, the two versions
84 can be handled by explicitly specifying 32 bits or "the long type". */
86 #define put_word bfd_h_put_64
87 #define get_word bfd_h_get_64
90 #define put_word bfd_h_put_32
91 #define get_word bfd_h_get_32
98 struct nlm_obj_tdata
*preserved_tdata
= nlm_tdata (abfd
);
99 boolean (*backend_object_p
) PARAMS ((bfd
*));
101 Nlm_Internal_Fixed_Header
*i_fxdhdrp
;
102 struct nlm_obj_tdata
*new_tdata
= NULL
;
103 const char *signature
;
104 enum bfd_architecture arch
;
106 /* Some NLM formats have a prefix before the standard NLM fixed
108 backend_object_p
= nlm_backend_object_p_func (abfd
);
109 if (backend_object_p
)
111 if (!(*backend_object_p
) (abfd
))
112 goto got_wrong_format_error
;
115 /* Read in the fixed length portion of the NLM header in external format. */
117 x_fxdhdr
= (PTR
) malloc ((size_t) nlm_fixed_header_size (abfd
));
118 if (x_fxdhdr
== NULL
)
120 bfd_set_error (bfd_error_no_memory
);
124 if (bfd_read ((PTR
) x_fxdhdr
, nlm_fixed_header_size (abfd
), 1, abfd
) !=
125 nlm_fixed_header_size (abfd
))
127 if (bfd_get_error () != bfd_error_system_call
)
128 goto got_wrong_format_error
;
133 /* Allocate an instance of the nlm_obj_tdata structure and hook it up to
134 the tdata pointer in the bfd. */
136 new_tdata
= ((struct nlm_obj_tdata
*)
137 bfd_zalloc (abfd
, sizeof (struct nlm_obj_tdata
)));
138 if (new_tdata
== NULL
)
141 nlm_tdata (abfd
) = new_tdata
;
143 i_fxdhdrp
= nlm_fixed_header (abfd
);
144 nlm_swap_fixed_header_in (abfd
, x_fxdhdr
, i_fxdhdrp
);
148 /* Check to see if we have an NLM file for this backend by matching
149 the NLM signature. */
151 signature
= nlm_signature (abfd
);
152 if (signature
!= NULL
153 && *signature
!= '\0'
154 && strncmp ((char *) i_fxdhdrp
->signature
, signature
,
155 NLM_SIGNATURE_SIZE
) != 0)
156 goto got_wrong_format_error
;
158 /* There's no supported way to discover the endianess of an NLM, so test for
159 a sane version number after doing byte swapping appropriate for this
160 XVEC. (Hack alert!) */
162 if (i_fxdhdrp
->version
> 0xFFFF)
163 goto got_wrong_format_error
;
165 /* There's no supported way to check for 32 bit versus 64 bit addresses,
166 so ignore this distinction for now. (FIXME) */
168 /* Swap in the rest of the required header. */
169 if (!nlm_swap_variable_header_in (abfd
))
171 if (bfd_get_error () != bfd_error_system_call
)
172 goto got_wrong_format_error
;
177 /* Add the sections supplied by all NLM's, and then read in the
178 auxiliary headers. Reading the auxiliary headers may create
179 additional sections described in the cygnus_ext header.
180 From this point on we assume that we have an NLM, and do not
181 treat errors as indicating the wrong format. */
183 if (!add_bfd_section (abfd
, NLM_CODE_NAME
,
184 i_fxdhdrp
->codeImageOffset
,
185 i_fxdhdrp
->codeImageSize
,
186 (SEC_CODE
| SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
188 || !add_bfd_section (abfd
, NLM_INITIALIZED_DATA_NAME
,
189 i_fxdhdrp
->dataImageOffset
,
190 i_fxdhdrp
->dataImageSize
,
191 (SEC_DATA
| SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
193 || !add_bfd_section (abfd
, NLM_UNINITIALIZED_DATA_NAME
,
195 i_fxdhdrp
->uninitializedDataSize
,
199 if (!nlm_swap_auxiliary_headers_in (abfd
))
202 if (nlm_fixed_header (abfd
)->numberOfRelocationFixups
!= 0
203 || nlm_fixed_header (abfd
)->numberOfExternalReferences
!= 0)
204 abfd
->flags
|= HAS_RELOC
;
205 if (nlm_fixed_header (abfd
)->numberOfPublics
!= 0
206 || nlm_fixed_header (abfd
)->numberOfDebugRecords
!= 0
207 || nlm_fixed_header (abfd
)->numberOfExternalReferences
!= 0)
208 abfd
->flags
|= HAS_SYMS
;
210 arch
= nlm_architecture (abfd
);
211 if (arch
!= bfd_arch_unknown
)
212 bfd_default_set_arch_mach (abfd
, arch
, (unsigned long) 0);
214 abfd
->flags
|= EXEC_P
;
215 bfd_get_start_address (abfd
) = nlm_fixed_header (abfd
)->codeStartOffset
;
219 got_wrong_format_error
:
220 bfd_set_error (bfd_error_wrong_format
);
222 nlm_tdata (abfd
) = preserved_tdata
;
223 if (new_tdata
!= NULL
)
224 bfd_release (abfd
, new_tdata
);
225 if (x_fxdhdr
!= NULL
)
230 /* Add a section to the bfd. */
233 add_bfd_section (abfd
, name
, offset
, size
, flags
)
242 newsect
= bfd_make_section (abfd
, name
);
247 newsect
->vma
= 0; /* NLM's are relocatable. */
248 newsect
->_raw_size
= size
;
249 newsect
->filepos
= offset
;
250 newsect
->flags
= flags
;
251 newsect
->alignment_power
= bfd_log2 (0); /* FIXME */
255 /* Read and swap in the variable length header. All the fields must
256 exist in the NLM, and must exist in the order they are read here. */
259 nlm_swap_variable_header_in (abfd
)
262 unsigned char temp
[NLM_TARGET_LONG_SIZE
];
264 /* Read the description length and text members. */
266 if (bfd_read ((PTR
) & nlm_variable_header (abfd
)->descriptionLength
,
267 sizeof (nlm_variable_header (abfd
)->descriptionLength
),
269 sizeof (nlm_variable_header (abfd
)->descriptionLength
))
271 if (bfd_read ((PTR
) nlm_variable_header (abfd
)->descriptionText
,
272 nlm_variable_header (abfd
)->descriptionLength
+ 1,
274 (bfd_size_type
) nlm_variable_header (abfd
)->descriptionLength
+ 1)
277 /* Read and convert the stackSize field. */
279 if (bfd_read ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
281 nlm_variable_header (abfd
)->stackSize
= get_word (abfd
, (bfd_byte
*) temp
);
283 /* Read and convert the reserved field. */
285 if (bfd_read ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
287 nlm_variable_header (abfd
)->reserved
= get_word (abfd
, (bfd_byte
*) temp
);
289 /* Read the oldThreadName field. This field is a fixed length string. */
291 if (bfd_read ((PTR
) nlm_variable_header (abfd
)->oldThreadName
,
292 sizeof (nlm_variable_header (abfd
)->oldThreadName
),
294 sizeof (nlm_variable_header (abfd
)->oldThreadName
))
297 /* Read the screen name length and text members. */
299 if (bfd_read ((PTR
) & nlm_variable_header (abfd
)->screenNameLength
,
300 sizeof (nlm_variable_header (abfd
)->screenNameLength
),
302 sizeof (nlm_variable_header (abfd
)->screenNameLength
))
304 if (bfd_read ((PTR
) nlm_variable_header (abfd
)->screenName
,
305 nlm_variable_header (abfd
)->screenNameLength
+ 1,
307 (bfd_size_type
) nlm_variable_header (abfd
)->screenNameLength
+ 1)
310 /* Read the thread name length and text members. */
312 if (bfd_read ((PTR
) & nlm_variable_header (abfd
)->threadNameLength
,
313 sizeof (nlm_variable_header (abfd
)->threadNameLength
),
315 sizeof (nlm_variable_header (abfd
)->threadNameLength
))
317 if (bfd_read ((PTR
) nlm_variable_header (abfd
)->threadName
,
318 nlm_variable_header (abfd
)->threadNameLength
+ 1,
320 (bfd_size_type
) nlm_variable_header (abfd
)->threadNameLength
+ 1)
325 /* Swap and write out the variable length header. All the fields must
326 exist in the NLM, and must exist in this order. */
329 nlm_swap_variable_header_out (abfd
)
332 unsigned char temp
[NLM_TARGET_LONG_SIZE
];
334 /* Write the description length and text members. */
336 if (bfd_write ((PTR
) & nlm_variable_header (abfd
)->descriptionLength
,
337 sizeof (nlm_variable_header (abfd
)->descriptionLength
),
339 sizeof (nlm_variable_header (abfd
)->descriptionLength
))
341 if (bfd_write ((PTR
) nlm_variable_header (abfd
)->descriptionText
,
342 nlm_variable_header (abfd
)->descriptionLength
+ 1,
344 (bfd_size_type
) nlm_variable_header (abfd
)->descriptionLength
+ 1)
347 /* Convert and write the stackSize field. */
349 put_word (abfd
, (bfd_vma
) nlm_variable_header (abfd
)->stackSize
,
351 if (bfd_write ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
354 /* Convert and write the reserved field. */
356 put_word (abfd
, (bfd_vma
) nlm_variable_header (abfd
)->reserved
,
358 if (bfd_write ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
361 /* Write the oldThreadName field. This field is a fixed length string. */
363 if (bfd_write ((PTR
) nlm_variable_header (abfd
)->oldThreadName
,
364 sizeof (nlm_variable_header (abfd
)->oldThreadName
),
366 sizeof (nlm_variable_header (abfd
)->oldThreadName
))
369 /* Write the screen name length and text members. */
371 if (bfd_write ((PTR
) & nlm_variable_header (abfd
)->screenNameLength
,
372 sizeof (nlm_variable_header (abfd
)->screenNameLength
),
374 sizeof (nlm_variable_header (abfd
)->screenNameLength
))
376 if (bfd_write ((PTR
) nlm_variable_header (abfd
)->screenName
,
377 nlm_variable_header (abfd
)->screenNameLength
+ 1,
379 (bfd_size_type
) nlm_variable_header (abfd
)->screenNameLength
+ 1)
382 /* Write the thread name length and text members. */
384 if (bfd_write ((PTR
) & nlm_variable_header (abfd
)->threadNameLength
,
385 sizeof (nlm_variable_header (abfd
)->threadNameLength
),
387 sizeof (nlm_variable_header (abfd
)->threadNameLength
))
389 if (bfd_write ((PTR
) nlm_variable_header (abfd
)->threadName
,
390 nlm_variable_header (abfd
)->threadNameLength
+ 1,
392 (bfd_size_type
) nlm_variable_header (abfd
)->threadNameLength
+ 1)
397 /* Read and swap in the contents of all the auxiliary headers. Because of
398 the braindead design, we have to do strcmps on strings of indeterminate
399 length to figure out what each auxiliary header is. Even worse, we have
400 no way of knowing how many auxiliary headers there are or where the end
401 of the auxiliary headers are, except by finding something that doesn't
402 look like a known auxiliary header. This means that the first new type
403 of auxiliary header added will break all existing tools that don't
407 nlm_swap_auxiliary_headers_in (abfd
)
415 position
= bfd_tell (abfd
);
416 if (bfd_read ((PTR
) tempstr
, sizeof (tempstr
), 1, abfd
) !=
419 if (bfd_seek (abfd
, position
, SEEK_SET
) == -1)
421 if (strncmp (tempstr
, "VeRsIoN#", 8) == 0)
423 Nlm_External_Version_Header thdr
;
424 if (bfd_read ((PTR
) & thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
426 memcpy (nlm_version_header (abfd
)->stamp
, thdr
.stamp
,
427 sizeof (thdr
.stamp
));
428 nlm_version_header (abfd
)->majorVersion
=
429 get_word (abfd
, (bfd_byte
*) thdr
.majorVersion
);
430 nlm_version_header (abfd
)->minorVersion
=
431 get_word (abfd
, (bfd_byte
*) thdr
.minorVersion
);
432 nlm_version_header (abfd
)->revision
=
433 get_word (abfd
, (bfd_byte
*) thdr
.revision
);
434 nlm_version_header (abfd
)->year
=
435 get_word (abfd
, (bfd_byte
*) thdr
.year
);
436 nlm_version_header (abfd
)->month
=
437 get_word (abfd
, (bfd_byte
*) thdr
.month
);
438 nlm_version_header (abfd
)->day
=
439 get_word (abfd
, (bfd_byte
*) thdr
.day
);
441 else if (strncmp (tempstr
, "MeSsAgEs", 8) == 0)
443 Nlm_External_Extended_Header thdr
;
444 if (bfd_read ((PTR
) & thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
446 memcpy (nlm_extended_header (abfd
)->stamp
, thdr
.stamp
,
447 sizeof (thdr
.stamp
));
448 nlm_extended_header (abfd
)->languageID
=
449 get_word (abfd
, (bfd_byte
*) thdr
.languageID
);
450 nlm_extended_header (abfd
)->messageFileOffset
=
451 get_word (abfd
, (bfd_byte
*) thdr
.messageFileOffset
);
452 nlm_extended_header (abfd
)->messageFileLength
=
453 get_word (abfd
, (bfd_byte
*) thdr
.messageFileLength
);
454 nlm_extended_header (abfd
)->messageCount
=
455 get_word (abfd
, (bfd_byte
*) thdr
.messageCount
);
456 nlm_extended_header (abfd
)->helpFileOffset
=
457 get_word (abfd
, (bfd_byte
*) thdr
.helpFileOffset
);
458 nlm_extended_header (abfd
)->helpFileLength
=
459 get_word (abfd
, (bfd_byte
*) thdr
.helpFileLength
);
460 nlm_extended_header (abfd
)->RPCDataOffset
=
461 get_word (abfd
, (bfd_byte
*) thdr
.RPCDataOffset
);
462 nlm_extended_header (abfd
)->RPCDataLength
=
463 get_word (abfd
, (bfd_byte
*) thdr
.RPCDataLength
);
464 nlm_extended_header (abfd
)->sharedCodeOffset
=
465 get_word (abfd
, (bfd_byte
*) thdr
.sharedCodeOffset
);
466 nlm_extended_header (abfd
)->sharedCodeLength
=
467 get_word (abfd
, (bfd_byte
*) thdr
.sharedCodeLength
);
468 nlm_extended_header (abfd
)->sharedDataOffset
=
469 get_word (abfd
, (bfd_byte
*) thdr
.sharedDataOffset
);
470 nlm_extended_header (abfd
)->sharedDataLength
=
471 get_word (abfd
, (bfd_byte
*) thdr
.sharedDataLength
);
472 nlm_extended_header (abfd
)->sharedRelocationFixupOffset
=
473 get_word (abfd
, (bfd_byte
*) thdr
.sharedRelocationFixupOffset
);
474 nlm_extended_header (abfd
)->sharedRelocationFixupCount
=
475 get_word (abfd
, (bfd_byte
*) thdr
.sharedRelocationFixupCount
);
476 nlm_extended_header (abfd
)->sharedExternalReferenceOffset
=
477 get_word (abfd
, (bfd_byte
*) thdr
.sharedExternalReferenceOffset
);
478 nlm_extended_header (abfd
)->sharedExternalReferenceCount
=
479 get_word (abfd
, (bfd_byte
*) thdr
.sharedExternalReferenceCount
);
480 nlm_extended_header (abfd
)->sharedPublicsOffset
=
481 get_word (abfd
, (bfd_byte
*) thdr
.sharedPublicsOffset
);
482 nlm_extended_header (abfd
)->sharedPublicsCount
=
483 get_word (abfd
, (bfd_byte
*) thdr
.sharedPublicsCount
);
484 nlm_extended_header (abfd
)->sharedDebugRecordOffset
=
485 get_word (abfd
, (bfd_byte
*) thdr
.sharedDebugRecordOffset
);
486 nlm_extended_header (abfd
)->sharedDebugRecordCount
=
487 get_word (abfd
, (bfd_byte
*) thdr
.sharedDebugRecordCount
);
488 nlm_extended_header (abfd
)->SharedInitializationOffset
=
489 get_word (abfd
, (bfd_byte
*) thdr
.sharedInitializationOffset
);
490 nlm_extended_header (abfd
)->SharedExitProcedureOffset
=
491 get_word (abfd
, (bfd_byte
*) thdr
.SharedExitProcedureOffset
);
492 nlm_extended_header (abfd
)->productID
=
493 get_word (abfd
, (bfd_byte
*) thdr
.productID
);
494 nlm_extended_header (abfd
)->reserved0
=
495 get_word (abfd
, (bfd_byte
*) thdr
.reserved0
);
496 nlm_extended_header (abfd
)->reserved1
=
497 get_word (abfd
, (bfd_byte
*) thdr
.reserved1
);
498 nlm_extended_header (abfd
)->reserved2
=
499 get_word (abfd
, (bfd_byte
*) thdr
.reserved2
);
500 nlm_extended_header (abfd
)->reserved3
=
501 get_word (abfd
, (bfd_byte
*) thdr
.reserved3
);
502 nlm_extended_header (abfd
)->reserved4
=
503 get_word (abfd
, (bfd_byte
*) thdr
.reserved4
);
504 nlm_extended_header (abfd
)->reserved5
=
505 get_word (abfd
, (bfd_byte
*) thdr
.reserved5
);
507 else if (strncmp (tempstr
, "CoPyRiGhT=", 10) == 0)
509 if (bfd_read ((PTR
) nlm_copyright_header (abfd
)->stamp
,
510 sizeof (nlm_copyright_header (abfd
)->stamp
),
512 != sizeof (nlm_copyright_header (abfd
)->stamp
))
514 if (bfd_read ((PTR
) & (nlm_copyright_header (abfd
)
515 ->copyrightMessageLength
),
518 /* The copyright message is a variable length string. */
519 if (bfd_read ((PTR
) nlm_copyright_header (abfd
)->copyrightMessage
,
520 nlm_copyright_header (abfd
)->copyrightMessageLength
+ 1,
523 nlm_copyright_header (abfd
)->copyrightMessageLength
+ 1))
526 else if (strncmp (tempstr
, "CuStHeAd", 8) == 0)
528 Nlm_External_Custom_Header thdr
;
529 bfd_size_type hdrLength
;
531 bfd_size_type dataLength
;
535 /* Read the stamp ("CuStHeAd"). */
536 if (bfd_read ((PTR
) thdr
.stamp
, 1, sizeof (thdr
.stamp
), abfd
)
537 != sizeof (thdr
.stamp
))
539 /* Read the length of this custom header. */
540 if (bfd_read ((PTR
) thdr
.length
, 1, sizeof (thdr
.length
), abfd
)
541 != sizeof (thdr
.length
))
543 hdrLength
= get_word (abfd
, (bfd_byte
*) thdr
.length
);
544 /* Read further fields if we have them. */
545 if (hdrLength
< NLM_TARGET_LONG_SIZE
)
549 if (bfd_read ((PTR
) thdr
.dataOffset
, 1,
550 sizeof (thdr
.dataOffset
), abfd
)
551 != sizeof (thdr
.dataOffset
))
553 dataOffset
= get_word (abfd
, (bfd_byte
*) thdr
.dataOffset
);
555 if (hdrLength
< 2 * NLM_TARGET_LONG_SIZE
)
559 if (bfd_read ((PTR
) thdr
.dataLength
, 1,
560 sizeof (thdr
.dataLength
), abfd
)
561 != sizeof (thdr
.dataLength
))
563 dataLength
= get_word (abfd
, (bfd_byte
*) thdr
.dataLength
);
565 if (hdrLength
< 2 * NLM_TARGET_LONG_SIZE
+ 8)
566 memset (dataStamp
, 0, sizeof (dataStamp
));
569 if (bfd_read ((PTR
) dataStamp
, 1, sizeof (dataStamp
), abfd
)
570 != sizeof (dataStamp
))
574 /* Read the rest of the header, if any. */
575 if (hdrLength
<= 2 * NLM_TARGET_LONG_SIZE
+ 8)
582 hdrLength
-= 2 * NLM_TARGET_LONG_SIZE
+ 8;
583 hdr
= bfd_alloc (abfd
, hdrLength
);
586 if (bfd_read (hdr
, 1, hdrLength
, abfd
) != hdrLength
)
590 /* If we have found a Cygnus header, process it. Otherwise,
591 just save the associated data without trying to interpret
593 if (strncmp (dataStamp
, "CyGnUsEx", 8) == 0)
599 BFD_ASSERT (hdrLength
== 0 && hdr
== NULL
);
601 pos
= bfd_tell (abfd
);
602 if (bfd_seek (abfd
, dataOffset
, SEEK_SET
) != 0)
604 contents
= (bfd_byte
*) bfd_alloc (abfd
, dataLength
);
605 if (contents
== NULL
)
607 if (bfd_read (contents
, 1, dataLength
, abfd
) != dataLength
)
609 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
612 memcpy (nlm_cygnus_ext_header (abfd
), "CyGnUsEx", 8);
613 nlm_cygnus_ext_header (abfd
)->offset
= dataOffset
;
614 nlm_cygnus_ext_header (abfd
)->length
= dataLength
;
616 /* This data this header points to provides a list of
617 the sections which were in the original object file
618 which was converted to become an NLM. We locate
619 those sections and add them to the BFD. Note that
620 this is likely to create a second .text, .data and
621 .bss section; retrieving the sections by name will
622 get the actual NLM sections, which is what we want to
623 happen. The sections from the original file, which
624 may be subsets of the NLM section, can only be found
625 using bfd_map_over_sections. */
627 pend
= p
+ dataLength
;
636 /* The format of this information is
637 null terminated section name
638 zeroes to adjust to 4 byte boundary
639 4 byte section data file pointer
644 l
= strlen (name
) + 1;
647 filepos
= bfd_h_get_32 (abfd
, p
);
649 size
= bfd_h_get_32 (abfd
, p
);
652 newsec
= bfd_make_section_anyway (abfd
, name
);
653 if (newsec
== (asection
*) NULL
)
655 newsec
->_raw_size
= size
;
658 newsec
->filepos
= filepos
;
659 newsec
->flags
|= SEC_HAS_CONTENTS
;
665 memcpy (nlm_custom_header (abfd
)->stamp
, thdr
.stamp
,
666 sizeof (thdr
.stamp
));
667 nlm_custom_header (abfd
)->hdrLength
= hdrLength
;
668 nlm_custom_header (abfd
)->dataOffset
= dataOffset
;
669 nlm_custom_header (abfd
)->dataLength
= dataLength
;
670 memcpy (nlm_custom_header (abfd
)->dataStamp
, dataStamp
,
672 nlm_custom_header (abfd
)->hdr
= hdr
;
683 /* Return whether there is a non-zero byte in a memory block. */
686 find_nonzero (buf
, size
)
690 char *p
= (char *) buf
;
698 /* Swap out the contents of the auxiliary headers. We create those
699 auxiliary headers which have been set non-zero. We do not require
700 the caller to set up the stamp fields. */
703 nlm_swap_auxiliary_headers_out (abfd
)
706 /* Write out the version header if there is one. */
707 if (find_nonzero ((PTR
) nlm_version_header (abfd
),
708 sizeof (Nlm_Internal_Version_Header
)))
710 Nlm_External_Version_Header thdr
;
712 memcpy (thdr
.stamp
, "VeRsIoN#", 8);
713 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->majorVersion
,
714 (bfd_byte
*) thdr
.majorVersion
);
715 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->minorVersion
,
716 (bfd_byte
*) thdr
.minorVersion
);
717 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->revision
,
718 (bfd_byte
*) thdr
.revision
);
719 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->year
,
720 (bfd_byte
*) thdr
.year
);
721 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->month
,
722 (bfd_byte
*) thdr
.month
);
723 put_word (abfd
, (bfd_vma
) nlm_version_header (abfd
)->day
,
724 (bfd_byte
*) thdr
.day
);
725 if (bfd_write ((PTR
) & thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
729 /* Write out the extended header if there is one. */
730 if (find_nonzero ((PTR
) nlm_extended_header (abfd
),
731 sizeof (Nlm_Internal_Extended_Header
)))
733 Nlm_External_Extended_Header thdr
;
735 memcpy (thdr
.stamp
, "MeSsAgEs", 8);
737 (bfd_vma
) nlm_extended_header (abfd
)->languageID
,
738 (bfd_byte
*) thdr
.languageID
);
740 (bfd_vma
) nlm_extended_header (abfd
)->messageFileOffset
,
741 (bfd_byte
*) thdr
.messageFileOffset
);
743 (bfd_vma
) nlm_extended_header (abfd
)->messageFileLength
,
744 (bfd_byte
*) thdr
.messageFileLength
);
746 (bfd_vma
) nlm_extended_header (abfd
)->messageCount
,
747 (bfd_byte
*) thdr
.messageCount
);
749 (bfd_vma
) nlm_extended_header (abfd
)->helpFileOffset
,
750 (bfd_byte
*) thdr
.helpFileOffset
);
752 (bfd_vma
) nlm_extended_header (abfd
)->helpFileLength
,
753 (bfd_byte
*) thdr
.helpFileLength
);
755 (bfd_vma
) nlm_extended_header (abfd
)->RPCDataOffset
,
756 (bfd_byte
*) thdr
.RPCDataOffset
);
758 (bfd_vma
) nlm_extended_header (abfd
)->RPCDataLength
,
759 (bfd_byte
*) thdr
.RPCDataLength
);
761 (bfd_vma
) nlm_extended_header (abfd
)->sharedCodeOffset
,
762 (bfd_byte
*) thdr
.sharedCodeOffset
);
764 (bfd_vma
) nlm_extended_header (abfd
)->sharedCodeLength
,
765 (bfd_byte
*) thdr
.sharedCodeLength
);
767 (bfd_vma
) nlm_extended_header (abfd
)->sharedDataOffset
,
768 (bfd_byte
*) thdr
.sharedDataOffset
);
770 (bfd_vma
) nlm_extended_header (abfd
)->sharedDataLength
,
771 (bfd_byte
*) thdr
.sharedDataLength
);
773 (bfd_vma
) nlm_extended_header (abfd
)->sharedRelocationFixupOffset
,
774 (bfd_byte
*) thdr
.sharedRelocationFixupOffset
);
776 (bfd_vma
) nlm_extended_header (abfd
)->sharedRelocationFixupCount
,
777 (bfd_byte
*) thdr
.sharedRelocationFixupCount
);
779 (bfd_vma
) nlm_extended_header (abfd
)->sharedExternalReferenceOffset
,
780 (bfd_byte
*) thdr
.sharedExternalReferenceOffset
);
782 (bfd_vma
) nlm_extended_header (abfd
)->sharedExternalReferenceCount
,
783 (bfd_byte
*) thdr
.sharedExternalReferenceCount
);
785 (bfd_vma
) nlm_extended_header (abfd
)->sharedPublicsOffset
,
786 (bfd_byte
*) thdr
.sharedPublicsOffset
);
788 (bfd_vma
) nlm_extended_header (abfd
)->sharedPublicsCount
,
789 (bfd_byte
*) thdr
.sharedPublicsCount
);
791 (bfd_vma
) nlm_extended_header (abfd
)->sharedDebugRecordOffset
,
792 (bfd_byte
*) thdr
.sharedDebugRecordOffset
);
794 (bfd_vma
) nlm_extended_header (abfd
)->sharedDebugRecordCount
,
795 (bfd_byte
*) thdr
.sharedDebugRecordCount
);
797 (bfd_vma
) nlm_extended_header (abfd
)->SharedInitializationOffset
,
798 (bfd_byte
*) thdr
.sharedInitializationOffset
);
800 (bfd_vma
) nlm_extended_header (abfd
)->SharedExitProcedureOffset
,
801 (bfd_byte
*) thdr
.SharedExitProcedureOffset
);
803 (bfd_vma
) nlm_extended_header (abfd
)->productID
,
804 (bfd_byte
*) thdr
.productID
);
806 (bfd_vma
) nlm_extended_header (abfd
)->reserved0
,
807 (bfd_byte
*) thdr
.reserved0
);
809 (bfd_vma
) nlm_extended_header (abfd
)->reserved1
,
810 (bfd_byte
*) thdr
.reserved1
);
812 (bfd_vma
) nlm_extended_header (abfd
)->reserved2
,
813 (bfd_byte
*) thdr
.reserved2
);
815 (bfd_vma
) nlm_extended_header (abfd
)->reserved3
,
816 (bfd_byte
*) thdr
.reserved3
);
818 (bfd_vma
) nlm_extended_header (abfd
)->reserved4
,
819 (bfd_byte
*) thdr
.reserved4
);
821 (bfd_vma
) nlm_extended_header (abfd
)->reserved5
,
822 (bfd_byte
*) thdr
.reserved5
);
823 if (bfd_write ((PTR
) & thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
828 /* Write out the copyright header if there is one. */
829 if (find_nonzero ((PTR
) nlm_copyright_header (abfd
),
830 sizeof (Nlm_Internal_Copyright_Header
)))
832 Nlm_External_Copyright_Header thdr
;
834 memcpy (thdr
.stamp
, "CoPyRiGhT=", 10);
835 if (bfd_write ((PTR
) thdr
.stamp
, sizeof (thdr
.stamp
), 1, abfd
)
836 != sizeof (thdr
.stamp
))
838 thdr
.copyrightMessageLength
[0] =
839 nlm_copyright_header (abfd
)->copyrightMessageLength
;
840 if (bfd_write ((PTR
) thdr
.copyrightMessageLength
, 1, 1, abfd
) != 1)
842 /* The copyright message is a variable length string. */
843 if (bfd_write ((PTR
) nlm_copyright_header (abfd
)->copyrightMessage
,
844 nlm_copyright_header (abfd
)->copyrightMessageLength
+ 1,
847 nlm_copyright_header (abfd
)->copyrightMessageLength
+ 1))
851 /* Write out the custom header if there is one. */
852 if (find_nonzero ((PTR
) nlm_custom_header (abfd
),
853 sizeof (Nlm_Internal_Custom_Header
)))
855 Nlm_External_Custom_Header thdr
;
857 bfd_size_type hdrLength
;
859 ds
= find_nonzero ((PTR
) nlm_custom_header (abfd
)->dataStamp
,
860 sizeof (nlm_custom_header (abfd
)->dataStamp
));
861 memcpy (thdr
.stamp
, "CuStHeAd", 8);
862 hdrLength
= (2 * NLM_TARGET_LONG_SIZE
+ (ds
? 8 : 0)
863 + nlm_custom_header (abfd
)->hdrLength
);
864 put_word (abfd
, hdrLength
, thdr
.length
);
865 put_word (abfd
, (bfd_vma
) nlm_custom_header (abfd
)->dataOffset
,
867 put_word (abfd
, (bfd_vma
) nlm_custom_header (abfd
)->dataLength
,
871 BFD_ASSERT (nlm_custom_header (abfd
)->hdrLength
== 0);
872 if (bfd_write ((PTR
) &thdr
, 1,
873 sizeof (thdr
) - sizeof (thdr
.dataStamp
), abfd
)
874 != sizeof (thdr
) - sizeof (thdr
.dataStamp
))
879 memcpy (thdr
.dataStamp
, nlm_custom_header (abfd
)->dataStamp
,
880 sizeof (thdr
.dataStamp
));
881 if (bfd_write ((PTR
) &thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
883 if (bfd_write (nlm_custom_header (abfd
)->hdr
, 1,
884 nlm_custom_header (abfd
)->hdrLength
, abfd
)
885 != nlm_custom_header (abfd
)->hdrLength
)
890 /* Write out the Cygnus debugging header if there is one. */
891 if (find_nonzero ((PTR
) nlm_cygnus_ext_header (abfd
),
892 sizeof (Nlm_Internal_Cygnus_Ext_Header
)))
894 Nlm_External_Custom_Header thdr
;
896 memcpy (thdr
.stamp
, "CuStHeAd", 8);
897 put_word (abfd
, (bfd_vma
) 2 * NLM_TARGET_LONG_SIZE
+ 8,
898 (bfd_byte
*) thdr
.length
);
899 put_word (abfd
, (bfd_vma
) nlm_cygnus_ext_header (abfd
)->offset
,
900 (bfd_byte
*) thdr
.dataOffset
);
901 put_word (abfd
, (bfd_vma
) nlm_cygnus_ext_header (abfd
)->length
,
902 (bfd_byte
*) thdr
.dataLength
);
903 memcpy (thdr
.dataStamp
, "CyGnUsEx", 8);
904 if (bfd_write ((PTR
) &thdr
, sizeof (thdr
), 1, abfd
) != sizeof (thdr
))
911 /* We read the NLM's public symbols and use it to generate a bfd symbol
912 table (hey, it's better than nothing) on a one-for-one basis. Thus
913 use the number of public symbols as the number of bfd symbols we will
914 have once we actually get around to reading them in.
916 Return the number of bytes required to hold the symtab vector, based on
917 the count plus 1, since we will NULL terminate the vector allocated based
921 nlm_get_symtab_upper_bound (abfd
)
924 Nlm_Internal_Fixed_Header
*i_fxdhdrp
; /* Nlm file header, internal form */
926 long symtab_size
= 0;
928 i_fxdhdrp
= nlm_fixed_header (abfd
);
929 symcount
= (i_fxdhdrp
->numberOfPublics
930 + i_fxdhdrp
->numberOfDebugRecords
931 + i_fxdhdrp
->numberOfExternalReferences
);
932 symtab_size
= (symcount
+ 1) * (sizeof (asymbol
));
933 return (symtab_size
);
936 /* Note that bfd_get_symcount is guaranteed to be zero if slurping the
937 symbol table fails. */
940 nlm_get_symtab (abfd
, alocation
)
944 nlm_symbol_type
*symbase
;
945 bfd_size_type counter
= 0;
947 if (nlm_slurp_symbol_table (abfd
) == false)
949 symbase
= nlm_get_symbols (abfd
);
950 while (counter
< bfd_get_symcount (abfd
))
952 *alocation
++ = &symbase
->symbol
;
956 *alocation
= (asymbol
*) NULL
;
957 return bfd_get_symcount (abfd
);
960 /* Make an NLM symbol. There is nothing special to do here. */
963 nlm_make_empty_symbol (abfd
)
966 nlm_symbol_type
*new;
968 new = (nlm_symbol_type
*) bfd_zalloc (abfd
, sizeof (nlm_symbol_type
));
970 new->symbol
.the_bfd
= abfd
;
974 /* Get symbol information. */
977 nlm_get_symbol_info (ignore_abfd
, symbol
, ret
)
982 bfd_symbol_info (symbol
, ret
);
985 /* Print symbol information. */
988 nlm_print_symbol (abfd
, afile
, symbol
, how
)
992 bfd_print_symbol_type how
;
994 FILE *file
= (FILE *) afile
;
998 case bfd_print_symbol_name
:
999 case bfd_print_symbol_more
:
1001 fprintf (file
, "%s", symbol
->name
);
1003 case bfd_print_symbol_all
:
1004 bfd_print_symbol_vandf ((PTR
) file
, symbol
);
1005 fprintf (file
, " %-5s", symbol
->section
->name
);
1007 fprintf (file
, " %s", symbol
->name
);
1012 /* Slurp in nlm symbol table.
1014 In the external (in-file) form, NLM export records are variable length,
1015 with the following form:
1017 1 byte length of the symbol name (N)
1018 N bytes the symbol name
1019 4 bytes the symbol offset from start of it's section
1021 We also read in the debugging symbols and import records. Import
1022 records are treated as undefined symbols. As we read the import
1023 records we also read in the associated reloc information, which is
1024 attached to the symbol.
1026 The bfd symbols are copied to SYMPTRS.
1028 When we return, the bfd symcount is either zero or contains the correct
1033 nlm_slurp_symbol_table (abfd
)
1036 Nlm_Internal_Fixed_Header
*i_fxdhdrp
; /* Nlm file header, internal form */
1037 bfd_size_type totsymcount
; /* Number of NLM symbols */
1038 bfd_size_type symcount
; /* Counter of NLM symbols */
1039 nlm_symbol_type
*sym
; /* Pointer to current bfd symbol */
1040 unsigned char symlength
; /* Symbol length read into here */
1041 unsigned char symtype
; /* Type of debugging symbol */
1042 bfd_byte temp
[NLM_TARGET_LONG_SIZE
]; /* Symbol offsets read into here */
1043 boolean (*read_import_func
) PARAMS ((bfd
*, nlm_symbol_type
*));
1044 boolean (*set_public_section_func
) PARAMS ((bfd
*, nlm_symbol_type
*));
1046 if (nlm_get_symbols (abfd
) != NULL
)
1049 /* Read each raw NLM symbol, using the information to create a canonical bfd
1052 Note that we allocate the initial bfd canonical symbol buffer based on a
1053 one-to-one mapping of the NLM symbols to canonical symbols. We actually
1054 use all the NLM symbols, so there will be no space left over at the end.
1055 When we have all the symbols, we build the caller's pointer vector. */
1058 i_fxdhdrp
= nlm_fixed_header (abfd
);
1059 totsymcount
= (i_fxdhdrp
->numberOfPublics
1060 + i_fxdhdrp
->numberOfDebugRecords
1061 + i_fxdhdrp
->numberOfExternalReferences
);
1062 if (totsymcount
== 0)
1067 if (bfd_seek (abfd
, i_fxdhdrp
->publicsOffset
, SEEK_SET
) == -1)
1070 sym
= ((nlm_symbol_type
*)
1071 bfd_zalloc (abfd
, totsymcount
* sizeof (nlm_symbol_type
)));
1074 nlm_set_symbols (abfd
, sym
);
1076 /* We use the bfd's symcount directly as the control count, so that early
1077 termination of the loop leaves the symcount correct for the symbols that
1080 set_public_section_func
= nlm_set_public_section_func (abfd
);
1081 symcount
= i_fxdhdrp
->numberOfPublics
;
1082 while (abfd
->symcount
< symcount
)
1084 if (bfd_read ((PTR
) & symlength
, sizeof (symlength
), 1, abfd
)
1085 != sizeof (symlength
))
1087 sym
->symbol
.the_bfd
= abfd
;
1088 sym
->symbol
.name
= bfd_alloc (abfd
, symlength
+ 1);
1089 if (!sym
->symbol
.name
)
1091 if (bfd_read ((PTR
) sym
->symbol
.name
, symlength
, 1, abfd
)
1094 /* Cast away const. */
1095 ((char *) (sym
->symbol
.name
))[symlength
] = '\0';
1096 if (bfd_read ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
1098 sym
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
1099 sym
->symbol
.value
= get_word (abfd
, temp
);
1100 if (set_public_section_func
)
1102 /* Most backends can use the code below, but unfortunately
1103 some use a different scheme. */
1104 if ((*set_public_section_func
) (abfd
, sym
) == false)
1109 if (sym
->symbol
.value
& NLM_HIBIT
)
1111 sym
->symbol
.value
&= ~NLM_HIBIT
;
1112 sym
->symbol
.flags
|= BSF_FUNCTION
;
1113 sym
->symbol
.section
=
1114 bfd_get_section_by_name (abfd
, NLM_CODE_NAME
);
1118 sym
->symbol
.section
=
1119 bfd_get_section_by_name (abfd
, NLM_INITIALIZED_DATA_NAME
);
1127 /* Read the debugging records. */
1129 if (i_fxdhdrp
->numberOfDebugRecords
> 0)
1131 if (bfd_seek (abfd
, i_fxdhdrp
->debugInfoOffset
, SEEK_SET
) == -1)
1134 symcount
+= i_fxdhdrp
->numberOfDebugRecords
;
1135 while (abfd
->symcount
< symcount
)
1137 if ((bfd_read ((PTR
) & symtype
, sizeof (symtype
), 1, abfd
)
1138 != sizeof (symtype
))
1139 || bfd_read ((PTR
) temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
)
1140 || (bfd_read ((PTR
) & symlength
, sizeof (symlength
), 1, abfd
)
1141 != sizeof (symlength
)))
1143 sym
->symbol
.the_bfd
= abfd
;
1144 sym
->symbol
.name
= bfd_alloc (abfd
, symlength
+ 1);
1145 if (!sym
->symbol
.name
)
1147 if (bfd_read ((PTR
) sym
->symbol
.name
, symlength
, 1, abfd
)
1150 /* Cast away const. */
1151 ((char *) (sym
->symbol
.name
))[symlength
] = '\0';
1152 sym
->symbol
.flags
= BSF_LOCAL
;
1153 sym
->symbol
.value
= get_word (abfd
, temp
);
1156 sym
->symbol
.section
=
1157 bfd_get_section_by_name (abfd
, NLM_INITIALIZED_DATA_NAME
);
1159 else if (symtype
== 1)
1161 sym
->symbol
.flags
|= BSF_FUNCTION
;
1162 sym
->symbol
.section
=
1163 bfd_get_section_by_name (abfd
, NLM_CODE_NAME
);
1167 sym
->symbol
.section
= bfd_abs_section_ptr
;
1175 /* Read in the import records. We can only do this if we know how
1176 to read relocs for this target. */
1178 read_import_func
= nlm_read_import_func (abfd
);
1179 if (read_import_func
!= NULL
)
1181 if (bfd_seek (abfd
, i_fxdhdrp
->externalReferencesOffset
, SEEK_SET
)
1185 symcount
+= i_fxdhdrp
->numberOfExternalReferences
;
1186 while (abfd
->symcount
< symcount
)
1188 if ((*read_import_func
) (abfd
, sym
) == false)
1198 /* Get the relocs for an NLM file. There are two types of relocs.
1199 Imports are relocs against symbols defined in other NLM files. We
1200 treat these as relocs against global symbols. Relocation fixups
1201 are internal relocs.
1203 The actual format used to store the relocs is machine specific. */
1205 /* Read in the relocation fixup information. This is stored in
1206 nlm_relocation_fixups, an array of arelent structures, and
1207 nlm_relocation_fixup_secs, an array of section pointers. The
1208 section pointers are needed because the relocs are not sorted by
1212 nlm_slurp_reloc_fixups (abfd
)
1215 boolean (*read_func
) PARAMS ((bfd
*, nlm_symbol_type
*, asection
**,
1217 bfd_size_type count
;
1221 if (nlm_relocation_fixups (abfd
) != NULL
)
1223 read_func
= nlm_read_reloc_func (abfd
);
1224 if (read_func
== NULL
)
1227 if (bfd_seek (abfd
, nlm_fixed_header (abfd
)->relocationFixupOffset
,
1231 count
= nlm_fixed_header (abfd
)->numberOfRelocationFixups
;
1232 rels
= (arelent
*) bfd_alloc (abfd
, count
* sizeof (arelent
));
1233 secs
= (asection
**) bfd_alloc (abfd
, count
* sizeof (asection
*));
1234 if ((rels
== NULL
|| secs
== NULL
) && count
!= 0)
1236 nlm_relocation_fixups (abfd
) = rels
;
1237 nlm_relocation_fixup_secs (abfd
) = secs
;
1239 /* We have to read piece by piece, because we don't know how large
1240 the machine specific reloc information is. */
1241 while (count
-- != 0)
1243 if ((*read_func
) (abfd
, (nlm_symbol_type
*) NULL
, secs
, rels
) == false)
1245 nlm_relocation_fixups (abfd
) = NULL
;
1246 nlm_relocation_fixup_secs (abfd
) = NULL
;
1256 /* Get the number of relocs. This really just returns an upper bound,
1257 since it does not attempt to distinguish them based on the section.
1258 That will be handled when they are actually read. */
1261 nlm_get_reloc_upper_bound (abfd
, sec
)
1265 nlm_symbol_type
*syms
;
1266 bfd_size_type count
;
1269 /* If we don't know how to read relocs, just return 0. */
1270 if (nlm_read_reloc_func (abfd
) == NULL
)
1272 /* Make sure we have either the code or the data section. */
1273 if ((bfd_get_section_flags (abfd
, sec
) & (SEC_CODE
| SEC_DATA
)) == 0)
1276 syms
= nlm_get_symbols (abfd
);
1279 if (nlm_slurp_symbol_table (abfd
) == false)
1281 syms
= nlm_get_symbols (abfd
);
1284 ret
= nlm_fixed_header (abfd
)->numberOfRelocationFixups
;
1286 count
= bfd_get_symcount (abfd
);
1287 while (count
-- != 0)
1293 return (ret
+ 1) * sizeof (arelent
*);
1296 /* Get the relocs themselves. */
1299 nlm_canonicalize_reloc (abfd
, sec
, relptr
, symbols
)
1307 bfd_size_type count
, i
;
1310 /* Get the relocation fixups. */
1311 rels
= nlm_relocation_fixups (abfd
);
1314 if (nlm_slurp_reloc_fixups (abfd
) == false)
1316 rels
= nlm_relocation_fixups (abfd
);
1318 secs
= nlm_relocation_fixup_secs (abfd
);
1321 count
= nlm_fixed_header (abfd
)->numberOfRelocationFixups
;
1322 for (i
= 0; i
< count
; i
++, rels
++, secs
++)
1331 /* Get the import symbols. */
1332 count
= bfd_get_symcount (abfd
);
1333 for (i
= 0; i
< count
; i
++, symbols
++)
1338 if (bfd_asymbol_flavour (sym
) == bfd_target_nlm_flavour
)
1340 nlm_symbol_type
*nlm_sym
;
1343 nlm_sym
= (nlm_symbol_type
*) sym
;
1344 for (j
= 0; j
< nlm_sym
->rcnt
; j
++)
1346 if (nlm_sym
->relocs
[j
].section
== sec
)
1348 *relptr
= &nlm_sym
->relocs
[j
].reloc
;
1349 (*relptr
)->sym_ptr_ptr
= symbols
;
1362 /* Compute the section file positions for an NLM file. All variable
1363 length data in the file headers must be set before this function is
1364 called. If the variable length data is changed later, the
1365 resulting object file will be incorrect. Unfortunately, there is
1366 no way to check this.
1368 This routine also sets the Size and Offset fields in the fixed
1371 It also looks over the symbols and moves any common symbols into
1372 the .bss section; NLM has no way to represent a common symbol.
1373 This approach means that either the symbols must already have been
1374 set at this point, or there must be no common symbols. We need to
1375 move the symbols at this point so that mangle_relocs can see the
1379 nlm_compute_section_file_positions (abfd
)
1384 bfd_vma text
, data
, bss
;
1385 bfd_vma text_low
, data_low
;
1386 unsigned int text_align
, data_align
, other_align
;
1387 file_ptr text_ptr
, data_ptr
, other_ptr
;
1389 asymbol
**sym_ptr_ptr
;
1391 if (abfd
->output_has_begun
== true)
1394 /* Make sure we have a section to hold uninitialized data. */
1395 bss_sec
= bfd_get_section_by_name (abfd
, NLM_UNINITIALIZED_DATA_NAME
);
1396 if (bss_sec
== NULL
)
1398 if (!add_bfd_section (abfd
, NLM_UNINITIALIZED_DATA_NAME
,
1399 (file_ptr
) 0, (bfd_size_type
) 0,
1402 bss_sec
= bfd_get_section_by_name (abfd
, NLM_UNINITIALIZED_DATA_NAME
);
1405 abfd
->output_has_begun
= true;
1407 /* The fixed header. */
1408 sofar
= nlm_optional_prefix_size (abfd
) + nlm_fixed_header_size (abfd
);
1410 /* The variable header. */
1411 sofar
+= (sizeof (nlm_variable_header (abfd
)->descriptionLength
)
1412 + nlm_variable_header (abfd
)->descriptionLength
+ 1
1413 + NLM_TARGET_LONG_SIZE
/* stackSize */
1414 + NLM_TARGET_LONG_SIZE
/* reserved */
1415 + sizeof (nlm_variable_header (abfd
)->oldThreadName
)
1416 + sizeof (nlm_variable_header (abfd
)->screenNameLength
)
1417 + nlm_variable_header (abfd
)->screenNameLength
+ 1
1418 + sizeof (nlm_variable_header (abfd
)->threadNameLength
)
1419 + nlm_variable_header (abfd
)->threadNameLength
+ 1);
1421 /* The auxiliary headers. */
1422 if (find_nonzero ((PTR
) nlm_version_header (abfd
),
1423 sizeof (Nlm_Internal_Version_Header
)))
1424 sofar
+= sizeof (Nlm_External_Version_Header
);
1425 if (find_nonzero ((PTR
) nlm_extended_header (abfd
),
1426 sizeof (Nlm_Internal_Extended_Header
)))
1427 sofar
+= sizeof (Nlm_External_Extended_Header
);
1428 if (find_nonzero ((PTR
) nlm_copyright_header (abfd
),
1429 sizeof (Nlm_Internal_Copyright_Header
)))
1430 sofar
+= (sizeof (Nlm_External_Copyright_Header
)
1431 + nlm_copyright_header (abfd
)->copyrightMessageLength
+ 1);
1432 if (find_nonzero ((PTR
) nlm_custom_header (abfd
),
1433 sizeof (Nlm_Internal_Custom_Header
)))
1434 sofar
+= (sizeof (Nlm_External_Custom_Header
)
1435 + nlm_custom_header (abfd
)->hdrLength
);
1436 if (find_nonzero ((PTR
) nlm_cygnus_ext_header (abfd
),
1437 sizeof (Nlm_Internal_Cygnus_Ext_Header
)))
1438 sofar
+= sizeof (Nlm_External_Custom_Header
);
1440 /* Compute the section file positions in two passes. First get the
1441 sizes of the text and data sections, and then set the file
1442 positions. This code aligns the sections in the file using the
1443 same alignment restrictions that apply to the sections in memory;
1444 this may not be necessary. */
1446 text_low
= (bfd_vma
) - 1;
1449 data_low
= (bfd_vma
) - 1;
1453 for (sec
= abfd
->sections
; sec
!= (asection
*) NULL
; sec
= sec
->next
)
1457 sec
->_raw_size
= BFD_ALIGN (sec
->_raw_size
, 1 << sec
->alignment_power
);
1459 f
= bfd_get_section_flags (abfd
, sec
);
1462 text
+= sec
->_raw_size
;
1463 if (bfd_get_section_vma (abfd
, sec
) < text_low
)
1464 text_low
= bfd_get_section_vma (abfd
, sec
);
1465 if (sec
->alignment_power
> text_align
)
1466 text_align
= sec
->alignment_power
;
1468 else if (f
& SEC_DATA
)
1470 data
+= sec
->_raw_size
;
1471 if (bfd_get_section_vma (abfd
, sec
) < data_low
)
1472 data_low
= bfd_get_section_vma (abfd
, sec
);
1473 if (sec
->alignment_power
> data_align
)
1474 data_align
= sec
->alignment_power
;
1476 else if (f
& SEC_HAS_CONTENTS
)
1478 if (sec
->alignment_power
> other_align
)
1479 other_align
= sec
->alignment_power
;
1481 else if (f
& SEC_ALLOC
)
1482 bss
+= sec
->_raw_size
;
1485 nlm_set_text_low (abfd
, text_low
);
1486 nlm_set_data_low (abfd
, data_low
);
1488 if (nlm_no_uninitialized_data (abfd
))
1490 /* This NetWare format does not use uninitialized data. We must
1491 increase the size of the data section. We will never wind up
1492 writing those file locations, so they will remain zero. */
1497 text_ptr
= BFD_ALIGN (sofar
, 1 << text_align
);
1498 data_ptr
= BFD_ALIGN (text_ptr
+ text
, 1 << data_align
);
1499 other_ptr
= BFD_ALIGN (data_ptr
+ data
, 1 << other_align
);
1501 /* Fill in some fields in the header for which we now have the
1503 nlm_fixed_header (abfd
)->codeImageOffset
= text_ptr
;
1504 nlm_fixed_header (abfd
)->codeImageSize
= text
;
1505 nlm_fixed_header (abfd
)->dataImageOffset
= data_ptr
;
1506 nlm_fixed_header (abfd
)->dataImageSize
= data
;
1507 nlm_fixed_header (abfd
)->uninitializedDataSize
= bss
;
1509 for (sec
= abfd
->sections
; sec
!= (asection
*) NULL
; sec
= sec
->next
)
1513 f
= bfd_get_section_flags (abfd
, sec
);
1517 sec
->filepos
= text_ptr
;
1518 text_ptr
+= sec
->_raw_size
;
1520 else if (f
& SEC_DATA
)
1522 sec
->filepos
= data_ptr
;
1523 data_ptr
+= sec
->_raw_size
;
1525 else if (f
& SEC_HAS_CONTENTS
)
1527 sec
->filepos
= other_ptr
;
1528 other_ptr
+= sec
->_raw_size
;
1532 nlm_fixed_header (abfd
)->relocationFixupOffset
= other_ptr
;
1534 /* Move all common symbols into the .bss section. */
1536 sym_ptr_ptr
= bfd_get_outsymbols (abfd
);
1537 if (sym_ptr_ptr
!= NULL
)
1542 sym_end
= sym_ptr_ptr
+ bfd_get_symcount (abfd
);
1544 for (; sym_ptr_ptr
< sym_end
; sym_ptr_ptr
++)
1551 if (!bfd_is_com_section (bfd_get_section (sym
)))
1554 /* Put the common symbol in the .bss section, and increase
1555 the size of the .bss section by the size of the common
1556 symbol (which is the old value of the symbol). */
1557 sym
->section
= bss_sec
;
1559 sym
->value
= bss_sec
->_raw_size
+ add
;
1561 add
= BFD_ALIGN (add
, 1 << bss_sec
->alignment_power
);
1565 if (nlm_no_uninitialized_data (abfd
))
1567 /* We could handle this case, but so far it hasn't been
1571 nlm_fixed_header (abfd
)->uninitializedDataSize
+= add
;
1572 bss_sec
->_raw_size
+= add
;
1579 /* Set the contents of a section. To do this we need to know where
1580 the section is going to be located in the output file. That means
1581 that the sizes of all the sections must be set, and all the
1582 variable size header information must be known. */
1585 nlm_set_section_contents (abfd
, section
, location
, offset
, count
)
1590 bfd_size_type count
;
1592 if (abfd
->output_has_begun
== false
1593 && nlm_compute_section_file_positions (abfd
) == false)
1599 /* i386 NetWare has a very restricted set of relocs. In order for
1600 objcopy to work, the NLM i386 backend needs a chance to rework
1601 the section contents so that its set of relocs will work. If all
1602 the relocs are already acceptable, this will not do anything. */
1603 if (section
->reloc_count
!= 0)
1605 boolean (*mangle_relocs_func
) PARAMS ((bfd
*, asection
*, PTR
,
1606 bfd_vma
, bfd_size_type
));
1608 mangle_relocs_func
= nlm_mangle_relocs_func (abfd
);
1609 if (mangle_relocs_func
!= NULL
)
1611 if (!(*mangle_relocs_func
) (abfd
, section
, location
,
1612 (bfd_vma
) offset
, count
))
1617 if (bfd_seek (abfd
, (file_ptr
) (section
->filepos
+ offset
), SEEK_SET
) != 0
1618 || bfd_write (location
, 1, count
, abfd
) != count
)
1624 /* We need to sort a list of relocs associated with sections when we
1625 write out the external relocs. */
1628 nlm_external_reloc_compare (p1
, p2
)
1632 const struct reloc_and_sec
*r1
= (const struct reloc_and_sec
*) p1
;
1633 const struct reloc_and_sec
*r2
= (const struct reloc_and_sec
*) p2
;
1636 cmp
= strcmp ((*r1
->rel
->sym_ptr_ptr
)->name
,
1637 (*r2
->rel
->sym_ptr_ptr
)->name
);
1641 /* We sort by address within symbol to make the sort more stable and
1642 increase the chances that different hosts will generate bit for
1643 bit equivalent results. */
1644 return (int) (r1
->rel
->address
- r2
->rel
->address
);
1647 /* Write out an NLM file. We write out the information in this order:
1653 other sections (custom data, messages, help, shared NLM, RPC,
1654 module dependencies)
1656 external references (imports)
1657 public symbols (exports)
1659 This is similar to the order used by the NetWare tools; the
1660 difference is that NetWare puts the sections other than code, data
1661 and custom data at the end of the NLM. It is convenient for us to
1662 know where the sections are going to be before worrying about the
1663 size of the other information.
1665 By the time this function is called, all the section data should
1666 have been output using set_section_contents. Note that custom
1667 data, the message file, the help file, the shared NLM file, the RPC
1668 data, and the module dependencies are all considered to be
1669 sections; the caller is responsible for filling in the offset and
1670 length fields in the NLM headers. The relocation fixups and
1671 imports are both obtained from the list of relocs attached to each
1672 section. The exports and debugging records are obtained from the
1673 list of outsymbols. */
1676 nlm_write_object_contents (abfd
)
1680 boolean (*write_import_func
) PARAMS ((bfd
*, asection
*, arelent
*));
1681 bfd_size_type external_reloc_count
, internal_reloc_count
, i
, c
;
1682 struct reloc_and_sec
*external_relocs
;
1683 asymbol
**sym_ptr_ptr
;
1685 boolean (*write_prefix_func
) PARAMS ((bfd
*));
1686 unsigned char *fixed_header
= NULL
;
1688 fixed_header
= ((unsigned char *)
1689 malloc ((size_t) nlm_fixed_header_size (abfd
)));
1690 if (fixed_header
== NULL
)
1692 bfd_set_error (bfd_error_no_memory
);
1696 if (abfd
->output_has_begun
== false
1697 && nlm_compute_section_file_positions (abfd
) == false)
1700 /* Write out the variable length headers. */
1702 nlm_optional_prefix_size (abfd
) + nlm_fixed_header_size (abfd
),
1705 if (nlm_swap_variable_header_out (abfd
) == false
1706 || nlm_swap_auxiliary_headers_out (abfd
) == false)
1708 bfd_set_error (bfd_error_system_call
);
1712 /* A weak check on whether the section file positions were
1714 if (bfd_tell (abfd
) > nlm_fixed_header (abfd
)->codeImageOffset
)
1716 bfd_set_error (bfd_error_invalid_operation
);
1720 /* Advance to the relocs. */
1721 if (bfd_seek (abfd
, nlm_fixed_header (abfd
)->relocationFixupOffset
,
1725 /* The format of the relocation entries is dependent upon the
1726 particular target. We use an external routine to write the reloc
1728 write_import_func
= nlm_write_import_func (abfd
);
1730 /* Write out the internal relocation fixups. While we're looping
1731 over the relocs, we also count the external relocs, which is
1732 needed when they are written out below. */
1733 internal_reloc_count
= 0;
1734 external_reloc_count
= 0;
1735 for (sec
= abfd
->sections
; sec
!= (asection
*) NULL
; sec
= sec
->next
)
1737 arelent
**rel_ptr_ptr
, **rel_end
;
1739 if (sec
->reloc_count
== 0)
1742 /* We can only represent relocs within a code or data
1743 section. We ignore them for a debugging section. */
1744 if ((bfd_get_section_flags (abfd
, sec
) & (SEC_CODE
| SEC_DATA
)) == 0)
1747 /* We need to know how to write out imports */
1748 if (write_import_func
== NULL
)
1750 bfd_set_error (bfd_error_invalid_operation
);
1754 rel_ptr_ptr
= sec
->orelocation
;
1755 rel_end
= rel_ptr_ptr
+ sec
->reloc_count
;
1756 for (; rel_ptr_ptr
< rel_end
; rel_ptr_ptr
++)
1762 sym
= *rel
->sym_ptr_ptr
;
1764 if (! bfd_is_und_section (bfd_get_section (sym
)))
1766 ++internal_reloc_count
;
1767 if ((*write_import_func
) (abfd
, sec
, rel
) == false)
1771 ++external_reloc_count
;
1774 nlm_fixed_header (abfd
)->numberOfRelocationFixups
= internal_reloc_count
;
1776 /* Write out the imports (relocs against external symbols). These
1777 are output as a symbol name followed by all the relocs for that
1778 symbol, so we must first gather together all the relocs against
1779 external symbols and sort them. */
1781 (struct reloc_and_sec
*) bfd_alloc (abfd
,
1782 (external_reloc_count
1783 * sizeof (struct reloc_and_sec
)));
1784 if (external_relocs
== (struct reloc_and_sec
*) NULL
)
1787 for (sec
= abfd
->sections
; sec
!= (asection
*) NULL
; sec
= sec
->next
)
1789 arelent
**rel_ptr_ptr
, **rel_end
;
1791 if (sec
->reloc_count
== 0)
1794 rel_ptr_ptr
= sec
->orelocation
;
1795 rel_end
= rel_ptr_ptr
+ sec
->reloc_count
;
1796 for (; rel_ptr_ptr
< rel_end
; rel_ptr_ptr
++)
1802 sym
= *rel
->sym_ptr_ptr
;
1804 if (! bfd_is_und_section (bfd_get_section (sym
)))
1807 external_relocs
[i
].rel
= rel
;
1808 external_relocs
[i
].sec
= sec
;
1813 BFD_ASSERT (i
== external_reloc_count
);
1815 /* Sort the external relocs by name. */
1816 qsort ((PTR
) external_relocs
, (size_t) external_reloc_count
,
1817 sizeof (struct reloc_and_sec
), nlm_external_reloc_compare
);
1819 /* Write out the external relocs. */
1820 nlm_fixed_header (abfd
)->externalReferencesOffset
= bfd_tell (abfd
);
1823 while (i
< external_reloc_count
)
1827 bfd_size_type j
, cnt
;
1831 rel
= external_relocs
[i
].rel
;
1832 sym
= *rel
->sym_ptr_ptr
;
1836 (j
< external_reloc_count
1837 && *external_relocs
[j
].rel
->sym_ptr_ptr
== sym
);
1841 if ((*nlm_write_external_func (abfd
)) (abfd
, cnt
, sym
,
1842 &external_relocs
[i
])
1849 nlm_fixed_header (abfd
)->numberOfExternalReferences
= c
;
1851 /* Write out the public symbols (exports). */
1852 sym_ptr_ptr
= bfd_get_outsymbols (abfd
);
1853 if (sym_ptr_ptr
!= (asymbol
**) NULL
)
1855 bfd_vma (*get_public_offset_func
) PARAMS ((bfd
*, asymbol
*));
1856 boolean (*write_export_func
) PARAMS ((bfd
*, asymbol
*, bfd_vma
));
1860 nlm_fixed_header (abfd
)->publicsOffset
= bfd_tell (abfd
);
1861 get_public_offset_func
= nlm_get_public_offset_func (abfd
);
1862 write_export_func
= nlm_write_export_func (abfd
);
1864 sym_end
= sym_ptr_ptr
+ bfd_get_symcount (abfd
);
1865 for (; sym_ptr_ptr
< sym_end
; sym_ptr_ptr
++)
1870 bfd_byte temp
[NLM_TARGET_LONG_SIZE
];
1874 if ((sym
->flags
& (BSF_EXPORT
| BSF_GLOBAL
)) == 0
1875 || bfd_is_und_section (bfd_get_section (sym
)))
1880 if (get_public_offset_func
)
1882 /* Most backends can use the code below, but
1883 unfortunately some use a different scheme. */
1884 offset
= (*get_public_offset_func
) (abfd
, sym
);
1888 offset
= bfd_asymbol_value (sym
);
1890 if (sec
->flags
& SEC_CODE
)
1892 offset
-= nlm_get_text_low (abfd
);
1893 offset
|= NLM_HIBIT
;
1895 else if (sec
->flags
& (SEC_DATA
| SEC_ALLOC
))
1897 /* SEC_ALLOC is for the .bss section. */
1898 offset
-= nlm_get_data_low (abfd
);
1902 /* We can't handle an exported symbol that is not in
1903 the code or data segment. */
1904 bfd_set_error (bfd_error_invalid_operation
);
1909 if (write_export_func
)
1911 if ((*write_export_func
) (abfd
, sym
, offset
) == false)
1916 len
= strlen (sym
->name
);
1917 if ((bfd_write (&len
, sizeof (bfd_byte
), 1, abfd
)
1918 != sizeof (bfd_byte
))
1919 || bfd_write (sym
->name
, len
, 1, abfd
) != len
)
1922 put_word (abfd
, offset
, temp
);
1923 if (bfd_write (temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
1927 nlm_fixed_header (abfd
)->numberOfPublics
= c
;
1929 /* Write out the debugging records. The NLM conversion program
1930 wants to be able to inhibit this, so as a special hack if
1931 debugInfoOffset is set to -1 we don't write any debugging
1932 information. This can not be handled by fiddling with the
1933 symbol table, because exported symbols appear in both the
1934 exported symbol list and the debugging information. */
1935 if (nlm_fixed_header (abfd
)->debugInfoOffset
== (file_ptr
) - 1)
1937 nlm_fixed_header (abfd
)->debugInfoOffset
= 0;
1938 nlm_fixed_header (abfd
)->numberOfDebugRecords
= 0;
1942 nlm_fixed_header (abfd
)->debugInfoOffset
= bfd_tell (abfd
);
1944 sym_ptr_ptr
= bfd_get_outsymbols (abfd
);
1945 sym_end
= sym_ptr_ptr
+ bfd_get_symcount (abfd
);
1946 for (; sym_ptr_ptr
< sym_end
; sym_ptr_ptr
++)
1951 bfd_byte temp
[NLM_TARGET_LONG_SIZE
];
1955 /* The NLM notion of a debugging symbol is actually what
1956 BFD calls a local or global symbol. What BFD calls a
1957 debugging symbol NLM does not understand at all. */
1958 if ((sym
->flags
& (BSF_LOCAL
| BSF_GLOBAL
| BSF_EXPORT
)) == 0
1959 || (sym
->flags
& BSF_DEBUGGING
) != 0
1960 || bfd_is_und_section (bfd_get_section (sym
)))
1965 offset
= bfd_asymbol_value (sym
);
1967 if (sec
->flags
& SEC_CODE
)
1969 offset
-= nlm_get_text_low (abfd
);
1972 else if (sec
->flags
& (SEC_DATA
| SEC_ALLOC
))
1974 /* SEC_ALLOC is for the .bss section. */
1975 offset
-= nlm_get_data_low (abfd
);
1981 /* The type is 0 for data, 1 for code, 2 for absolute. */
1982 if (bfd_write (&type
, sizeof (bfd_byte
), 1, abfd
)
1983 != sizeof (bfd_byte
))
1986 put_word (abfd
, offset
, temp
);
1987 if (bfd_write (temp
, sizeof (temp
), 1, abfd
) != sizeof (temp
))
1990 len
= strlen (sym
->name
);
1991 if ((bfd_write (&len
, sizeof (bfd_byte
), 1, abfd
)
1992 != sizeof (bfd_byte
))
1993 || bfd_write (sym
->name
, len
, 1, abfd
) != len
)
1996 nlm_fixed_header (abfd
)->numberOfDebugRecords
= c
;
2000 /* NLMLINK fills in offset values even if there is no data, so we do
2002 last
= bfd_tell (abfd
);
2003 if (nlm_fixed_header (abfd
)->codeImageOffset
== 0)
2004 nlm_fixed_header (abfd
)->codeImageOffset
= last
;
2005 if (nlm_fixed_header (abfd
)->dataImageOffset
== 0)
2006 nlm_fixed_header (abfd
)->dataImageOffset
= last
;
2007 if (nlm_fixed_header (abfd
)->customDataOffset
== 0)
2008 nlm_fixed_header (abfd
)->customDataOffset
= last
;
2009 if (nlm_fixed_header (abfd
)->moduleDependencyOffset
== 0)
2010 nlm_fixed_header (abfd
)->moduleDependencyOffset
= last
;
2011 if (nlm_fixed_header (abfd
)->relocationFixupOffset
== 0)
2012 nlm_fixed_header (abfd
)->relocationFixupOffset
= last
;
2013 if (nlm_fixed_header (abfd
)->externalReferencesOffset
== 0)
2014 nlm_fixed_header (abfd
)->externalReferencesOffset
= last
;
2015 if (nlm_fixed_header (abfd
)->publicsOffset
== 0)
2016 nlm_fixed_header (abfd
)->publicsOffset
= last
;
2017 if (nlm_fixed_header (abfd
)->debugInfoOffset
== 0)
2018 nlm_fixed_header (abfd
)->debugInfoOffset
= last
;
2020 /* At this point everything has been written out except the fixed
2022 memcpy (nlm_fixed_header (abfd
)->signature
, nlm_signature (abfd
),
2023 NLM_SIGNATURE_SIZE
);
2024 nlm_fixed_header (abfd
)->version
= NLM_HEADER_VERSION
;
2025 nlm_fixed_header (abfd
)->codeStartOffset
=
2026 (bfd_get_start_address (abfd
)
2027 - nlm_get_text_low (abfd
));
2029 /* We have no convenient way for the caller to pass in the exit
2030 procedure or the check unload procedure, so the caller must set
2031 the values in the header to the values of the symbols. */
2032 nlm_fixed_header (abfd
)->exitProcedureOffset
-= nlm_get_text_low (abfd
);
2033 if (nlm_fixed_header (abfd
)->checkUnloadProcedureOffset
!= 0)
2034 nlm_fixed_header (abfd
)->checkUnloadProcedureOffset
-=
2035 nlm_get_text_low (abfd
);
2037 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
2040 write_prefix_func
= nlm_write_prefix_func (abfd
);
2041 if (write_prefix_func
)
2043 if ((*write_prefix_func
) (abfd
) == false)
2047 BFD_ASSERT ((bfd_size_type
) bfd_tell (abfd
)
2048 == nlm_optional_prefix_size (abfd
));
2050 nlm_swap_fixed_header_out (abfd
, nlm_fixed_header (abfd
), fixed_header
);
2051 if (bfd_write (fixed_header
, nlm_fixed_header_size (abfd
), 1, abfd
)
2052 != nlm_fixed_header_size (abfd
))
2055 if (fixed_header
!= NULL
)
2056 free (fixed_header
);
2060 if (fixed_header
!= NULL
)
2061 free (fixed_header
);