4b14dcd5437979432f6a3c8ab5e8a7adcc440684
[binutils-gdb.git] / bfd / ecofflink.c
1 /* Routines to link ECOFF debugging information.
2 Copyright 1993 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "obstack.h"
26 #include "coff/internal.h"
27 #include "coff/sym.h"
28 #include "coff/symconst.h"
29 #include "coff/ecoff.h"
30 \f
31 static boolean ecoff_add_bytes PARAMS ((char **buf, char **bufend,
32 size_t need));
33 static struct bfd_hash_entry *string_hash_newfunc
34 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
35 const char *));
36 static void ecoff_align_debug PARAMS ((bfd *abfd,
37 struct ecoff_debug_info *debug,
38 const struct ecoff_debug_swap *swap));
39 static boolean ecoff_write_symhdr PARAMS ((bfd *, struct ecoff_debug_info *,
40 const struct ecoff_debug_swap *,
41 file_ptr where));
42
43 /* Obstack allocation and deallocation routines. */
44 #define obstack_chunk_alloc malloc
45 #define obstack_chunk_free free
46 \f
47 /* The minimum amount of data to allocate. */
48 #define ALLOC_SIZE (4064)
49
50 /* Add bytes to a buffer. Return success. */
51
52 static boolean
53 ecoff_add_bytes (buf, bufend, need)
54 char **buf;
55 char **bufend;
56 size_t need;
57 {
58 size_t have;
59 size_t want;
60 char *newbuf;
61
62 have = *bufend - *buf;
63 if (have > need)
64 want = ALLOC_SIZE;
65 else
66 {
67 want = need - have;
68 if (want < ALLOC_SIZE)
69 want = ALLOC_SIZE;
70 }
71 if (*buf == NULL)
72 newbuf = (char *) malloc (have + want);
73 else
74 newbuf = (char *) realloc (*buf, have + want);
75 if (newbuf == NULL)
76 {
77 bfd_set_error (bfd_error_no_memory);
78 return false;
79 }
80 *buf = newbuf;
81 *bufend = *buf + have + want;
82 return true;
83 }
84
85 /* We keep a hash table which maps strings to numbers. We use it to
86 map FDR names to indices in the output file, and to map local
87 strings when combining stabs debugging information. */
88
89 struct string_hash_entry
90 {
91 struct bfd_hash_entry root;
92 /* FDR index or string table offset. */
93 long val;
94 /* Next entry in string table. */
95 struct string_hash_entry *next;
96 };
97
98 struct string_hash_table
99 {
100 struct bfd_hash_table table;
101 };
102
103 /* Routine to create an entry in a string hash table. */
104
105 static struct bfd_hash_entry *
106 string_hash_newfunc (entry, table, string)
107 struct bfd_hash_entry *entry;
108 struct bfd_hash_table *table;
109 const char *string;
110 {
111 struct string_hash_entry *ret = (struct string_hash_entry *) entry;
112
113 /* Allocate the structure if it has not already been allocated by a
114 subclass. */
115 if (ret == (struct string_hash_entry *) NULL)
116 ret = ((struct string_hash_entry *)
117 bfd_hash_allocate (table, sizeof (struct string_hash_entry)));
118 if (ret == (struct string_hash_entry *) NULL)
119 {
120 bfd_set_error (bfd_error_no_memory);
121 return NULL;
122 }
123
124 /* Call the allocation method of the superclass. */
125 ret = ((struct string_hash_entry *)
126 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
127
128 if (ret)
129 {
130 /* Initialize the local fields. */
131 ret->val = -1;
132 ret->next = NULL;
133 }
134
135 return (struct bfd_hash_entry *) ret;
136 }
137
138 /* Look up an entry in an string hash table. */
139
140 #define string_hash_lookup(t, string, create, copy) \
141 ((struct string_hash_entry *) \
142 bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
143
144 /* We can't afford to read in all the debugging information when we do
145 a link. Instead, we build a list of these structures to show how
146 different parts of the input file map to the output file. */
147
148 struct shuffle
149 {
150 /* The next entry in this linked list. */
151 struct shuffle *next;
152 /* The length of the information. */
153 unsigned long size;
154 /* Whether this information comes from a file or not. */
155 boolean filep;
156 union
157 {
158 struct
159 {
160 /* The BFD the data comes from. */
161 bfd *input_bfd;
162 /* The offset within input_bfd. */
163 file_ptr offset;
164 } file;
165 /* The data to be written out. */
166 PTR memory;
167 } u;
168 };
169
170 /* This structure holds information across calls to
171 bfd_ecoff_debug_accumulate. */
172
173 struct accumulate
174 {
175 /* The FDR hash table. */
176 struct string_hash_table fdr_hash;
177 /* The strings hash table. */
178 struct string_hash_table str_hash;
179 /* Linked lists describing how to shuffle the input debug
180 information into the output file. We keep a pointer to both the
181 head and the tail. */
182 struct shuffle *line;
183 struct shuffle *line_end;
184 struct shuffle *pdr;
185 struct shuffle *pdr_end;
186 struct shuffle *sym;
187 struct shuffle *sym_end;
188 struct shuffle *opt;
189 struct shuffle *opt_end;
190 struct shuffle *aux;
191 struct shuffle *aux_end;
192 struct shuffle *ss;
193 struct shuffle *ss_end;
194 struct string_hash_entry *ss_hash;
195 struct string_hash_entry *ss_hash_end;
196 struct shuffle *fdr;
197 struct shuffle *fdr_end;
198 struct shuffle *rfd;
199 struct shuffle *rfd_end;
200 /* The size of the largest file shuffle. */
201 unsigned long largest_file_shuffle;
202 /* An obstack for debugging information. */
203 struct obstack memory;
204 };
205
206 /* Add a file entry to a shuffle list. */
207
208 static boolean add_file_shuffle PARAMS ((struct accumulate *,
209 struct shuffle **,
210 struct shuffle **, bfd *, file_ptr,
211 unsigned long));
212
213 static boolean
214 add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
215 struct accumulate *ainfo;
216 struct shuffle **head;
217 struct shuffle **tail;
218 bfd *input_bfd;
219 file_ptr offset;
220 unsigned long size;
221 {
222 struct shuffle *n;
223
224 if (*tail != (struct shuffle *) NULL
225 && (*tail)->filep
226 && (*tail)->u.file.input_bfd == input_bfd
227 && (*tail)->u.file.offset + (*tail)->size == offset)
228 {
229 /* Just merge this entry onto the existing one. */
230 (*tail)->size += size;
231 if ((*tail)->size > ainfo->largest_file_shuffle)
232 ainfo->largest_file_shuffle = (*tail)->size;
233 return true;
234 }
235
236 n = (struct shuffle *) obstack_alloc (&ainfo->memory,
237 sizeof (struct shuffle));
238 if (!n)
239 {
240 bfd_set_error (bfd_error_no_memory);
241 return false;
242 }
243 n->next = NULL;
244 n->size = size;
245 n->filep = true;
246 n->u.file.input_bfd = input_bfd;
247 n->u.file.offset = offset;
248 if (*head == (struct shuffle *) NULL)
249 *head = n;
250 if (*tail != (struct shuffle *) NULL)
251 (*tail)->next = n;
252 *tail = n;
253 if (size > ainfo->largest_file_shuffle)
254 ainfo->largest_file_shuffle = size;
255 return true;
256 }
257
258 /* Add a memory entry to a shuffle list. */
259
260 static boolean add_memory_shuffle PARAMS ((struct accumulate *,
261 struct shuffle **head,
262 struct shuffle **tail,
263 bfd_byte *data, unsigned long size));
264
265 static boolean
266 add_memory_shuffle (ainfo, head, tail, data, size)
267 struct accumulate *ainfo;
268 struct shuffle **head;
269 struct shuffle **tail;
270 bfd_byte *data;
271 unsigned long size;
272 {
273 struct shuffle *n;
274
275 n = (struct shuffle *) obstack_alloc (&ainfo->memory,
276 sizeof (struct shuffle));
277 if (!n)
278 {
279 bfd_set_error (bfd_error_no_memory);
280 return false;
281 }
282 n->next = NULL;
283 n->size = size;
284 n->filep = false;
285 n->u.memory = (PTR) data;
286 if (*head == (struct shuffle *) NULL)
287 *head = n;
288 if (*tail != (struct shuffle *) NULL)
289 (*tail)->next = n;
290 *tail = n;
291 return true;
292 }
293
294 /* Initialize the FDR hash table. This returns a handle which is then
295 passed in to bfd_ecoff_debug_accumulate, et. al. */
296
297 /*ARGSUSED*/
298 PTR
299 bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info)
300 bfd *output_bfd;
301 struct ecoff_debug_info *output_debug;
302 const struct ecoff_debug_swap *output_swap;
303 struct bfd_link_info *info;
304 {
305 struct accumulate *ainfo;
306
307 ainfo = (struct accumulate *) malloc (sizeof (struct accumulate));
308 if (!ainfo)
309 {
310 bfd_set_error (bfd_error_no_memory);
311 return NULL;
312 }
313 if (! bfd_hash_table_init_n (&ainfo->fdr_hash.table, string_hash_newfunc,
314 1021))
315 return NULL;
316
317 ainfo->line = NULL;
318 ainfo->line_end = NULL;
319 ainfo->pdr = NULL;
320 ainfo->pdr_end = NULL;
321 ainfo->sym = NULL;
322 ainfo->sym_end = NULL;
323 ainfo->opt = NULL;
324 ainfo->opt_end = NULL;
325 ainfo->aux = NULL;
326 ainfo->aux_end = NULL;
327 ainfo->ss = NULL;
328 ainfo->ss_end = NULL;
329 ainfo->ss_hash = NULL;
330 ainfo->ss_hash_end = NULL;
331 ainfo->fdr = NULL;
332 ainfo->fdr_end = NULL;
333 ainfo->rfd = NULL;
334 ainfo->rfd_end = NULL;
335
336 ainfo->largest_file_shuffle = 0;
337
338 if (! info->relocateable)
339 {
340 if (! bfd_hash_table_init (&ainfo->str_hash.table, string_hash_newfunc))
341 return NULL;
342
343 /* The first entry in the string table is the empty string. */
344 output_debug->symbolic_header.issMax = 1;
345 }
346
347 if (!obstack_begin (&ainfo->memory, 4050))
348 {
349 bfd_set_error (bfd_error_no_memory);
350 return NULL;
351 }
352
353 return (PTR) ainfo;
354 }
355
356 /* Free the accumulated debugging information. */
357
358 /*ARGSUSED*/
359 void
360 bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
361 PTR handle;
362 bfd *output_bfd;
363 struct ecoff_debug_info *output_debug;
364 const struct ecoff_debug_swap *output_swap;
365 struct bfd_link_info *info;
366 {
367 struct accumulate *ainfo = (struct accumulate *) handle;
368
369 bfd_hash_table_free (&ainfo->fdr_hash.table);
370
371 if (! info->relocateable)
372 bfd_hash_table_free (&ainfo->str_hash.table);
373
374 obstack_free (&ainfo->memory, (PTR) NULL);
375
376 free (ainfo);
377 }
378
379 /* Accumulate the debugging information from INPUT_BFD into
380 OUTPUT_BFD. The INPUT_DEBUG argument points to some ECOFF
381 debugging information which we want to link into the information
382 pointed to by the OUTPUT_DEBUG argument. OUTPUT_SWAP and
383 INPUT_SWAP point to the swapping information needed. INFO is the
384 linker information structure. HANDLE is returned by
385 bfd_ecoff_debug_init. */
386
387 /*ARGSUSED*/
388 boolean
389 bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
390 input_bfd, input_debug, input_swap,
391 info)
392 PTR handle;
393 bfd *output_bfd;
394 struct ecoff_debug_info *output_debug;
395 const struct ecoff_debug_swap *output_swap;
396 bfd *input_bfd;
397 struct ecoff_debug_info *input_debug;
398 const struct ecoff_debug_swap *input_swap;
399 struct bfd_link_info *info;
400 {
401 struct accumulate *ainfo = (struct accumulate *) handle;
402 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
403 = input_swap->swap_sym_in;
404 void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
405 = input_swap->swap_rfd_in;
406 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
407 = output_swap->swap_sym_out;
408 void (* const swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR))
409 = output_swap->swap_fdr_out;
410 void (* const swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR))
411 = output_swap->swap_rfd_out;
412 bfd_size_type external_pdr_size = output_swap->external_pdr_size;
413 bfd_size_type external_sym_size = output_swap->external_sym_size;
414 bfd_size_type external_opt_size = output_swap->external_opt_size;
415 bfd_size_type external_fdr_size = output_swap->external_fdr_size;
416 bfd_size_type external_rfd_size = output_swap->external_rfd_size;
417 HDRR * const output_symhdr = &output_debug->symbolic_header;
418 HDRR * const input_symhdr = &input_debug->symbolic_header;
419 bfd_vma section_adjust[scMax];
420 asection *sec;
421 bfd_byte *fdr_start;
422 bfd_byte *fdr_ptr;
423 bfd_byte *fdr_end;
424 bfd_size_type fdr_add;
425 unsigned int copied;
426 RFDT i;
427 unsigned long sz;
428 bfd_byte *rfd_out;
429 bfd_byte *rfd_in;
430 bfd_byte *rfd_end;
431 long newrfdbase = 0;
432 long oldrfdbase = 0;
433 bfd_byte *fdr_out;
434
435 /* Use section_adjust to hold the value to add to a symbol in a
436 particular section. */
437 memset ((PTR) section_adjust, 0, sizeof section_adjust);
438
439 #define SET(name, indx) \
440 sec = bfd_get_section_by_name (input_bfd, name); \
441 if (sec != NULL) \
442 section_adjust[indx] = (sec->output_section->vma \
443 + sec->output_offset \
444 - sec->vma);
445
446 SET (".text", scText);
447 SET (".data", scData);
448 SET (".bss", scBss);
449 SET (".sdata", scSData);
450 SET (".sbss", scSBss);
451 /* scRdata section may be either .rdata or .rodata. */
452 SET (".rdata", scRData);
453 SET (".rodata", scRData);
454 SET (".init", scInit);
455 SET (".fini", scFini);
456
457 #undef SET
458
459 /* Find all the debugging information based on the FDR's. We need
460 to handle them whether they are swapped or not. */
461 if (input_debug->fdr != (FDR *) NULL)
462 {
463 fdr_start = (bfd_byte *) input_debug->fdr;
464 fdr_add = sizeof (FDR);
465 }
466 else
467 {
468 fdr_start = (bfd_byte *) input_debug->external_fdr;
469 fdr_add = input_swap->external_fdr_size;
470 }
471 fdr_end = fdr_start + input_symhdr->ifdMax * fdr_add;
472
473 input_debug->ifdmap = (RFDT *) bfd_alloc (input_bfd,
474 (input_symhdr->ifdMax
475 * sizeof (RFDT)));
476
477 sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
478 rfd_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
479 if (!input_debug->ifdmap || !rfd_out)
480 {
481 bfd_set_error (bfd_error_no_memory);
482 return false;
483 }
484 if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz))
485 return false;
486
487 copied = 0;
488
489 /* Look through the FDR's to see which ones we are going to include
490 in the final output. We do not want duplicate FDR information
491 for header files, because ECOFF debugging is often very large.
492 When we find an FDR with no line information which can be merged,
493 we look it up in a hash table to ensure that we only include it
494 once. We keep a table mapping FDR numbers to the final number
495 they get with the BFD, so that we can refer to it when we write
496 out the external symbols. */
497 for (fdr_ptr = fdr_start, i = 0;
498 fdr_ptr < fdr_end;
499 fdr_ptr += fdr_add, i++, rfd_out += external_rfd_size)
500 {
501 FDR fdr;
502
503 if (input_debug->fdr != (FDR *) NULL)
504 fdr = *(FDR *) fdr_ptr;
505 else
506 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
507
508 /* See if this FDR can be merged with an existing one. */
509 if (fdr.cbLine == 0 && fdr.rss != -1 && fdr.fMerge)
510 {
511 const char *name;
512 char *lookup;
513 struct string_hash_entry *fh;
514
515 /* We look up a string formed from the file name and the
516 number of symbols. Sometimes an include file will
517 conditionally define a typedef or something based on the
518 order of include files. Using the number of symbols as a
519 hash reduces the chance that we will merge symbol
520 information that should not be merged. */
521 name = input_debug->ss + fdr.issBase + fdr.rss;
522
523 lookup = (char *) malloc (strlen (name) + 20);
524 if (lookup == NULL)
525 {
526 bfd_set_error (bfd_error_no_memory);
527 return false;
528 }
529 sprintf (lookup, "%s %lx", name, fdr.csym);
530
531 fh = string_hash_lookup (&ainfo->fdr_hash, lookup, true, true);
532 free (lookup);
533 if (fh == (struct string_hash_entry *) NULL)
534 return false;
535
536 if (fh->val != -1)
537 {
538 input_debug->ifdmap[i] = fh->val;
539 (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i,
540 (PTR) rfd_out);
541
542 /* Don't copy this FDR. */
543 continue;
544 }
545
546 fh->val = output_symhdr->ifdMax + copied;
547 }
548
549 input_debug->ifdmap[i] = output_symhdr->ifdMax + copied;
550 (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, (PTR) rfd_out);
551 ++copied;
552 }
553
554 newrfdbase = output_symhdr->crfd;
555 output_symhdr->crfd += input_symhdr->ifdMax;
556
557 /* Copy over any existing RFD's. RFD's are only created by the
558 linker, so this will only happen for input files which are the
559 result of a partial link. */
560 rfd_in = (bfd_byte *) input_debug->external_rfd;
561 rfd_end = rfd_in + input_symhdr->crfd * input_swap->external_rfd_size;
562 for (;
563 rfd_in < rfd_end;
564 rfd_in += input_swap->external_rfd_size)
565 {
566 RFDT rfd;
567
568 (*swap_rfd_in) (input_bfd, (PTR) rfd_in, &rfd);
569 BFD_ASSERT (rfd >= 0 && rfd < input_symhdr->ifdMax);
570 rfd = input_debug->ifdmap[rfd];
571 (*swap_rfd_out) (output_bfd, &rfd, (PTR) rfd_out);
572 rfd_out += external_rfd_size;
573 }
574
575 oldrfdbase = output_symhdr->crfd;
576 output_symhdr->crfd += input_symhdr->crfd;
577
578 /* Look through the FDR's and copy over all associated debugging
579 information. */
580 sz = copied * external_fdr_size;
581 fdr_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
582 if (!fdr_out)
583 {
584 bfd_set_error (bfd_error_no_memory);
585 return false;
586 }
587 if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz))
588 return false;
589 for (fdr_ptr = fdr_start, i = 0;
590 fdr_ptr < fdr_end;
591 fdr_ptr += fdr_add, i++)
592 {
593 FDR fdr;
594 bfd_byte *sym_out;
595 bfd_byte *lraw_src;
596 bfd_byte *lraw_end;
597 boolean fgotfilename;
598
599 if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
600 {
601 /* We are not copying this FDR. */
602 continue;
603 }
604
605 if (input_debug->fdr != (FDR *) NULL)
606 fdr = *(FDR *) fdr_ptr;
607 else
608 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
609
610 /* Adjust the FDR address for any changes that may have been
611 made by relaxing. */
612 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
613 {
614 bfd_vma adr;
615 struct ecoff_value_adjust *adjust;
616
617 adr = fdr.adr;
618 for (adjust = input_debug->adjust;
619 adjust != (struct ecoff_value_adjust *) NULL;
620 adjust = adjust->next)
621 if (adr >= adjust->start
622 && adr < adjust->end)
623 fdr.adr += adjust->adjust;
624 }
625
626 /* FIXME: It is conceivable that this FDR points to the .init or
627 .fini section, in which case this will not do the right
628 thing. */
629 fdr.adr += section_adjust[scText];
630
631 /* Swap in the local symbols, adjust their values, and swap them
632 out again. */
633 fgotfilename = false;
634 sz = fdr.csym * external_sym_size;
635 sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
636 if (!sym_out)
637 {
638 bfd_set_error (bfd_error_no_memory);
639 return false;
640 }
641 if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out, sz))
642 return false;
643 lraw_src = ((bfd_byte *) input_debug->external_sym
644 + fdr.isymBase * input_swap->external_sym_size);
645 lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
646 for (; lraw_src < lraw_end; lraw_src += input_swap->external_sym_size)
647 {
648 SYMR internal_sym;
649
650 (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym);
651
652 BFD_ASSERT (internal_sym.sc != scCommon
653 && internal_sym.sc != scSCommon);
654
655 /* Adjust the symbol value if appropriate. */
656 switch (internal_sym.st)
657 {
658 case stNil:
659 if (ECOFF_IS_STAB (&internal_sym))
660 break;
661 /* Fall through. */
662 case stGlobal:
663 case stStatic:
664 case stLabel:
665 case stProc:
666 case stStaticProc:
667 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
668 {
669 bfd_vma value;
670 struct ecoff_value_adjust *adjust;
671
672 value = internal_sym.value;
673 for (adjust = input_debug->adjust;
674 adjust != (struct ecoff_value_adjust *) NULL;
675 adjust = adjust->next)
676 if (value >= adjust->start
677 && value < adjust->end)
678 internal_sym.value += adjust->adjust;
679 }
680 internal_sym.value += section_adjust[internal_sym.sc];
681 break;
682
683 default:
684 break;
685 }
686
687 /* If we are doing a final link, we hash all the strings in
688 the local symbol table together. This reduces the amount
689 of space required by debugging information. We don't do
690 this when performing a relocateable link because it would
691 prevent us from easily merging different FDR's. */
692 if (! info->relocateable)
693 {
694 boolean ffilename;
695 const char *name;
696
697 if (! fgotfilename && internal_sym.iss == fdr.rss)
698 ffilename = true;
699 else
700 ffilename = false;
701
702 /* Hash the name into the string table. */
703 name = input_debug->ss + fdr.issBase + internal_sym.iss;
704 if (*name == '\0')
705 internal_sym.iss = 0;
706 else
707 {
708 struct string_hash_entry *sh;
709
710 sh = string_hash_lookup (&ainfo->str_hash, name, true, true);
711 if (sh == (struct string_hash_entry *) NULL)
712 return false;
713 if (sh->val == -1)
714 {
715 sh->val = output_symhdr->issMax;
716 output_symhdr->issMax += strlen (name) + 1;
717 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
718 ainfo->ss_hash = sh;
719 if (ainfo->ss_hash_end
720 != (struct string_hash_entry *) NULL)
721 ainfo->ss_hash_end->next = sh;
722 ainfo->ss_hash_end = sh;
723 }
724 internal_sym.iss = sh->val;
725 }
726
727 if (ffilename)
728 {
729 fdr.rss = internal_sym.iss;
730 fgotfilename = true;
731 }
732 }
733
734 (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
735 sym_out += external_sym_size;
736 }
737
738 fdr.isymBase = output_symhdr->isymMax;
739 output_symhdr->isymMax += fdr.csym;
740
741 /* Copy the information that does not need swapping. */
742 if (fdr.cbLine > 0)
743 {
744 if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
745 input_bfd,
746 input_symhdr->cbLineOffset + fdr.cbLineOffset,
747 fdr.cbLine))
748 return false;
749 fdr.ilineBase = output_symhdr->ilineMax;
750 fdr.cbLineOffset = output_symhdr->cbLine;
751 output_symhdr->ilineMax += fdr.cline;
752 output_symhdr->cbLine += fdr.cbLine;
753 }
754 if (fdr.caux > 0)
755 {
756 if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
757 input_bfd,
758 (input_symhdr->cbAuxOffset
759 + fdr.iauxBase * sizeof (union aux_ext)),
760 fdr.caux * sizeof (union aux_ext)))
761 return false;
762 fdr.iauxBase = output_symhdr->iauxMax;
763 output_symhdr->iauxMax += fdr.caux;
764 }
765 if (! info->relocateable)
766 {
767
768 /* When are are hashing strings, we lie about the number of
769 strings attached to each FDR. We need to set cbSs
770 because some versions of dbx apparently use it to decide
771 how much of the string table to read in. */
772 fdr.issBase = 0;
773 fdr.cbSs = output_symhdr->issMax;
774 }
775 else if (fdr.cbSs > 0)
776 {
777 if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
778 input_bfd,
779 input_symhdr->cbSsOffset + fdr.issBase,
780 fdr.cbSs))
781 return false;
782 fdr.issBase = output_symhdr->issMax;
783 output_symhdr->issMax += fdr.cbSs;
784 }
785
786 if (output_bfd->xvec->header_byteorder_big_p
787 == input_bfd->xvec->header_byteorder_big_p)
788 {
789 /* The two BFD's have the same endianness, so simply copying
790 the information will suffice. */
791 BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
792 if (fdr.cpd > 0)
793 {
794 if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
795 input_bfd,
796 (input_symhdr->cbPdOffset
797 + fdr.ipdFirst * external_pdr_size),
798 fdr.cpd * external_pdr_size))
799 return false;
800 }
801 BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
802 if (fdr.copt > 0)
803 {
804 if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
805 input_bfd,
806 (input_symhdr->cbOptOffset
807 + fdr.ioptBase * external_opt_size),
808 fdr.copt * external_opt_size))
809 return false;
810 }
811 }
812 else
813 {
814 bfd_size_type outsz, insz;
815 bfd_byte *in;
816 bfd_byte *end;
817 bfd_byte *out;
818
819 /* The two BFD's have different endianness, so we must swap
820 everything in and out. This code would always work, but
821 it would be unnecessarily slow in the normal case. */
822 outsz = external_pdr_size;
823 insz = input_swap->external_pdr_size;
824 in = ((bfd_byte *) input_debug->external_pdr
825 + fdr.ipdFirst * insz);
826 end = in + fdr.cpd * insz;
827 sz = fdr.cpd * outsz;
828 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
829 if (!out)
830 {
831 bfd_set_error (bfd_error_no_memory);
832 return false;
833 }
834 if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out, sz))
835 return false;
836 for (; in < end; in += insz, out += outsz)
837 {
838 PDR pdr;
839
840 (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr);
841 (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out);
842 }
843
844 /* Swap over the optimization information. */
845 outsz = external_opt_size;
846 insz = input_swap->external_opt_size;
847 in = ((bfd_byte *) input_debug->external_opt
848 + fdr.ioptBase * insz);
849 end = in + fdr.copt * insz;
850 sz = fdr.copt * outsz;
851 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
852 if (!out)
853 {
854 bfd_set_error (bfd_error_no_memory);
855 return false;
856 }
857 if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out, sz))
858 return false;
859 for (; in < end; in += insz, out += outsz)
860 {
861 OPTR opt;
862
863 (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt);
864 (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out);
865 }
866 }
867
868 fdr.ipdFirst = output_symhdr->ipdMax;
869 output_symhdr->ipdMax += fdr.cpd;
870 fdr.ioptBase = output_symhdr->ioptMax;
871 output_symhdr->ioptMax += fdr.copt;
872
873 if (fdr.crfd <= 0)
874 {
875 /* Point this FDR at the table of RFD's we created. */
876 fdr.rfdBase = newrfdbase;
877 fdr.crfd = input_symhdr->ifdMax;
878 }
879 else
880 {
881 /* Point this FDR at the remapped RFD's. */
882 fdr.rfdBase += oldrfdbase;
883 }
884
885 (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
886 fdr_out += external_fdr_size;
887 ++output_symhdr->ifdMax;
888 }
889
890 return true;
891 }
892
893 /* Add a string to the debugging information we are accumulating.
894 Return the offset from the fdr string base. */
895
896 static long ecoff_add_string PARAMS ((struct accumulate *,
897 struct bfd_link_info *,
898 struct ecoff_debug_info *,
899 FDR *fdr, const char *string));
900
901 static long
902 ecoff_add_string (ainfo, info, debug, fdr, string)
903 struct accumulate *ainfo;
904 struct bfd_link_info *info;
905 struct ecoff_debug_info *debug;
906 FDR *fdr;
907 const char *string;
908 {
909 HDRR *symhdr;
910 size_t len;
911 bfd_size_type ret;
912
913 symhdr = &debug->symbolic_header;
914 len = strlen (string);
915 if (info->relocateable)
916 {
917 if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string,
918 len + 1))
919 return -1;
920 ret = symhdr->issMax;
921 symhdr->issMax += len + 1;
922 fdr->cbSs += len + 1;
923 }
924 else
925 {
926 struct string_hash_entry *sh;
927
928 sh = string_hash_lookup (&ainfo->str_hash, string, true, true);
929 if (sh == (struct string_hash_entry *) NULL)
930 return -1;
931 if (sh->val == -1)
932 {
933 sh->val = symhdr->issMax;
934 symhdr->issMax += len + 1;
935 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
936 ainfo->ss_hash = sh;
937 if (ainfo->ss_hash_end
938 != (struct string_hash_entry *) NULL)
939 ainfo->ss_hash_end->next = sh;
940 ainfo->ss_hash_end = sh;
941 }
942 ret = sh->val;
943 }
944
945 return ret;
946 }
947
948 /* Add debugging information from a non-ECOFF file. */
949
950 boolean
951 bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
952 output_swap, input_bfd, info)
953 PTR handle;
954 bfd *output_bfd;
955 struct ecoff_debug_info *output_debug;
956 const struct ecoff_debug_swap *output_swap;
957 bfd *input_bfd;
958 struct bfd_link_info *info;
959 {
960 struct accumulate *ainfo = (struct accumulate *) handle;
961 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
962 = output_swap->swap_sym_out;
963 HDRR *output_symhdr = &output_debug->symbolic_header;
964 FDR fdr;
965 asection *sec;
966 asymbol **symbols;
967 asymbol **sym_ptr;
968 asymbol **sym_end;
969 PTR external_fdr;
970
971 memset ((PTR) &fdr, 0, sizeof fdr);
972
973 sec = bfd_get_section_by_name (input_bfd, ".text");
974 if (sec != NULL)
975 fdr.adr = sec->output_section->vma + sec->output_offset;
976 else
977 {
978 /* FIXME: What about .init or .fini? */
979 fdr.adr = 0;
980 }
981
982 fdr.issBase = output_symhdr->issMax;
983 fdr.cbSs = 0;
984 fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
985 bfd_get_filename (input_bfd));
986 if (fdr.rss == -1)
987 return false;
988 fdr.isymBase = output_symhdr->isymMax;
989
990 /* Get the local symbols from the input BFD. */
991 symbols = (asymbol **) bfd_alloc (output_bfd,
992 get_symtab_upper_bound (input_bfd));
993 if (symbols == (asymbol **) NULL)
994 {
995 bfd_set_error (bfd_error_no_memory);
996 return false;
997 }
998 sym_end = symbols + bfd_canonicalize_symtab (input_bfd, symbols);
999
1000 /* Handle the local symbols. Any external symbols are handled
1001 separately. */
1002 fdr.csym = 0;
1003 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1004 {
1005 SYMR internal_sym;
1006 PTR external_sym;
1007
1008 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1009 continue;
1010 memset ((PTR) &internal_sym, 0, sizeof internal_sym);
1011 internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1012 (*sym_ptr)->name);
1013
1014 if (internal_sym.iss == -1)
1015 return false;
1016 if (bfd_is_com_section ((*sym_ptr)->section)
1017 || (*sym_ptr)->section == &bfd_und_section)
1018 internal_sym.value = (*sym_ptr)->value;
1019 else
1020 internal_sym.value = ((*sym_ptr)->value
1021 + (*sym_ptr)->section->output_offset
1022 + (*sym_ptr)->section->output_section->vma);
1023 internal_sym.st = stNil;
1024 internal_sym.sc = scUndefined;
1025 internal_sym.index = indexNil;
1026
1027 external_sym = (PTR) obstack_alloc (&ainfo->memory,
1028 output_swap->external_sym_size);
1029 if (!external_sym)
1030 {
1031 bfd_set_error (bfd_error_no_memory);
1032 return false;
1033 }
1034 (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1035 add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1036 external_sym, output_swap->external_sym_size);
1037 ++fdr.csym;
1038 ++output_symhdr->isymMax;
1039 }
1040
1041 bfd_release (output_bfd, (PTR) symbols);
1042
1043 /* Leave everything else in the FDR zeroed out. This will cause
1044 the lang field to be langC. The fBigendian field will
1045 indicate little endian format, but it doesn't matter because
1046 it only applies to aux fields and there are none. */
1047 external_fdr = (PTR) obstack_alloc (&ainfo->memory,
1048 output_swap->external_fdr_size);
1049 if (!external_fdr)
1050 {
1051 bfd_set_error (bfd_error_no_memory);
1052 return false;
1053 }
1054 (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1055 add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1056 external_fdr, output_swap->external_fdr_size);
1057
1058 ++output_symhdr->ifdMax;
1059
1060 return true;
1061 }
1062
1063 /* Set up ECOFF debugging information for the external symbols.
1064 FIXME: This is done using a memory buffer, but it should be
1065 probably be changed to use a shuffle structure. The assembler uses
1066 this interface, so that must be changed to do something else. */
1067
1068 boolean
1069 bfd_ecoff_debug_externals (abfd, debug, swap, relocateable, get_extr,
1070 set_index)
1071 bfd *abfd;
1072 struct ecoff_debug_info *debug;
1073 const struct ecoff_debug_swap *swap;
1074 boolean relocateable;
1075 boolean (*get_extr) PARAMS ((asymbol *, EXTR *));
1076 void (*set_index) PARAMS ((asymbol *, bfd_size_type));
1077 {
1078 HDRR * const symhdr = &debug->symbolic_header;
1079 asymbol **sym_ptr_ptr;
1080 size_t c;
1081
1082 sym_ptr_ptr = bfd_get_outsymbols (abfd);
1083 if (sym_ptr_ptr == NULL)
1084 return true;
1085
1086 for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1087 {
1088 asymbol *sym_ptr;
1089 EXTR esym;
1090
1091 sym_ptr = *sym_ptr_ptr;
1092
1093 /* Get the external symbol information. */
1094 if ((*get_extr) (sym_ptr, &esym) == false)
1095 continue;
1096
1097 /* If we're producing an executable, move common symbols into
1098 bss. */
1099 if (relocateable == false)
1100 {
1101 if (esym.asym.sc == scCommon)
1102 esym.asym.sc = scBss;
1103 else if (esym.asym.sc == scSCommon)
1104 esym.asym.sc = scSBss;
1105 }
1106
1107 if (bfd_is_com_section (sym_ptr->section)
1108 || sym_ptr->section == &bfd_und_section)
1109 {
1110 /* FIXME: gas does not keep the value of a small undefined
1111 symbol in the symbol itself, because of relocation
1112 problems. */
1113 if (esym.asym.sc != scSUndefined
1114 || esym.asym.value == 0
1115 || sym_ptr->value != 0)
1116 esym.asym.value = sym_ptr->value;
1117 }
1118 else
1119 esym.asym.value = (sym_ptr->value
1120 + sym_ptr->section->output_offset
1121 + sym_ptr->section->output_section->vma);
1122
1123 if (set_index)
1124 (*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1125
1126 if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1127 sym_ptr->name, &esym))
1128 return false;
1129 }
1130
1131 return true;
1132 }
1133
1134 /* Add a single external symbol to the debugging information. */
1135
1136 boolean
1137 bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym)
1138 bfd *abfd;
1139 struct ecoff_debug_info *debug;
1140 const struct ecoff_debug_swap *swap;
1141 const char *name;
1142 EXTR *esym;
1143 {
1144 const bfd_size_type external_ext_size = swap->external_ext_size;
1145 void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
1146 = swap->swap_ext_out;
1147 HDRR * const symhdr = &debug->symbolic_header;
1148 size_t namelen;
1149
1150 namelen = strlen (name);
1151
1152 if (debug->ssext_end - debug->ssext
1153 < symhdr->issExtMax + namelen + 1)
1154 {
1155 if (ecoff_add_bytes ((char **) &debug->ssext,
1156 (char **) &debug->ssext_end,
1157 symhdr->issExtMax + namelen + 1)
1158 == false)
1159 return false;
1160 }
1161 if ((char *) debug->external_ext_end - (char *) debug->external_ext
1162 < (symhdr->iextMax + 1) * external_ext_size)
1163 {
1164 if (ecoff_add_bytes ((char **) &debug->external_ext,
1165 (char **) &debug->external_ext_end,
1166 (symhdr->iextMax + 1) * external_ext_size)
1167 == false)
1168 return false;
1169 }
1170
1171 esym->asym.iss = symhdr->issExtMax;
1172
1173 (*swap_ext_out) (abfd, esym,
1174 ((char *) debug->external_ext
1175 + symhdr->iextMax * swap->external_ext_size));
1176
1177 ++symhdr->iextMax;
1178
1179 strcpy (debug->ssext + symhdr->issExtMax, name);
1180 symhdr->issExtMax += namelen + 1;
1181
1182 return true;
1183 }
1184
1185 /* Align the ECOFF debugging information. */
1186
1187 /*ARGSUSED*/
1188 static void
1189 ecoff_align_debug (abfd, debug, swap)
1190 bfd *abfd;
1191 struct ecoff_debug_info *debug;
1192 const struct ecoff_debug_swap *swap;
1193 {
1194 HDRR * const symhdr = &debug->symbolic_header;
1195 bfd_size_type debug_align, aux_align, rfd_align;
1196 size_t add;
1197
1198 /* Adjust the counts so that structures are aligned. */
1199 debug_align = swap->debug_align;
1200 aux_align = debug_align / sizeof (union aux_ext);
1201 rfd_align = debug_align / swap->external_rfd_size;
1202
1203 add = debug_align - (symhdr->cbLine & (debug_align - 1));
1204 if (add != debug_align)
1205 {
1206 if (debug->line != (unsigned char *) NULL)
1207 memset ((PTR) (debug->line + symhdr->cbLine), 0, add);
1208 symhdr->cbLine += add;
1209 }
1210
1211 add = debug_align - (symhdr->issMax & (debug_align - 1));
1212 if (add != debug_align)
1213 {
1214 if (debug->ss != (char *) NULL)
1215 memset ((PTR) (debug->ss + symhdr->issMax), 0, add);
1216 symhdr->issMax += add;
1217 }
1218
1219 add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1220 if (add != debug_align)
1221 {
1222 if (debug->ssext != (char *) NULL)
1223 memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add);
1224 symhdr->issExtMax += add;
1225 }
1226
1227 add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1228 if (add != aux_align)
1229 {
1230 if (debug->external_aux != (union aux_ext *) NULL)
1231 memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0,
1232 add * sizeof (union aux_ext));
1233 symhdr->iauxMax += add;
1234 }
1235
1236 add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1237 if (add != rfd_align)
1238 {
1239 if (debug->external_rfd != (PTR) NULL)
1240 memset ((PTR) ((char *) debug->external_rfd
1241 + symhdr->crfd * swap->external_rfd_size),
1242 0, add * swap->external_rfd_size);
1243 symhdr->crfd += add;
1244 }
1245 }
1246
1247 /* Return the size required by the ECOFF debugging information. */
1248
1249 bfd_size_type
1250 bfd_ecoff_debug_size (abfd, debug, swap)
1251 bfd *abfd;
1252 struct ecoff_debug_info *debug;
1253 const struct ecoff_debug_swap *swap;
1254 {
1255 bfd_size_type tot;
1256
1257 ecoff_align_debug (abfd, debug, swap);
1258 tot = swap->external_hdr_size;
1259
1260 #define ADD(count, size) \
1261 tot += debug->symbolic_header.count * size
1262
1263 ADD (cbLine, sizeof (unsigned char));
1264 ADD (idnMax, swap->external_dnr_size);
1265 ADD (ipdMax, swap->external_pdr_size);
1266 ADD (isymMax, swap->external_sym_size);
1267 ADD (ioptMax, swap->external_opt_size);
1268 ADD (iauxMax, sizeof (union aux_ext));
1269 ADD (issMax, sizeof (char));
1270 ADD (issExtMax, sizeof (char));
1271 ADD (ifdMax, swap->external_fdr_size);
1272 ADD (crfd, swap->external_rfd_size);
1273 ADD (iextMax, swap->external_ext_size);
1274
1275 #undef ADD
1276
1277 return tot;
1278 }
1279
1280 /* Write out the ECOFF symbolic header, given the file position it is
1281 going to be placed at. This assumes that the counts are set
1282 correctly. */
1283
1284 static boolean
1285 ecoff_write_symhdr (abfd, debug, swap, where)
1286 bfd *abfd;
1287 struct ecoff_debug_info *debug;
1288 const struct ecoff_debug_swap *swap;
1289 file_ptr where;
1290 {
1291 HDRR * const symhdr = &debug->symbolic_header;
1292 char *buff = NULL;
1293
1294 ecoff_align_debug (abfd, debug, swap);
1295
1296 /* Go to the right location in the file. */
1297 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1298 return false;
1299
1300 where += swap->external_hdr_size;
1301
1302 symhdr->magic = swap->sym_magic;
1303
1304 /* Fill in the file offsets. */
1305 #define SET(offset, count, size) \
1306 if (symhdr->count == 0) \
1307 symhdr->offset = 0; \
1308 else \
1309 { \
1310 symhdr->offset = where; \
1311 where += symhdr->count * size; \
1312 }
1313
1314 SET (cbLineOffset, cbLine, sizeof (unsigned char));
1315 SET (cbDnOffset, idnMax, swap->external_dnr_size);
1316 SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1317 SET (cbSymOffset, isymMax, swap->external_sym_size);
1318 SET (cbOptOffset, ioptMax, swap->external_opt_size);
1319 SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1320 SET (cbSsOffset, issMax, sizeof (char));
1321 SET (cbSsExtOffset, issExtMax, sizeof (char));
1322 SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1323 SET (cbRfdOffset, crfd, swap->external_rfd_size);
1324 SET (cbExtOffset, iextMax, swap->external_ext_size);
1325 #undef SET
1326
1327 buff = (PTR) malloc (swap->external_hdr_size);
1328 if (buff == NULL && swap->external_hdr_size != 0)
1329 {
1330 bfd_set_error (bfd_error_no_memory);
1331 goto error_return;
1332 }
1333
1334 (*swap->swap_hdr_out) (abfd, symhdr, buff);
1335 if (bfd_write (buff, 1, swap->external_hdr_size, abfd)
1336 != swap->external_hdr_size)
1337 goto error_return;
1338
1339 if (buff != NULL)
1340 free (buff);
1341 return true;
1342 error_return:
1343 if (buff != NULL)
1344 free (buff);
1345 return false;
1346 }
1347
1348 /* Write out the ECOFF debugging information. This function assumes
1349 that the information (the pointers and counts) in *DEBUG have been
1350 set correctly. WHERE is the position in the file to write the
1351 information to. This function fills in the file offsets in the
1352 symbolic header. */
1353
1354 boolean
1355 bfd_ecoff_write_debug (abfd, debug, swap, where)
1356 bfd *abfd;
1357 struct ecoff_debug_info *debug;
1358 const struct ecoff_debug_swap *swap;
1359 file_ptr where;
1360 {
1361 HDRR * const symhdr = &debug->symbolic_header;
1362
1363 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1364 return false;
1365
1366 #define WRITE(ptr, count, size, offset) \
1367 BFD_ASSERT (symhdr->offset == 0 || bfd_tell (abfd) == symhdr->offset); \
1368 if (bfd_write ((PTR) debug->ptr, size, symhdr->count, abfd) \
1369 != size * symhdr->count) \
1370 return false;
1371
1372 WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1373 WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1374 WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1375 WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1376 WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1377 WRITE (external_aux, iauxMax, sizeof (union aux_ext), cbAuxOffset);
1378 WRITE (ss, issMax, sizeof (char), cbSsOffset);
1379 WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1380 WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1381 WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1382 WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1383 #undef WRITE
1384
1385 return true;
1386 }
1387
1388 /* Write out a shuffle list. */
1389
1390 static boolean ecoff_write_shuffle PARAMS ((bfd *,
1391 const struct ecoff_debug_swap *,
1392 struct shuffle *, PTR space));
1393
1394 static boolean
1395 ecoff_write_shuffle (abfd, swap, shuffle, space)
1396 bfd *abfd;
1397 const struct ecoff_debug_swap *swap;
1398 struct shuffle *shuffle;
1399 PTR space;
1400 {
1401 register struct shuffle *l;
1402 unsigned long total;
1403
1404 total = 0;
1405 for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1406 {
1407 if (! l->filep)
1408 {
1409 if (bfd_write (l->u.memory, 1, l->size, abfd) != l->size)
1410 return false;
1411 }
1412 else
1413 {
1414 if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1415 || bfd_read (space, 1, l->size, l->u.file.input_bfd) != l->size
1416 || bfd_write (space, 1, l->size, abfd) != l->size)
1417 return false;
1418 }
1419 total += l->size;
1420 }
1421
1422 if ((total & (swap->debug_align - 1)) != 0)
1423 {
1424 int i;
1425 bfd_byte *s;
1426
1427 i = swap->debug_align - (total & (swap->debug_align - 1));
1428 s = (bfd_byte *) malloc (i);
1429 if (s == NULL && i != 0)
1430 {
1431 bfd_set_error (bfd_error_no_memory);
1432 return false;
1433 }
1434
1435 memset ((PTR) s, 0, i);
1436 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1437 {
1438 free (s);
1439 return false;
1440 }
1441 free (s);
1442 }
1443
1444 return true;
1445 }
1446
1447 /* Write out debugging information using accumulated linker
1448 information. */
1449
1450 boolean
1451 bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where)
1452 PTR handle;
1453 bfd *abfd;
1454 struct ecoff_debug_info *debug;
1455 const struct ecoff_debug_swap *swap;
1456 struct bfd_link_info *info;
1457 file_ptr where;
1458 {
1459 struct accumulate *ainfo = (struct accumulate *) handle;
1460 PTR space = NULL;
1461
1462 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1463 goto error_return;
1464
1465 space = (PTR) malloc (ainfo->largest_file_shuffle);
1466 if (space == NULL && ainfo->largest_file_shuffle != 0)
1467 {
1468 bfd_set_error (bfd_error_no_memory);
1469 goto error_return;
1470 }
1471
1472 if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1473 || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1474 || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1475 || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1476 || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
1477 goto error_return;
1478
1479 /* The string table is written out from the hash table if this is a
1480 final link. */
1481 if (info->relocateable)
1482 {
1483 BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1484 if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
1485 goto error_return;
1486 }
1487 else
1488 {
1489 unsigned long total;
1490 bfd_byte null;
1491 struct string_hash_entry *sh;
1492
1493 BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1494 null = 0;
1495 if (bfd_write ((PTR) &null, 1, 1, abfd) != 1)
1496 goto error_return;
1497 total = 1;
1498 BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1499 for (sh = ainfo->ss_hash;
1500 sh != (struct string_hash_entry *) NULL;
1501 sh = sh->next)
1502 {
1503 size_t len;
1504
1505 len = strlen (sh->root.string);
1506 if (bfd_write ((PTR) sh->root.string, 1, len + 1, abfd) != len + 1)
1507 goto error_return;
1508 total += len + 1;
1509 }
1510
1511 if ((total & (swap->debug_align - 1)) != 0)
1512 {
1513 int i;
1514 bfd_byte *s;
1515
1516 i = swap->debug_align - (total & (swap->debug_align - 1));
1517 s = (bfd_byte *) malloc (i);
1518 if (s == NULL && i != 0)
1519 {
1520 bfd_set_error (bfd_error_no_memory);
1521 goto error_return;
1522 }
1523 memset ((PTR) s, 0, i);
1524 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1525 {
1526 free (s);
1527 goto error_return;
1528 }
1529 free (s);
1530 }
1531 }
1532
1533 /* The external strings and symbol are not converted over to using
1534 shuffles. FIXME: They probably should be. */
1535 if (bfd_write (debug->ssext, 1, debug->symbolic_header.issExtMax, abfd)
1536 != debug->symbolic_header.issExtMax)
1537 goto error_return;
1538 if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1539 {
1540 int i;
1541 bfd_byte *s;
1542
1543 i = (swap->debug_align
1544 - (debug->symbolic_header.issExtMax & (swap->debug_align - 1)));
1545 s = (bfd_byte *) malloc (i);
1546 if (s == NULL && i != 0)
1547 {
1548 bfd_set_error (bfd_error_no_memory);
1549 goto error_return;
1550 }
1551 memset ((PTR) s, 0, i);
1552 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1553 {
1554 free (s);
1555 goto error_return;
1556 }
1557 free (s);
1558 }
1559
1560 if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1561 || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
1562 goto error_return;
1563
1564 BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1565 || debug->symbolic_header.cbExtOffset == bfd_tell (abfd));
1566
1567 if (bfd_write (debug->external_ext, swap->external_ext_size,
1568 debug->symbolic_header.iextMax, abfd)
1569 != debug->symbolic_header.iextMax * swap->external_ext_size)
1570 goto error_return;
1571
1572 if (space != NULL)
1573 free (space);
1574 return true;
1575
1576 error_return:
1577 if (space != NULL)
1578 free (space);
1579 return false;
1580 }