* libelf.h (struct elf_backend_data): Change second argument of
[deliverable/binutils-gdb.git] / bfd / ecofflink.c
CommitLineData
71efdf83
ILT
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
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21#include "bfd.h"
22#include "sysdep.h"
cf286547 23#include "bfdlink.h"
71efdf83 24#include "libbfd.h"
cf286547 25#include "obstack.h"
71efdf83
ILT
26#include "coff/internal.h"
27#include "coff/sym.h"
28#include "coff/symconst.h"
29#include "coff/ecoff.h"
30\f
31static boolean ecoff_add_bytes PARAMS ((char **buf, char **bufend,
966e0a16 32 size_t need));
cf286547
ILT
33static struct bfd_hash_entry *string_hash_newfunc
34 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
35 const char *));
71efdf83
ILT
36static void ecoff_align_debug PARAMS ((bfd *abfd,
37 struct ecoff_debug_info *debug,
38 const struct ecoff_debug_swap *swap));
cf286547
ILT
39static 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. */
9783e04a 44#define obstack_chunk_alloc malloc
cf286547 45#define obstack_chunk_free free
71efdf83
ILT
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
52static boolean
53ecoff_add_bytes (buf, bufend, need)
54 char **buf;
55 char **bufend;
966e0a16 56 size_t need;
71efdf83 57{
966e0a16
ILT
58 size_t have;
59 size_t want;
71efdf83
ILT
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 {
d1ad85a6 77 bfd_set_error (bfd_error_no_memory);
71efdf83
ILT
78 return false;
79 }
80 *buf = newbuf;
81 *bufend = *buf + have + want;
82 return true;
83}
84
cf286547
ILT
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
89struct 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
98struct string_hash_table
99{
100 struct bfd_hash_table table;
101};
102
103/* Routine to create an entry in a string hash table. */
104
105static struct bfd_hash_entry *
106string_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)));
9783e04a
DM
118 if (ret == (struct string_hash_entry *) NULL)
119 {
d1ad85a6 120 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
121 return NULL;
122 }
cf286547
ILT
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
9783e04a
DM
128 if (ret)
129 {
130 /* Initialize the local fields. */
131 ret->val = -1;
132 ret->next = NULL;
133 }
cf286547
ILT
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
148struct 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
173struct 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
9783e04a 208static boolean add_file_shuffle PARAMS ((struct accumulate *,
cf286547
ILT
209 struct shuffle **,
210 struct shuffle **, bfd *, file_ptr,
211 unsigned long));
212
9783e04a 213static boolean
cf286547
ILT
214add_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;
9783e04a 233 return true;
cf286547
ILT
234 }
235
236 n = (struct shuffle *) obstack_alloc (&ainfo->memory,
237 sizeof (struct shuffle));
9783e04a
DM
238 if (!n)
239 {
d1ad85a6 240 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
241 return false;
242 }
cf286547
ILT
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;
9783e04a 255 return true;
cf286547
ILT
256}
257
258/* Add a memory entry to a shuffle list. */
259
9783e04a
DM
260static boolean add_memory_shuffle PARAMS ((struct accumulate *,
261 struct shuffle **head,
262 struct shuffle **tail,
263 bfd_byte *data, unsigned long size));
cf286547 264
9783e04a 265static boolean
cf286547
ILT
266add_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));
9783e04a
DM
277 if (!n)
278 {
d1ad85a6 279 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
280 return false;
281 }
cf286547
ILT
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;
9783e04a 291 return true;
cf286547
ILT
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*/
298PTR
299bfd_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
9783e04a
DM
307 ainfo = (struct accumulate *) malloc (sizeof (struct accumulate));
308 if (!ainfo)
309 {
d1ad85a6 310 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
311 return NULL;
312 }
cf286547
ILT
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
9783e04a
DM
347 if (!obstack_begin (&ainfo->memory, 4050))
348 {
d1ad85a6 349 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
350 return NULL;
351 }
cf286547
ILT
352
353 return (PTR) ainfo;
354}
355
356/* Free the accumulated debugging information. */
357
358/*ARGSUSED*/
359void
360bfd_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
71efdf83
ILT
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
cf286547
ILT
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. */
71efdf83 386
966e0a16 387/*ARGSUSED*/
71efdf83 388boolean
cf286547 389bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
71efdf83 390 input_bfd, input_debug, input_swap,
cf286547
ILT
391 info)
392 PTR handle;
71efdf83
ILT
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;
cf286547 399 struct bfd_link_info *info;
71efdf83 400{
cf286547 401 struct accumulate *ainfo = (struct accumulate *) handle;
71efdf83
ILT
402 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
403 = input_swap->swap_sym_in;
cf286547
ILT
404 void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
405 = input_swap->swap_rfd_in;
71efdf83
ILT
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;
cf286547
ILT
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;
71efdf83
ILT
419 bfd_vma section_adjust[scMax];
420 asection *sec;
cf286547
ILT
421 bfd_byte *fdr_start;
422 bfd_byte *fdr_ptr;
423 bfd_byte *fdr_end;
71efdf83 424 bfd_size_type fdr_add;
cf286547
ILT
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;
71efdf83
ILT
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
cf286547
ILT
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)
71efdf83 462 {
cf286547
ILT
463 fdr_start = (bfd_byte *) input_debug->fdr;
464 fdr_add = sizeof (FDR);
71efdf83 465 }
cf286547 466 else
71efdf83 467 {
cf286547
ILT
468 fdr_start = (bfd_byte *) input_debug->external_fdr;
469 fdr_add = input_swap->external_fdr_size;
71efdf83 470 }
cf286547
ILT
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);
9783e04a
DM
479 if (!input_debug->ifdmap || !rfd_out)
480 {
d1ad85a6 481 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
482 return false;
483 }
484 if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz))
485 return false;
cf286547
ILT
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)
71efdf83 500 {
cf286547 501 FDR fdr;
71efdf83 502
cf286547
ILT
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)
71efdf83 510 {
cf286547
ILT
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;
a3a33af3
ILT
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 }
cf286547
ILT
529 sprintf (lookup, "%s %lx", name, fdr.csym);
530
531 fh = string_hash_lookup (&ainfo->fdr_hash, lookup, true, true);
a3a33af3 532 free (lookup);
cf286547
ILT
533 if (fh == (struct string_hash_entry *) NULL)
534 return false;
71efdf83 535
cf286547
ILT
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);
71efdf83 541
cf286547
ILT
542 /* Don't copy this FDR. */
543 continue;
544 }
71efdf83 545
cf286547 546 fh->val = output_symhdr->ifdMax + copied;
71efdf83 547 }
cf286547
ILT
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;
71efdf83
ILT
552 }
553
cf286547
ILT
554 newrfdbase = output_symhdr->crfd;
555 output_symhdr->crfd += input_symhdr->ifdMax;
71efdf83 556
cf286547
ILT
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)
71efdf83 565 {
cf286547
ILT
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;
71efdf83 573 }
cf286547
ILT
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);
9783e04a
DM
582 if (!fdr_out)
583 {
d1ad85a6 584 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
585 return false;
586 }
587 if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz))
588 return false;
cf286547 589 for (fdr_ptr = fdr_start, i = 0;
71efdf83 590 fdr_ptr < fdr_end;
cf286547 591 fdr_ptr += fdr_add, i++)
71efdf83
ILT
592 {
593 FDR fdr;
ef79dba3 594 bfd_vma fdr_adr;
cf286547
ILT
595 bfd_byte *sym_out;
596 bfd_byte *lraw_src;
597 bfd_byte *lraw_end;
598 boolean fgotfilename;
599
600 if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
601 {
602 /* We are not copying this FDR. */
603 continue;
604 }
71efdf83
ILT
605
606 if (input_debug->fdr != (FDR *) NULL)
607 fdr = *(FDR *) fdr_ptr;
608 else
609 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
610
ef79dba3
ILT
611 fdr_adr = fdr.adr;
612
a3a33af3
ILT
613 /* Adjust the FDR address for any changes that may have been
614 made by relaxing. */
615 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
616 {
a3a33af3
ILT
617 struct ecoff_value_adjust *adjust;
618
a3a33af3
ILT
619 for (adjust = input_debug->adjust;
620 adjust != (struct ecoff_value_adjust *) NULL;
621 adjust = adjust->next)
ef79dba3
ILT
622 if (fdr_adr >= adjust->start
623 && fdr_adr < adjust->end)
a3a33af3
ILT
624 fdr.adr += adjust->adjust;
625 }
626
71efdf83
ILT
627 /* FIXME: It is conceivable that this FDR points to the .init or
628 .fini section, in which case this will not do the right
629 thing. */
630 fdr.adr += section_adjust[scText];
631
cf286547
ILT
632 /* Swap in the local symbols, adjust their values, and swap them
633 out again. */
634 fgotfilename = false;
635 sz = fdr.csym * external_sym_size;
636 sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
9783e04a
DM
637 if (!sym_out)
638 {
d1ad85a6 639 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
640 return false;
641 }
ef79dba3
ILT
642 if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out,
643 sz))
9783e04a 644 return false;
cf286547
ILT
645 lraw_src = ((bfd_byte *) input_debug->external_sym
646 + fdr.isymBase * input_swap->external_sym_size);
647 lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
648 for (; lraw_src < lraw_end; lraw_src += input_swap->external_sym_size)
649 {
650 SYMR internal_sym;
651
652 (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym);
653
654 BFD_ASSERT (internal_sym.sc != scCommon
655 && internal_sym.sc != scSCommon);
656
657 /* Adjust the symbol value if appropriate. */
658 switch (internal_sym.st)
659 {
660 case stNil:
661 if (ECOFF_IS_STAB (&internal_sym))
662 break;
663 /* Fall through. */
664 case stGlobal:
665 case stStatic:
666 case stLabel:
667 case stProc:
668 case stStaticProc:
a3a33af3
ILT
669 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
670 {
671 bfd_vma value;
672 struct ecoff_value_adjust *adjust;
673
674 value = internal_sym.value;
675 for (adjust = input_debug->adjust;
676 adjust != (struct ecoff_value_adjust *) NULL;
677 adjust = adjust->next)
678 if (value >= adjust->start
679 && value < adjust->end)
680 internal_sym.value += adjust->adjust;
681 }
cf286547
ILT
682 internal_sym.value += section_adjust[internal_sym.sc];
683 break;
684
685 default:
686 break;
687 }
688
689 /* If we are doing a final link, we hash all the strings in
690 the local symbol table together. This reduces the amount
691 of space required by debugging information. We don't do
692 this when performing a relocateable link because it would
693 prevent us from easily merging different FDR's. */
694 if (! info->relocateable)
695 {
696 boolean ffilename;
697 const char *name;
698
699 if (! fgotfilename && internal_sym.iss == fdr.rss)
700 ffilename = true;
701 else
702 ffilename = false;
703
704 /* Hash the name into the string table. */
705 name = input_debug->ss + fdr.issBase + internal_sym.iss;
706 if (*name == '\0')
707 internal_sym.iss = 0;
708 else
709 {
710 struct string_hash_entry *sh;
711
712 sh = string_hash_lookup (&ainfo->str_hash, name, true, true);
713 if (sh == (struct string_hash_entry *) NULL)
714 return false;
715 if (sh->val == -1)
716 {
717 sh->val = output_symhdr->issMax;
718 output_symhdr->issMax += strlen (name) + 1;
719 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
720 ainfo->ss_hash = sh;
721 if (ainfo->ss_hash_end
722 != (struct string_hash_entry *) NULL)
723 ainfo->ss_hash_end->next = sh;
724 ainfo->ss_hash_end = sh;
725 }
726 internal_sym.iss = sh->val;
727 }
728
729 if (ffilename)
730 {
731 fdr.rss = internal_sym.iss;
732 fgotfilename = true;
733 }
734 }
735
736 (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
737 sym_out += external_sym_size;
738 }
71efdf83 739
cf286547
ILT
740 fdr.isymBase = output_symhdr->isymMax;
741 output_symhdr->isymMax += fdr.csym;
71efdf83 742
cf286547 743 /* Copy the information that does not need swapping. */
ef79dba3
ILT
744
745 /* FIXME: If we are relaxing, we need to adjust the line
746 numbers. Frankly, forget it. Anybody using stabs debugging
747 information will not use this line number information, and
748 stabs are adjusted correctly. */
cf286547
ILT
749 if (fdr.cbLine > 0)
750 {
9783e04a 751 if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
ef79dba3
ILT
752 input_bfd,
753 input_symhdr->cbLineOffset + fdr.cbLineOffset,
754 fdr.cbLine))
9783e04a 755 return false;
cf286547
ILT
756 fdr.ilineBase = output_symhdr->ilineMax;
757 fdr.cbLineOffset = output_symhdr->cbLine;
758 output_symhdr->ilineMax += fdr.cline;
759 output_symhdr->cbLine += fdr.cbLine;
760 }
761 if (fdr.caux > 0)
762 {
9783e04a 763 if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
ef79dba3
ILT
764 input_bfd,
765 (input_symhdr->cbAuxOffset
766 + fdr.iauxBase * sizeof (union aux_ext)),
767 fdr.caux * sizeof (union aux_ext)))
9783e04a 768 return false;
cf286547
ILT
769 fdr.iauxBase = output_symhdr->iauxMax;
770 output_symhdr->iauxMax += fdr.caux;
771 }
772 if (! info->relocateable)
773 {
71efdf83 774
cf286547
ILT
775 /* When are are hashing strings, we lie about the number of
776 strings attached to each FDR. We need to set cbSs
777 because some versions of dbx apparently use it to decide
778 how much of the string table to read in. */
779 fdr.issBase = 0;
780 fdr.cbSs = output_symhdr->issMax;
781 }
782 else if (fdr.cbSs > 0)
783 {
9783e04a 784 if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
ef79dba3
ILT
785 input_bfd,
786 input_symhdr->cbSsOffset + fdr.issBase,
787 fdr.cbSs))
9783e04a 788 return false;
cf286547
ILT
789 fdr.issBase = output_symhdr->issMax;
790 output_symhdr->issMax += fdr.cbSs;
791 }
71efdf83 792
ef79dba3
ILT
793 if ((output_bfd->xvec->header_byteorder_big_p
794 == input_bfd->xvec->header_byteorder_big_p)
795 && input_debug->adjust == (struct ecoff_value_adjust *) NULL)
71efdf83 796 {
ef79dba3
ILT
797 /* The two BFD's have the same endianness, and we don't have
798 to adjust the PDR addresses, so simply copying the
799 information will suffice. */
cf286547
ILT
800 BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
801 if (fdr.cpd > 0)
9783e04a
DM
802 {
803 if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
804 input_bfd,
805 (input_symhdr->cbPdOffset
806 + fdr.ipdFirst * external_pdr_size),
807 fdr.cpd * external_pdr_size))
808 return false;
809 }
cf286547
ILT
810 BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
811 if (fdr.copt > 0)
9783e04a
DM
812 {
813 if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
814 input_bfd,
815 (input_symhdr->cbOptOffset
816 + fdr.ioptBase * external_opt_size),
817 fdr.copt * external_opt_size))
818 return false;
819 }
cf286547
ILT
820 }
821 else
822 {
823 bfd_size_type outsz, insz;
824 bfd_byte *in;
825 bfd_byte *end;
826 bfd_byte *out;
827
828 /* The two BFD's have different endianness, so we must swap
829 everything in and out. This code would always work, but
830 it would be unnecessarily slow in the normal case. */
831 outsz = external_pdr_size;
832 insz = input_swap->external_pdr_size;
833 in = ((bfd_byte *) input_debug->external_pdr
834 + fdr.ipdFirst * insz);
835 end = in + fdr.cpd * insz;
836 sz = fdr.cpd * outsz;
837 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
9783e04a
DM
838 if (!out)
839 {
d1ad85a6 840 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
841 return false;
842 }
ef79dba3
ILT
843 if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out,
844 sz))
9783e04a 845 return false;
cf286547
ILT
846 for (; in < end; in += insz, out += outsz)
847 {
848 PDR pdr;
849
850 (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr);
ef79dba3
ILT
851
852 /* If we have been relaxing, we may have to adjust the
853 address. */
854 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
855 {
856 bfd_vma adr;
857 struct ecoff_value_adjust *adjust;
858
859 adr = fdr_adr + pdr.adr;
860 for (adjust = input_debug->adjust;
861 adjust != (struct ecoff_value_adjust *) NULL;
862 adjust = adjust->next)
863 if (adr >= adjust->start
864 && adr < adjust->end)
865 pdr.adr += adjust->adjust;
866 }
867
cf286547
ILT
868 (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out);
869 }
870
871 /* Swap over the optimization information. */
872 outsz = external_opt_size;
873 insz = input_swap->external_opt_size;
874 in = ((bfd_byte *) input_debug->external_opt
875 + fdr.ioptBase * insz);
876 end = in + fdr.copt * insz;
877 sz = fdr.copt * outsz;
878 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
9783e04a
DM
879 if (!out)
880 {
d1ad85a6 881 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
882 return false;
883 }
ef79dba3
ILT
884 if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out,
885 sz))
9783e04a 886 return false;
cf286547
ILT
887 for (; in < end; in += insz, out += outsz)
888 {
889 OPTR opt;
890
891 (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt);
892 (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out);
893 }
894 }
895
896 fdr.ipdFirst = output_symhdr->ipdMax;
897 output_symhdr->ipdMax += fdr.cpd;
898 fdr.ioptBase = output_symhdr->ioptMax;
899 output_symhdr->ioptMax += fdr.copt;
71efdf83 900
cf286547
ILT
901 if (fdr.crfd <= 0)
902 {
903 /* Point this FDR at the table of RFD's we created. */
904 fdr.rfdBase = newrfdbase;
905 fdr.crfd = input_symhdr->ifdMax;
906 }
907 else
908 {
909 /* Point this FDR at the remapped RFD's. */
910 fdr.rfdBase += oldrfdbase;
71efdf83 911 }
71efdf83 912
cf286547
ILT
913 (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
914 fdr_out += external_fdr_size;
915 ++output_symhdr->ifdMax;
71efdf83
ILT
916 }
917
71efdf83
ILT
918 return true;
919}
920
921/* Add a string to the debugging information we are accumulating.
922 Return the offset from the fdr string base. */
923
cf286547
ILT
924static long ecoff_add_string PARAMS ((struct accumulate *,
925 struct bfd_link_info *,
926 struct ecoff_debug_info *,
927 FDR *fdr, const char *string));
928
929static long
930ecoff_add_string (ainfo, info, debug, fdr, string)
931 struct accumulate *ainfo;
932 struct bfd_link_info *info;
933 struct ecoff_debug_info *debug;
71efdf83
ILT
934 FDR *fdr;
935 const char *string;
936{
937 HDRR *symhdr;
938 size_t len;
939 bfd_size_type ret;
940
cf286547 941 symhdr = &debug->symbolic_header;
71efdf83 942 len = strlen (string);
cf286547
ILT
943 if (info->relocateable)
944 {
9783e04a
DM
945 if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string,
946 len + 1))
947 return -1;
cf286547
ILT
948 ret = symhdr->issMax;
949 symhdr->issMax += len + 1;
950 fdr->cbSs += len + 1;
951 }
952 else
71efdf83 953 {
cf286547
ILT
954 struct string_hash_entry *sh;
955
956 sh = string_hash_lookup (&ainfo->str_hash, string, true, true);
957 if (sh == (struct string_hash_entry *) NULL)
22a71fef 958 return -1;
cf286547
ILT
959 if (sh->val == -1)
960 {
961 sh->val = symhdr->issMax;
962 symhdr->issMax += len + 1;
963 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
964 ainfo->ss_hash = sh;
965 if (ainfo->ss_hash_end
966 != (struct string_hash_entry *) NULL)
967 ainfo->ss_hash_end->next = sh;
968 ainfo->ss_hash_end = sh;
969 }
970 ret = sh->val;
71efdf83 971 }
cf286547 972
71efdf83
ILT
973 return ret;
974}
975
976/* Add debugging information from a non-ECOFF file. */
977
978boolean
cf286547
ILT
979bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
980 output_swap, input_bfd, info)
981 PTR handle;
71efdf83
ILT
982 bfd *output_bfd;
983 struct ecoff_debug_info *output_debug;
984 const struct ecoff_debug_swap *output_swap;
985 bfd *input_bfd;
cf286547 986 struct bfd_link_info *info;
71efdf83 987{
cf286547 988 struct accumulate *ainfo = (struct accumulate *) handle;
71efdf83
ILT
989 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
990 = output_swap->swap_sym_out;
991 HDRR *output_symhdr = &output_debug->symbolic_header;
992 FDR fdr;
993 asection *sec;
994 asymbol **symbols;
995 asymbol **sym_ptr;
996 asymbol **sym_end;
326e32d7
ILT
997 long symsize;
998 long symcount;
cf286547 999 PTR external_fdr;
71efdf83 1000
68241b2b 1001 memset ((PTR) &fdr, 0, sizeof fdr);
71efdf83
ILT
1002
1003 sec = bfd_get_section_by_name (input_bfd, ".text");
1004 if (sec != NULL)
1005 fdr.adr = sec->output_section->vma + sec->output_offset;
1006 else
1007 {
1008 /* FIXME: What about .init or .fini? */
1009 fdr.adr = 0;
1010 }
1011
1012 fdr.issBase = output_symhdr->issMax;
1013 fdr.cbSs = 0;
cf286547 1014 fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
71efdf83 1015 bfd_get_filename (input_bfd));
966e0a16
ILT
1016 if (fdr.rss == -1)
1017 return false;
71efdf83
ILT
1018 fdr.isymBase = output_symhdr->isymMax;
1019
1020 /* Get the local symbols from the input BFD. */
326e32d7
ILT
1021 symsize = bfd_get_symtab_upper_bound (input_bfd);
1022 if (symsize < 0)
1023 return false;
1024 symbols = (asymbol **) bfd_alloc (output_bfd, symsize);
71efdf83
ILT
1025 if (symbols == (asymbol **) NULL)
1026 {
d1ad85a6 1027 bfd_set_error (bfd_error_no_memory);
71efdf83
ILT
1028 return false;
1029 }
326e32d7
ILT
1030 symcount = bfd_canonicalize_symtab (input_bfd, symbols);
1031 if (symcount < 0)
1032 return false;
1033 sym_end = symbols + symcount;
71efdf83
ILT
1034
1035 /* Handle the local symbols. Any external symbols are handled
1036 separately. */
1037 fdr.csym = 0;
1038 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1039 {
1040 SYMR internal_sym;
cf286547 1041 PTR external_sym;
71efdf83
ILT
1042
1043 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1044 continue;
68241b2b 1045 memset ((PTR) &internal_sym, 0, sizeof internal_sym);
cf286547 1046 internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
71efdf83
ILT
1047 (*sym_ptr)->name);
1048
966e0a16
ILT
1049 if (internal_sym.iss == -1)
1050 return false;
71efdf83
ILT
1051 if (bfd_is_com_section ((*sym_ptr)->section)
1052 || (*sym_ptr)->section == &bfd_und_section)
1053 internal_sym.value = (*sym_ptr)->value;
1054 else
1055 internal_sym.value = ((*sym_ptr)->value
1056 + (*sym_ptr)->section->output_offset
1057 + (*sym_ptr)->section->output_section->vma);
1058 internal_sym.st = stNil;
1059 internal_sym.sc = scUndefined;
1060 internal_sym.index = indexNil;
1061
cf286547
ILT
1062 external_sym = (PTR) obstack_alloc (&ainfo->memory,
1063 output_swap->external_sym_size);
9783e04a
DM
1064 if (!external_sym)
1065 {
d1ad85a6 1066 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1067 return false;
1068 }
cf286547
ILT
1069 (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1070 add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1071 external_sym, output_swap->external_sym_size);
71efdf83
ILT
1072 ++fdr.csym;
1073 ++output_symhdr->isymMax;
1074 }
1075
1076 bfd_release (output_bfd, (PTR) symbols);
1077
71efdf83
ILT
1078 /* Leave everything else in the FDR zeroed out. This will cause
1079 the lang field to be langC. The fBigendian field will
1080 indicate little endian format, but it doesn't matter because
1081 it only applies to aux fields and there are none. */
cf286547
ILT
1082 external_fdr = (PTR) obstack_alloc (&ainfo->memory,
1083 output_swap->external_fdr_size);
9783e04a
DM
1084 if (!external_fdr)
1085 {
d1ad85a6 1086 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1087 return false;
1088 }
cf286547
ILT
1089 (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1090 add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1091 external_fdr, output_swap->external_fdr_size);
1092
71efdf83 1093 ++output_symhdr->ifdMax;
cf286547 1094
71efdf83
ILT
1095 return true;
1096}
1097
cf286547
ILT
1098/* Set up ECOFF debugging information for the external symbols.
1099 FIXME: This is done using a memory buffer, but it should be
1100 probably be changed to use a shuffle structure. The assembler uses
1101 this interface, so that must be changed to do something else. */
71efdf83
ILT
1102
1103boolean
1104bfd_ecoff_debug_externals (abfd, debug, swap, relocateable, get_extr,
1105 set_index)
1106 bfd *abfd;
1107 struct ecoff_debug_info *debug;
1108 const struct ecoff_debug_swap *swap;
1109 boolean relocateable;
1110 boolean (*get_extr) PARAMS ((asymbol *, EXTR *));
1111 void (*set_index) PARAMS ((asymbol *, bfd_size_type));
1112{
71efdf83
ILT
1113 HDRR * const symhdr = &debug->symbolic_header;
1114 asymbol **sym_ptr_ptr;
1115 size_t c;
1116
1117 sym_ptr_ptr = bfd_get_outsymbols (abfd);
1118 if (sym_ptr_ptr == NULL)
1119 return true;
1120
1121 for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1122 {
1123 asymbol *sym_ptr;
1124 EXTR esym;
1125
1126 sym_ptr = *sym_ptr_ptr;
1127
1128 /* Get the external symbol information. */
1129 if ((*get_extr) (sym_ptr, &esym) == false)
1130 continue;
1131
1132 /* If we're producing an executable, move common symbols into
1133 bss. */
1134 if (relocateable == false)
1135 {
1136 if (esym.asym.sc == scCommon)
1137 esym.asym.sc = scBss;
1138 else if (esym.asym.sc == scSCommon)
1139 esym.asym.sc = scSBss;
1140 }
1141
71efdf83
ILT
1142 if (bfd_is_com_section (sym_ptr->section)
1143 || sym_ptr->section == &bfd_und_section)
cbc174e7
ILT
1144 {
1145 /* FIXME: gas does not keep the value of a small undefined
1146 symbol in the symbol itself, because of relocation
1147 problems. */
1148 if (esym.asym.sc != scSUndefined
1149 || esym.asym.value == 0
1150 || sym_ptr->value != 0)
1151 esym.asym.value = sym_ptr->value;
1152 }
71efdf83
ILT
1153 else
1154 esym.asym.value = (sym_ptr->value
1155 + sym_ptr->section->output_offset
1156 + sym_ptr->section->output_section->vma);
1157
71efdf83 1158 if (set_index)
966e0a16
ILT
1159 (*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1160
1161 if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1162 sym_ptr->name, &esym))
1163 return false;
1164 }
71efdf83 1165
966e0a16
ILT
1166 return true;
1167}
71efdf83 1168
966e0a16
ILT
1169/* Add a single external symbol to the debugging information. */
1170
1171boolean
1172bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym)
1173 bfd *abfd;
1174 struct ecoff_debug_info *debug;
1175 const struct ecoff_debug_swap *swap;
1176 const char *name;
1177 EXTR *esym;
1178{
1179 const bfd_size_type external_ext_size = swap->external_ext_size;
1180 void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
1181 = swap->swap_ext_out;
1182 HDRR * const symhdr = &debug->symbolic_header;
1183 size_t namelen;
1184
1185 namelen = strlen (name);
1186
1187 if (debug->ssext_end - debug->ssext
1188 < symhdr->issExtMax + namelen + 1)
1189 {
1190 if (ecoff_add_bytes ((char **) &debug->ssext,
1191 (char **) &debug->ssext_end,
1192 symhdr->issExtMax + namelen + 1)
1193 == false)
1194 return false;
1195 }
1196 if ((char *) debug->external_ext_end - (char *) debug->external_ext
1197 < (symhdr->iextMax + 1) * external_ext_size)
1198 {
1199 if (ecoff_add_bytes ((char **) &debug->external_ext,
1200 (char **) &debug->external_ext_end,
1201 (symhdr->iextMax + 1) * external_ext_size)
1202 == false)
1203 return false;
71efdf83
ILT
1204 }
1205
966e0a16
ILT
1206 esym->asym.iss = symhdr->issExtMax;
1207
1208 (*swap_ext_out) (abfd, esym,
1209 ((char *) debug->external_ext
1210 + symhdr->iextMax * swap->external_ext_size));
1211
1212 ++symhdr->iextMax;
1213
1214 strcpy (debug->ssext + symhdr->issExtMax, name);
1215 symhdr->issExtMax += namelen + 1;
1216
71efdf83
ILT
1217 return true;
1218}
1219
1220/* Align the ECOFF debugging information. */
1221
966e0a16 1222/*ARGSUSED*/
71efdf83
ILT
1223static void
1224ecoff_align_debug (abfd, debug, swap)
1225 bfd *abfd;
1226 struct ecoff_debug_info *debug;
1227 const struct ecoff_debug_swap *swap;
1228{
1229 HDRR * const symhdr = &debug->symbolic_header;
1fe2801a 1230 bfd_size_type debug_align, aux_align, rfd_align;
966e0a16 1231 size_t add;
71efdf83 1232
cf286547 1233 /* Adjust the counts so that structures are aligned. */
71efdf83
ILT
1234 debug_align = swap->debug_align;
1235 aux_align = debug_align / sizeof (union aux_ext);
1fe2801a 1236 rfd_align = debug_align / swap->external_rfd_size;
71efdf83
ILT
1237
1238 add = debug_align - (symhdr->cbLine & (debug_align - 1));
1239 if (add != debug_align)
1240 {
cf286547 1241 if (debug->line != (unsigned char *) NULL)
68241b2b 1242 memset ((PTR) (debug->line + symhdr->cbLine), 0, add);
71efdf83
ILT
1243 symhdr->cbLine += add;
1244 }
1245
1246 add = debug_align - (symhdr->issMax & (debug_align - 1));
1247 if (add != debug_align)
1248 {
cf286547 1249 if (debug->ss != (char *) NULL)
68241b2b 1250 memset ((PTR) (debug->ss + symhdr->issMax), 0, add);
71efdf83
ILT
1251 symhdr->issMax += add;
1252 }
1253
1254 add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1255 if (add != debug_align)
1256 {
cf286547 1257 if (debug->ssext != (char *) NULL)
68241b2b 1258 memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add);
71efdf83
ILT
1259 symhdr->issExtMax += add;
1260 }
1261
1262 add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1263 if (add != aux_align)
1264 {
cf286547 1265 if (debug->external_aux != (union aux_ext *) NULL)
68241b2b 1266 memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0,
cf286547 1267 add * sizeof (union aux_ext));
71efdf83
ILT
1268 symhdr->iauxMax += add;
1269 }
1fe2801a
ILT
1270
1271 add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1272 if (add != rfd_align)
1273 {
1274 if (debug->external_rfd != (PTR) NULL)
68241b2b
ILT
1275 memset ((PTR) ((char *) debug->external_rfd
1276 + symhdr->crfd * swap->external_rfd_size),
1fe2801a
ILT
1277 0, add * swap->external_rfd_size);
1278 symhdr->crfd += add;
1279 }
71efdf83
ILT
1280}
1281
1282/* Return the size required by the ECOFF debugging information. */
1283
1284bfd_size_type
1285bfd_ecoff_debug_size (abfd, debug, swap)
1286 bfd *abfd;
1287 struct ecoff_debug_info *debug;
1288 const struct ecoff_debug_swap *swap;
1289{
1290 bfd_size_type tot;
1291
1292 ecoff_align_debug (abfd, debug, swap);
1293 tot = swap->external_hdr_size;
1294
1295#define ADD(count, size) \
1296 tot += debug->symbolic_header.count * size
1297
1298 ADD (cbLine, sizeof (unsigned char));
1299 ADD (idnMax, swap->external_dnr_size);
1300 ADD (ipdMax, swap->external_pdr_size);
1301 ADD (isymMax, swap->external_sym_size);
1302 ADD (ioptMax, swap->external_opt_size);
1303 ADD (iauxMax, sizeof (union aux_ext));
1304 ADD (issMax, sizeof (char));
1305 ADD (issExtMax, sizeof (char));
1306 ADD (ifdMax, swap->external_fdr_size);
1307 ADD (crfd, swap->external_rfd_size);
1308 ADD (iextMax, swap->external_ext_size);
1309
1310#undef ADD
1311
1312 return tot;
1313}
1314
cf286547
ILT
1315/* Write out the ECOFF symbolic header, given the file position it is
1316 going to be placed at. This assumes that the counts are set
1317 correctly. */
71efdf83 1318
cf286547
ILT
1319static boolean
1320ecoff_write_symhdr (abfd, debug, swap, where)
71efdf83
ILT
1321 bfd *abfd;
1322 struct ecoff_debug_info *debug;
1323 const struct ecoff_debug_swap *swap;
1324 file_ptr where;
1325{
1326 HDRR * const symhdr = &debug->symbolic_header;
a3a33af3 1327 char *buff = NULL;
71efdf83
ILT
1328
1329 ecoff_align_debug (abfd, debug, swap);
1330
1331 /* Go to the right location in the file. */
1332 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1333 return false;
1334
1335 where += swap->external_hdr_size;
1336
68241b2b
ILT
1337 symhdr->magic = swap->sym_magic;
1338
71efdf83
ILT
1339 /* Fill in the file offsets. */
1340#define SET(offset, count, size) \
1341 if (symhdr->count == 0) \
1342 symhdr->offset = 0; \
1343 else \
1344 { \
1345 symhdr->offset = where; \
1346 where += symhdr->count * size; \
1347 }
1348
1349 SET (cbLineOffset, cbLine, sizeof (unsigned char));
1350 SET (cbDnOffset, idnMax, swap->external_dnr_size);
1351 SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1352 SET (cbSymOffset, isymMax, swap->external_sym_size);
1353 SET (cbOptOffset, ioptMax, swap->external_opt_size);
1354 SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1355 SET (cbSsOffset, issMax, sizeof (char));
1356 SET (cbSsExtOffset, issExtMax, sizeof (char));
1357 SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1358 SET (cbRfdOffset, crfd, swap->external_rfd_size);
1359 SET (cbExtOffset, iextMax, swap->external_ext_size);
1360#undef SET
1361
a3a33af3
ILT
1362 buff = (PTR) malloc (swap->external_hdr_size);
1363 if (buff == NULL && swap->external_hdr_size != 0)
1364 {
1365 bfd_set_error (bfd_error_no_memory);
1366 goto error_return;
1367 }
1368
71efdf83
ILT
1369 (*swap->swap_hdr_out) (abfd, symhdr, buff);
1370 if (bfd_write (buff, 1, swap->external_hdr_size, abfd)
1371 != swap->external_hdr_size)
a3a33af3 1372 goto error_return;
71efdf83 1373
a3a33af3
ILT
1374 if (buff != NULL)
1375 free (buff);
cf286547 1376 return true;
a3a33af3
ILT
1377 error_return:
1378 if (buff != NULL)
1379 free (buff);
1380 return false;
cf286547
ILT
1381}
1382
1383/* Write out the ECOFF debugging information. This function assumes
1384 that the information (the pointers and counts) in *DEBUG have been
1385 set correctly. WHERE is the position in the file to write the
1386 information to. This function fills in the file offsets in the
1387 symbolic header. */
1388
1389boolean
1390bfd_ecoff_write_debug (abfd, debug, swap, where)
1391 bfd *abfd;
1392 struct ecoff_debug_info *debug;
1393 const struct ecoff_debug_swap *swap;
1394 file_ptr where;
1395{
1396 HDRR * const symhdr = &debug->symbolic_header;
1397
1398 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1399 return false;
1400
71efdf83
ILT
1401#define WRITE(ptr, count, size, offset) \
1402 BFD_ASSERT (symhdr->offset == 0 || bfd_tell (abfd) == symhdr->offset); \
966e0a16 1403 if (bfd_write ((PTR) debug->ptr, size, symhdr->count, abfd) \
71efdf83
ILT
1404 != size * symhdr->count) \
1405 return false;
1406
1407 WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1408 WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1409 WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1410 WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1411 WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1412 WRITE (external_aux, iauxMax, sizeof (union aux_ext), cbAuxOffset);
1413 WRITE (ss, issMax, sizeof (char), cbSsOffset);
1414 WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1415 WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1416 WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1417 WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1418#undef WRITE
1419
1420 return true;
1421}
cf286547
ILT
1422
1423/* Write out a shuffle list. */
1424
1425static boolean ecoff_write_shuffle PARAMS ((bfd *,
1426 const struct ecoff_debug_swap *,
1427 struct shuffle *, PTR space));
1428
1429static boolean
1430ecoff_write_shuffle (abfd, swap, shuffle, space)
1431 bfd *abfd;
1432 const struct ecoff_debug_swap *swap;
1433 struct shuffle *shuffle;
1434 PTR space;
1435{
1436 register struct shuffle *l;
1437 unsigned long total;
1438
1439 total = 0;
1440 for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1441 {
1442 if (! l->filep)
1443 {
1444 if (bfd_write (l->u.memory, 1, l->size, abfd) != l->size)
1445 return false;
1446 }
1447 else
1448 {
1449 if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1450 || bfd_read (space, 1, l->size, l->u.file.input_bfd) != l->size
1451 || bfd_write (space, 1, l->size, abfd) != l->size)
1452 return false;
1453 }
1454 total += l->size;
1455 }
1456
1457 if ((total & (swap->debug_align - 1)) != 0)
1458 {
1459 int i;
1460 bfd_byte *s;
1461
1462 i = swap->debug_align - (total & (swap->debug_align - 1));
a3a33af3
ILT
1463 s = (bfd_byte *) malloc (i);
1464 if (s == NULL && i != 0)
1465 {
1466 bfd_set_error (bfd_error_no_memory);
1467 return false;
1468 }
1469
68241b2b 1470 memset ((PTR) s, 0, i);
cf286547 1471 if (bfd_write ((PTR) s, 1, i, abfd) != i)
a3a33af3
ILT
1472 {
1473 free (s);
1474 return false;
1475 }
1476 free (s);
cf286547
ILT
1477 }
1478
1479 return true;
1480}
1481
1482/* Write out debugging information using accumulated linker
1483 information. */
1484
1485boolean
1486bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where)
1487 PTR handle;
1488 bfd *abfd;
1489 struct ecoff_debug_info *debug;
1490 const struct ecoff_debug_swap *swap;
1491 struct bfd_link_info *info;
1492 file_ptr where;
1493{
1494 struct accumulate *ainfo = (struct accumulate *) handle;
a3a33af3 1495 PTR space = NULL;
cf286547
ILT
1496
1497 if (! ecoff_write_symhdr (abfd, debug, swap, where))
a3a33af3 1498 goto error_return;
cf286547 1499
a3a33af3
ILT
1500 space = (PTR) malloc (ainfo->largest_file_shuffle);
1501 if (space == NULL && ainfo->largest_file_shuffle != 0)
1502 {
1503 bfd_set_error (bfd_error_no_memory);
1504 goto error_return;
1505 }
cf286547
ILT
1506
1507 if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1508 || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1509 || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1510 || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1511 || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
a3a33af3 1512 goto error_return;
cf286547
ILT
1513
1514 /* The string table is written out from the hash table if this is a
1515 final link. */
1516 if (info->relocateable)
1517 {
1518 BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1519 if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
a3a33af3 1520 goto error_return;
cf286547
ILT
1521 }
1522 else
1523 {
1524 unsigned long total;
1525 bfd_byte null;
1526 struct string_hash_entry *sh;
1527
1528 BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1529 null = 0;
1530 if (bfd_write ((PTR) &null, 1, 1, abfd) != 1)
a3a33af3 1531 goto error_return;
cf286547
ILT
1532 total = 1;
1533 BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1534 for (sh = ainfo->ss_hash;
1535 sh != (struct string_hash_entry *) NULL;
1536 sh = sh->next)
1537 {
1538 size_t len;
1539
1540 len = strlen (sh->root.string);
1541 if (bfd_write ((PTR) sh->root.string, 1, len + 1, abfd) != len + 1)
a3a33af3 1542 goto error_return;
cf286547
ILT
1543 total += len + 1;
1544 }
1545
1546 if ((total & (swap->debug_align - 1)) != 0)
1547 {
1548 int i;
1549 bfd_byte *s;
1550
1551 i = swap->debug_align - (total & (swap->debug_align - 1));
a3a33af3
ILT
1552 s = (bfd_byte *) malloc (i);
1553 if (s == NULL && i != 0)
1554 {
1555 bfd_set_error (bfd_error_no_memory);
1556 goto error_return;
1557 }
68241b2b 1558 memset ((PTR) s, 0, i);
cf286547 1559 if (bfd_write ((PTR) s, 1, i, abfd) != i)
a3a33af3
ILT
1560 {
1561 free (s);
1562 goto error_return;
1563 }
1564 free (s);
cf286547
ILT
1565 }
1566 }
1567
1568 /* The external strings and symbol are not converted over to using
1569 shuffles. FIXME: They probably should be. */
1570 if (bfd_write (debug->ssext, 1, debug->symbolic_header.issExtMax, abfd)
1571 != debug->symbolic_header.issExtMax)
a3a33af3 1572 goto error_return;
cf286547
ILT
1573 if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1574 {
1575 int i;
1576 bfd_byte *s;
1577
1578 i = (swap->debug_align
1579 - (debug->symbolic_header.issExtMax & (swap->debug_align - 1)));
a3a33af3
ILT
1580 s = (bfd_byte *) malloc (i);
1581 if (s == NULL && i != 0)
1582 {
1583 bfd_set_error (bfd_error_no_memory);
1584 goto error_return;
1585 }
68241b2b 1586 memset ((PTR) s, 0, i);
cf286547 1587 if (bfd_write ((PTR) s, 1, i, abfd) != i)
a3a33af3
ILT
1588 {
1589 free (s);
1590 goto error_return;
1591 }
1592 free (s);
cf286547
ILT
1593 }
1594
1595 if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1596 || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
a3a33af3 1597 goto error_return;
cf286547
ILT
1598
1599 BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1600 || debug->symbolic_header.cbExtOffset == bfd_tell (abfd));
1601
1602 if (bfd_write (debug->external_ext, swap->external_ext_size,
1603 debug->symbolic_header.iextMax, abfd)
1604 != debug->symbolic_header.iextMax * swap->external_ext_size)
a3a33af3 1605 goto error_return;
cf286547 1606
a3a33af3
ILT
1607 if (space != NULL)
1608 free (space);
cf286547 1609 return true;
a3a33af3
ILT
1610
1611 error_return:
1612 if (space != NULL)
1613 free (space);
1614 return false;
cf286547 1615}
This page took 0.117905 seconds and 4 git commands to generate.