1 /* Routines to link ECOFF debugging information.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
27 #include "objalloc.h"
28 #include "aout/stab_gnu.h"
29 #include "coff/internal.h"
30 #include "coff/sym.h"
31 #include "coff/symconst.h"
32 #include "coff/ecoff.h"
33 #include "libcoff.h"
34 #include "libecoff.h"
35 
36 static bfd_boolean ecoff_add_bytes
37   PARAMS ((char **buf, char **bufend, size_t need));
38 static struct bfd_hash_entry *string_hash_newfunc
39   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
40 	   const char *));
41 static void ecoff_align_debug
42   PARAMS ((bfd *abfd, struct ecoff_debug_info *debug,
43 	   const struct ecoff_debug_swap *swap));
44 static bfd_boolean ecoff_write_symhdr
45   PARAMS ((bfd *, struct ecoff_debug_info *, const struct ecoff_debug_swap *,
46 	   file_ptr where));
47 static int cmp_fdrtab_entry
48   PARAMS ((const PTR, const PTR));
49 static bfd_boolean mk_fdrtab
50   PARAMS ((bfd *, struct ecoff_debug_info * const,
51 	   const struct ecoff_debug_swap * const, struct ecoff_find_line *));
52 static long fdrtab_lookup
53   PARAMS ((struct ecoff_find_line *, bfd_vma));
54 static bfd_boolean lookup_line
55   PARAMS ((bfd *, struct ecoff_debug_info * const,
56 	   const struct ecoff_debug_swap * const, struct ecoff_find_line *));
57 
58 /* Routines to swap auxiliary information in and out.  I am assuming
59    that the auxiliary information format is always going to be target
60    independent.  */
61 
62 /* Swap in a type information record.
63    BIGEND says whether AUX symbols are big-endian or little-endian; this
64    info comes from the file header record (fh-fBigendian).  */
65 
66 void
67 _bfd_ecoff_swap_tir_in (bigend, ext_copy, intern)
68      int bigend;
69      const struct tir_ext *ext_copy;
70      TIR *intern;
71 {
72   struct tir_ext ext[1];
73 
74   *ext = *ext_copy;		/* Make it reasonable to do in-place.  */
75 
76   /* now the fun stuff...  */
77   if (bigend) {
78     intern->fBitfield   = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_BIG);
79     intern->continued   = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_BIG);
80     intern->bt          = (ext->t_bits1[0] & TIR_BITS1_BT_BIG)
81 			>>		    TIR_BITS1_BT_SH_BIG;
82     intern->tq4         = (ext->t_tq45[0] & TIR_BITS_TQ4_BIG)
83 			>>		    TIR_BITS_TQ4_SH_BIG;
84     intern->tq5         = (ext->t_tq45[0] & TIR_BITS_TQ5_BIG)
85 			>>		    TIR_BITS_TQ5_SH_BIG;
86     intern->tq0         = (ext->t_tq01[0] & TIR_BITS_TQ0_BIG)
87 			>>		    TIR_BITS_TQ0_SH_BIG;
88     intern->tq1         = (ext->t_tq01[0] & TIR_BITS_TQ1_BIG)
89 			>>		    TIR_BITS_TQ1_SH_BIG;
90     intern->tq2         = (ext->t_tq23[0] & TIR_BITS_TQ2_BIG)
91 			>>		    TIR_BITS_TQ2_SH_BIG;
92     intern->tq3         = (ext->t_tq23[0] & TIR_BITS_TQ3_BIG)
93 			>>		    TIR_BITS_TQ3_SH_BIG;
94   } else {
95     intern->fBitfield   = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_LITTLE);
96     intern->continued   = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_LITTLE);
97     intern->bt          = (ext->t_bits1[0] & TIR_BITS1_BT_LITTLE)
98 			>>		    TIR_BITS1_BT_SH_LITTLE;
99     intern->tq4         = (ext->t_tq45[0] & TIR_BITS_TQ4_LITTLE)
100 			>>		    TIR_BITS_TQ4_SH_LITTLE;
101     intern->tq5         = (ext->t_tq45[0] & TIR_BITS_TQ5_LITTLE)
102 			>>		    TIR_BITS_TQ5_SH_LITTLE;
103     intern->tq0         = (ext->t_tq01[0] & TIR_BITS_TQ0_LITTLE)
104 			>>		    TIR_BITS_TQ0_SH_LITTLE;
105     intern->tq1         = (ext->t_tq01[0] & TIR_BITS_TQ1_LITTLE)
106 			>>		    TIR_BITS_TQ1_SH_LITTLE;
107     intern->tq2         = (ext->t_tq23[0] & TIR_BITS_TQ2_LITTLE)
108 			>>		    TIR_BITS_TQ2_SH_LITTLE;
109     intern->tq3         = (ext->t_tq23[0] & TIR_BITS_TQ3_LITTLE)
110 			>>		    TIR_BITS_TQ3_SH_LITTLE;
111   }
112 
113 #ifdef TEST
114   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
115     abort ();
116 #endif
117 }
118 
119 /* Swap out a type information record.
120    BIGEND says whether AUX symbols are big-endian or little-endian; this
121    info comes from the file header record (fh-fBigendian).  */
122 
123 void
124 _bfd_ecoff_swap_tir_out (bigend, intern_copy, ext)
125      int bigend;
126      const TIR *intern_copy;
127      struct tir_ext *ext;
128 {
129   TIR intern[1];
130 
131   *intern = *intern_copy;	/* Make it reasonable to do in-place.  */
132 
133   /* now the fun stuff...  */
134   if (bigend) {
135     ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_BIG : 0)
136 		       | (intern->continued ? TIR_BITS1_CONTINUED_BIG : 0)
137 		       | ((intern->bt << TIR_BITS1_BT_SH_BIG)
138 			  & TIR_BITS1_BT_BIG));
139     ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_BIG)
140 		       & TIR_BITS_TQ4_BIG)
141 		      | ((intern->tq5 << TIR_BITS_TQ5_SH_BIG)
142 			 & TIR_BITS_TQ5_BIG));
143     ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_BIG)
144 		       & TIR_BITS_TQ0_BIG)
145 		      | ((intern->tq1 << TIR_BITS_TQ1_SH_BIG)
146 			 & TIR_BITS_TQ1_BIG));
147     ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_BIG)
148 		       & TIR_BITS_TQ2_BIG)
149 		      | ((intern->tq3 << TIR_BITS_TQ3_SH_BIG)
150 			 & TIR_BITS_TQ3_BIG));
151   } else {
152     ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_LITTLE : 0)
153 		       | (intern->continued ? TIR_BITS1_CONTINUED_LITTLE : 0)
154 		       | ((intern->bt << TIR_BITS1_BT_SH_LITTLE)
155 			  & TIR_BITS1_BT_LITTLE));
156     ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_LITTLE)
157 		       & TIR_BITS_TQ4_LITTLE)
158 		      | ((intern->tq5 << TIR_BITS_TQ5_SH_LITTLE)
159 			 & TIR_BITS_TQ5_LITTLE));
160     ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_LITTLE)
161 		       & TIR_BITS_TQ0_LITTLE)
162 		      | ((intern->tq1 << TIR_BITS_TQ1_SH_LITTLE)
163 			 & TIR_BITS_TQ1_LITTLE));
164     ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_LITTLE)
165 		       & TIR_BITS_TQ2_LITTLE)
166 		      | ((intern->tq3 << TIR_BITS_TQ3_SH_LITTLE)
167 			 & TIR_BITS_TQ3_LITTLE));
168   }
169 
170 #ifdef TEST
171   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
172     abort ();
173 #endif
174 }
175 
176 /* Swap in a relative symbol record.  BIGEND says whether it is in
177    big-endian or little-endian format.*/
178 
179 void
180 _bfd_ecoff_swap_rndx_in (bigend, ext_copy, intern)
181      int bigend;
182      const struct rndx_ext *ext_copy;
183      RNDXR *intern;
184 {
185   struct rndx_ext ext[1];
186 
187   *ext = *ext_copy;		/* Make it reasonable to do in-place.  */
188 
189   /* now the fun stuff...  */
190   if (bigend) {
191     intern->rfd   = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_BIG)
192 		  | ((ext->r_bits[1] & RNDX_BITS1_RFD_BIG)
193 		    		    >> RNDX_BITS1_RFD_SH_BIG);
194     intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_BIG)
195 		    		    << RNDX_BITS1_INDEX_SH_LEFT_BIG)
196 		  | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_BIG)
197 		  | (ext->r_bits[3] << RNDX_BITS3_INDEX_SH_LEFT_BIG);
198   } else {
199     intern->rfd   = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_LITTLE)
200 		  | ((ext->r_bits[1] & RNDX_BITS1_RFD_LITTLE)
201 		    		    << RNDX_BITS1_RFD_SH_LEFT_LITTLE);
202     intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_LITTLE)
203 		    		    >> RNDX_BITS1_INDEX_SH_LITTLE)
204 		  | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_LITTLE)
205 		  | ((unsigned int) ext->r_bits[3]
206 		     << RNDX_BITS3_INDEX_SH_LEFT_LITTLE);
207   }
208 
209 #ifdef TEST
210   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
211     abort ();
212 #endif
213 }
214 
215 /* Swap out a relative symbol record.  BIGEND says whether it is in
216    big-endian or little-endian format.*/
217 
218 void
219 _bfd_ecoff_swap_rndx_out (bigend, intern_copy, ext)
220      int bigend;
221      const RNDXR *intern_copy;
222      struct rndx_ext *ext;
223 {
224   RNDXR intern[1];
225 
226   *intern = *intern_copy;	/* Make it reasonable to do in-place.  */
227 
228   /* now the fun stuff...  */
229   if (bigend) {
230     ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_BIG;
231     ext->r_bits[1] = (((intern->rfd << RNDX_BITS1_RFD_SH_BIG)
232 		       & RNDX_BITS1_RFD_BIG)
233 		      | ((intern->index >> RNDX_BITS1_INDEX_SH_LEFT_BIG)
234 			 & RNDX_BITS1_INDEX_BIG));
235     ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_BIG;
236     ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_BIG;
237   } else {
238     ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_LITTLE;
239     ext->r_bits[1] = (((intern->rfd >> RNDX_BITS1_RFD_SH_LEFT_LITTLE)
240 		       & RNDX_BITS1_RFD_LITTLE)
241 		      | ((intern->index << RNDX_BITS1_INDEX_SH_LITTLE)
242 			 & RNDX_BITS1_INDEX_LITTLE));
243     ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_LITTLE;
244     ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_LITTLE;
245   }
246 
247 #ifdef TEST
248   if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0)
249     abort ();
250 #endif
251 }
252 
253 /* The minimum amount of data to allocate.  */
254 #define ALLOC_SIZE (4064)
255 
256 /* Add bytes to a buffer.  Return success.  */
257 
258 static bfd_boolean
259 ecoff_add_bytes (buf, bufend, need)
260      char **buf;
261      char **bufend;
262      size_t need;
263 {
264   size_t have;
265   size_t want;
266   char *newbuf;
267 
268   have = *bufend - *buf;
269   if (have > need)
270     want = ALLOC_SIZE;
271   else
272     {
273       want = need - have;
274       if (want < ALLOC_SIZE)
275 	want = ALLOC_SIZE;
276     }
277   newbuf = (char *) bfd_realloc (*buf, (bfd_size_type) have + want);
278   if (newbuf == NULL)
279     return FALSE;
280   *buf = newbuf;
281   *bufend = *buf + have + want;
282   return TRUE;
283 }
284 
285 /* We keep a hash table which maps strings to numbers.  We use it to
286    map FDR names to indices in the output file, and to map local
287    strings when combining stabs debugging information.  */
288 
289 struct string_hash_entry
290 {
291   struct bfd_hash_entry root;
292   /* FDR index or string table offset.  */
293   long val;
294   /* Next entry in string table.  */
295   struct string_hash_entry *next;
296 };
297 
298 struct string_hash_table
299 {
300   struct bfd_hash_table table;
301 };
302 
303 /* Routine to create an entry in a string hash table.  */
304 
305 static struct bfd_hash_entry *
306 string_hash_newfunc (entry, table, string)
307      struct bfd_hash_entry *entry;
308      struct bfd_hash_table *table;
309      const char *string;
310 {
311   struct string_hash_entry *ret = (struct string_hash_entry *) entry;
312 
313   /* Allocate the structure if it has not already been allocated by a
314      subclass.  */
315   if (ret == (struct string_hash_entry *) NULL)
316     ret = ((struct string_hash_entry *)
317 	   bfd_hash_allocate (table, sizeof (struct string_hash_entry)));
318   if (ret == (struct string_hash_entry *) NULL)
319     return NULL;
320 
321   /* Call the allocation method of the superclass.  */
322   ret = ((struct string_hash_entry *)
323 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
324 
325   if (ret)
326     {
327       /* Initialize the local fields.  */
328       ret->val = -1;
329       ret->next = NULL;
330     }
331 
332   return (struct bfd_hash_entry *) ret;
333 }
334 
335 /* Look up an entry in an string hash table.  */
336 
337 #define string_hash_lookup(t, string, create, copy) \
338   ((struct string_hash_entry *) \
339    bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
340 
341 /* We can't afford to read in all the debugging information when we do
342    a link.  Instead, we build a list of these structures to show how
343    different parts of the input file map to the output file.  */
344 
345 struct shuffle
346 {
347   /* The next entry in this linked list.  */
348   struct shuffle *next;
349   /* The length of the information.  */
350   unsigned long size;
351   /* Whether this information comes from a file or not.  */
352   bfd_boolean filep;
353   union
354     {
355       struct
356 	{
357 	  /* The BFD the data comes from.  */
358 	  bfd *input_bfd;
359 	  /* The offset within input_bfd.  */
360 	  file_ptr offset;
361 	} file;
362       /* The data to be written out.  */
363       PTR memory;
364     } u;
365 };
366 
367 /* This structure holds information across calls to
368    bfd_ecoff_debug_accumulate.  */
369 
370 struct accumulate
371 {
372   /* The FDR hash table.  */
373   struct string_hash_table fdr_hash;
374   /* The strings hash table.  */
375   struct string_hash_table str_hash;
376   /* Linked lists describing how to shuffle the input debug
377      information into the output file.  We keep a pointer to both the
378      head and the tail.  */
379   struct shuffle *line;
380   struct shuffle *line_end;
381   struct shuffle *pdr;
382   struct shuffle *pdr_end;
383   struct shuffle *sym;
384   struct shuffle *sym_end;
385   struct shuffle *opt;
386   struct shuffle *opt_end;
387   struct shuffle *aux;
388   struct shuffle *aux_end;
389   struct shuffle *ss;
390   struct shuffle *ss_end;
391   struct string_hash_entry *ss_hash;
392   struct string_hash_entry *ss_hash_end;
393   struct shuffle *fdr;
394   struct shuffle *fdr_end;
395   struct shuffle *rfd;
396   struct shuffle *rfd_end;
397   /* The size of the largest file shuffle.  */
398   unsigned long largest_file_shuffle;
399   /* An objalloc for debugging information.  */
400   struct objalloc *memory;
401 };
402 
403 /* Add a file entry to a shuffle list.  */
404 
405 static bfd_boolean add_file_shuffle
406   PARAMS ((struct accumulate *, struct shuffle **, struct shuffle **,
407 	   bfd *, file_ptr, unsigned long));
408 
409 static bfd_boolean
410 add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
411      struct accumulate *ainfo;
412      struct shuffle **head;
413      struct shuffle **tail;
414      bfd *input_bfd;
415      file_ptr offset;
416      unsigned long size;
417 {
418   struct shuffle *n;
419 
420   if (*tail != (struct shuffle *) NULL
421       && (*tail)->filep
422       && (*tail)->u.file.input_bfd == input_bfd
423       && (*tail)->u.file.offset + (*tail)->size == (unsigned long) offset)
424     {
425       /* Just merge this entry onto the existing one.  */
426       (*tail)->size += size;
427       if ((*tail)->size > ainfo->largest_file_shuffle)
428 	ainfo->largest_file_shuffle = (*tail)->size;
429       return TRUE;
430     }
431 
432   n = (struct shuffle *) objalloc_alloc (ainfo->memory,
433 					 sizeof (struct shuffle));
434   if (!n)
435     {
436       bfd_set_error (bfd_error_no_memory);
437       return FALSE;
438     }
439   n->next = NULL;
440   n->size = size;
441   n->filep = TRUE;
442   n->u.file.input_bfd = input_bfd;
443   n->u.file.offset = offset;
444   if (*head == (struct shuffle *) NULL)
445     *head = n;
446   if (*tail != (struct shuffle *) NULL)
447     (*tail)->next = n;
448   *tail = n;
449   if (size > ainfo->largest_file_shuffle)
450     ainfo->largest_file_shuffle = size;
451   return TRUE;
452 }
453 
454 /* Add a memory entry to a shuffle list.  */
455 
456 static bfd_boolean add_memory_shuffle
457   PARAMS ((struct accumulate *, struct shuffle **head, struct shuffle **tail,
458 	   bfd_byte *data, unsigned long size));
459 
460 static bfd_boolean
461 add_memory_shuffle (ainfo, head, tail, data, size)
462      struct accumulate *ainfo;
463      struct shuffle **head;
464      struct shuffle **tail;
465      bfd_byte *data;
466      unsigned long size;
467 {
468   struct shuffle *n;
469 
470   n = (struct shuffle *) objalloc_alloc (ainfo->memory,
471 					 sizeof (struct shuffle));
472   if (!n)
473     {
474       bfd_set_error (bfd_error_no_memory);
475       return FALSE;
476     }
477   n->next = NULL;
478   n->size = size;
479   n->filep = FALSE;
480   n->u.memory = (PTR) data;
481   if (*head == (struct shuffle *) NULL)
482     *head = n;
483   if (*tail != (struct shuffle *) NULL)
484     (*tail)->next = n;
485   *tail = n;
486   return TRUE;
487 }
488 
489 /* Initialize the FDR hash table.  This returns a handle which is then
490    passed in to bfd_ecoff_debug_accumulate, et. al.  */
491 
492 PTR
493 bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info)
494      bfd *output_bfd ATTRIBUTE_UNUSED;
495      struct ecoff_debug_info *output_debug;
496      const struct ecoff_debug_swap *output_swap ATTRIBUTE_UNUSED;
497      struct bfd_link_info *info;
498 {
499   struct accumulate *ainfo;
500   bfd_size_type amt = sizeof (struct accumulate);
501 
502   ainfo = (struct accumulate *) bfd_malloc (amt);
503   if (!ainfo)
504     return NULL;
505   if (!bfd_hash_table_init_n (&ainfo->fdr_hash.table, string_hash_newfunc,
506 			      sizeof (struct string_hash_entry), 1021))
507     return NULL;
508 
509   ainfo->line = NULL;
510   ainfo->line_end = NULL;
511   ainfo->pdr = NULL;
512   ainfo->pdr_end = NULL;
513   ainfo->sym = NULL;
514   ainfo->sym_end = NULL;
515   ainfo->opt = NULL;
516   ainfo->opt_end = NULL;
517   ainfo->aux = NULL;
518   ainfo->aux_end = NULL;
519   ainfo->ss = NULL;
520   ainfo->ss_end = NULL;
521   ainfo->ss_hash = NULL;
522   ainfo->ss_hash_end = NULL;
523   ainfo->fdr = NULL;
524   ainfo->fdr_end = NULL;
525   ainfo->rfd = NULL;
526   ainfo->rfd_end = NULL;
527 
528   ainfo->largest_file_shuffle = 0;
529 
530   if (! info->relocatable)
531     {
532       if (!bfd_hash_table_init (&ainfo->str_hash.table, string_hash_newfunc,
533 				sizeof (struct string_hash_entry)))
534 	return NULL;
535 
536       /* The first entry in the string table is the empty string.  */
537       output_debug->symbolic_header.issMax = 1;
538     }
539 
540   ainfo->memory = objalloc_create ();
541   if (ainfo->memory == NULL)
542     {
543       bfd_set_error (bfd_error_no_memory);
544       return NULL;
545     }
546 
547   return (PTR) ainfo;
548 }
549 
550 /* Free the accumulated debugging information.  */
551 
552 void
553 bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
554      PTR handle;
555      bfd *output_bfd ATTRIBUTE_UNUSED;
556      struct ecoff_debug_info *output_debug ATTRIBUTE_UNUSED;
557      const struct ecoff_debug_swap *output_swap ATTRIBUTE_UNUSED;
558      struct bfd_link_info *info;
559 {
560   struct accumulate *ainfo = (struct accumulate *) handle;
561 
562   bfd_hash_table_free (&ainfo->fdr_hash.table);
563 
564   if (! info->relocatable)
565     bfd_hash_table_free (&ainfo->str_hash.table);
566 
567   objalloc_free (ainfo->memory);
568 
569   free (ainfo);
570 }
571 
572 /* Accumulate the debugging information from INPUT_BFD into
573    OUTPUT_BFD.  The INPUT_DEBUG argument points to some ECOFF
574    debugging information which we want to link into the information
575    pointed to by the OUTPUT_DEBUG argument.  OUTPUT_SWAP and
576    INPUT_SWAP point to the swapping information needed.  INFO is the
577    linker information structure.  HANDLE is returned by
578    bfd_ecoff_debug_init.  */
579 
580 bfd_boolean
581 bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
582 			    input_bfd, input_debug, input_swap,
583 			    info)
584      PTR handle;
585      bfd *output_bfd;
586      struct ecoff_debug_info *output_debug;
587      const struct ecoff_debug_swap *output_swap;
588      bfd *input_bfd;
589      struct ecoff_debug_info *input_debug;
590      const struct ecoff_debug_swap *input_swap;
591      struct bfd_link_info *info;
592 {
593   struct accumulate *ainfo = (struct accumulate *) handle;
594   void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
595     = input_swap->swap_sym_in;
596   void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
597     = input_swap->swap_rfd_in;
598   void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
599     = output_swap->swap_sym_out;
600   void (* const swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR))
601     = output_swap->swap_fdr_out;
602   void (* const swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR))
603     = output_swap->swap_rfd_out;
604   bfd_size_type external_pdr_size = output_swap->external_pdr_size;
605   bfd_size_type external_sym_size = output_swap->external_sym_size;
606   bfd_size_type external_opt_size = output_swap->external_opt_size;
607   bfd_size_type external_fdr_size = output_swap->external_fdr_size;
608   bfd_size_type external_rfd_size = output_swap->external_rfd_size;
609   HDRR * const output_symhdr = &output_debug->symbolic_header;
610   HDRR * const input_symhdr = &input_debug->symbolic_header;
611   bfd_vma section_adjust[scMax];
612   asection *sec;
613   bfd_byte *fdr_start;
614   bfd_byte *fdr_ptr;
615   bfd_byte *fdr_end;
616   bfd_size_type fdr_add;
617   unsigned int copied;
618   RFDT i;
619   unsigned long sz;
620   bfd_byte *rfd_out;
621   bfd_byte *rfd_in;
622   bfd_byte *rfd_end;
623   long newrfdbase = 0;
624   long oldrfdbase = 0;
625   bfd_byte *fdr_out;
626   bfd_size_type amt;
627 
628   /* Use section_adjust to hold the value to add to a symbol in a
629      particular section.  */
630   memset ((PTR) section_adjust, 0, sizeof section_adjust);
631 
632 #define SET(name, indx) \
633   sec = bfd_get_section_by_name (input_bfd, name); \
634   if (sec != NULL) \
635     section_adjust[indx] = (sec->output_section->vma \
636 			    + sec->output_offset \
637 			    - sec->vma);
638 
639   SET (".text", scText);
640   SET (".data", scData);
641   SET (".bss", scBss);
642   SET (".sdata", scSData);
643   SET (".sbss", scSBss);
644   /* scRdata section may be either .rdata or .rodata.  */
645   SET (".rdata", scRData);
646   SET (".rodata", scRData);
647   SET (".init", scInit);
648   SET (".fini", scFini);
649   SET (".rconst", scRConst);
650 
651 #undef SET
652 
653   /* Find all the debugging information based on the FDR's.  We need
654      to handle them whether they are swapped or not.  */
655   if (input_debug->fdr != (FDR *) NULL)
656     {
657       fdr_start = (bfd_byte *) input_debug->fdr;
658       fdr_add = sizeof (FDR);
659     }
660   else
661     {
662       fdr_start = (bfd_byte *) input_debug->external_fdr;
663       fdr_add = input_swap->external_fdr_size;
664     }
665   fdr_end = fdr_start + input_symhdr->ifdMax * fdr_add;
666 
667   amt = input_symhdr->ifdMax;
668   amt *= sizeof (RFDT);
669   input_debug->ifdmap = (RFDT *) bfd_alloc (input_bfd, amt);
670 
671   sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
672   rfd_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
673   if (!input_debug->ifdmap || !rfd_out)
674     {
675       bfd_set_error (bfd_error_no_memory);
676       return FALSE;
677     }
678   if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz))
679     return FALSE;
680 
681   copied = 0;
682 
683   /* Look through the FDR's to see which ones we are going to include
684      in the final output.  We do not want duplicate FDR information
685      for header files, because ECOFF debugging is often very large.
686      When we find an FDR with no line information which can be merged,
687      we look it up in a hash table to ensure that we only include it
688      once.  We keep a table mapping FDR numbers to the final number
689      they get with the BFD, so that we can refer to it when we write
690      out the external symbols.  */
691   for (fdr_ptr = fdr_start, i = 0;
692        fdr_ptr < fdr_end;
693        fdr_ptr += fdr_add, i++, rfd_out += external_rfd_size)
694     {
695       FDR fdr;
696 
697       if (input_debug->fdr != (FDR *) NULL)
698 	fdr = *(FDR *) fdr_ptr;
699       else
700 	(*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
701 
702       /* See if this FDR can be merged with an existing one.  */
703       if (fdr.cbLine == 0 && fdr.rss != -1 && fdr.fMerge)
704 	{
705 	  const char *name;
706 	  char *lookup;
707 	  struct string_hash_entry *fh;
708 
709 	  /* We look up a string formed from the file name and the
710 	     number of symbols and aux entries.  Sometimes an include
711 	     file will conditionally define a typedef or something
712 	     based on the order of include files.  Using the number of
713 	     symbols and aux entries as a hash reduces the chance that
714 	     we will merge symbol information that should not be
715 	     merged.  */
716 	  name = input_debug->ss + fdr.issBase + fdr.rss;
717 
718 	  lookup = (char *) bfd_malloc ((bfd_size_type) strlen (name) + 20);
719 	  if (lookup == NULL)
720 	    return FALSE;
721 	  sprintf (lookup, "%s %lx %lx", name, (unsigned long) fdr.csym,
722 		   (unsigned long) fdr.caux);
723 
724 	  fh = string_hash_lookup (&ainfo->fdr_hash, lookup, TRUE, TRUE);
725 	  free (lookup);
726 	  if (fh == (struct string_hash_entry *) NULL)
727 	    return FALSE;
728 
729 	  if (fh->val != -1)
730 	    {
731 	      input_debug->ifdmap[i] = fh->val;
732 	      (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i,
733 			       (PTR) rfd_out);
734 
735 	      /* Don't copy this FDR.  */
736 	      continue;
737 	    }
738 
739 	  fh->val = output_symhdr->ifdMax + copied;
740 	}
741 
742       input_debug->ifdmap[i] = output_symhdr->ifdMax + copied;
743       (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, (PTR) rfd_out);
744       ++copied;
745     }
746 
747   newrfdbase = output_symhdr->crfd;
748   output_symhdr->crfd += input_symhdr->ifdMax;
749 
750   /* Copy over any existing RFD's.  RFD's are only created by the
751      linker, so this will only happen for input files which are the
752      result of a partial link.  */
753   rfd_in = (bfd_byte *) input_debug->external_rfd;
754   rfd_end = rfd_in + input_symhdr->crfd * input_swap->external_rfd_size;
755   for (;
756        rfd_in < rfd_end;
757        rfd_in += input_swap->external_rfd_size)
758     {
759       RFDT rfd;
760 
761       (*swap_rfd_in) (input_bfd, (PTR) rfd_in, &rfd);
762       BFD_ASSERT (rfd >= 0 && rfd < input_symhdr->ifdMax);
763       rfd = input_debug->ifdmap[rfd];
764       (*swap_rfd_out) (output_bfd, &rfd, (PTR) rfd_out);
765       rfd_out += external_rfd_size;
766     }
767 
768   oldrfdbase = output_symhdr->crfd;
769   output_symhdr->crfd += input_symhdr->crfd;
770 
771   /* Look through the FDR's and copy over all associated debugging
772      information.  */
773   sz = copied * external_fdr_size;
774   fdr_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
775   if (!fdr_out)
776     {
777       bfd_set_error (bfd_error_no_memory);
778       return FALSE;
779     }
780   if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz))
781     return FALSE;
782   for (fdr_ptr = fdr_start, i = 0;
783        fdr_ptr < fdr_end;
784        fdr_ptr += fdr_add, i++)
785     {
786       FDR fdr;
787       bfd_byte *sym_out;
788       bfd_byte *lraw_src;
789       bfd_byte *lraw_end;
790       bfd_boolean fgotfilename;
791 
792       if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
793 	{
794 	  /* We are not copying this FDR.  */
795 	  continue;
796 	}
797 
798       if (input_debug->fdr != (FDR *) NULL)
799 	fdr = *(FDR *) fdr_ptr;
800       else
801 	(*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
802 
803       /* FIXME: It is conceivable that this FDR points to the .init or
804 	 .fini section, in which case this will not do the right
805 	 thing.  */
806       fdr.adr += section_adjust[scText];
807 
808       /* Swap in the local symbols, adjust their values, and swap them
809 	 out again.  */
810       fgotfilename = FALSE;
811       sz = fdr.csym * external_sym_size;
812       sym_out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
813       if (!sym_out)
814 	{
815 	  bfd_set_error (bfd_error_no_memory);
816 	  return FALSE;
817 	}
818       if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out,
819 			       sz))
820 	return FALSE;
821       lraw_src = ((bfd_byte *) input_debug->external_sym
822 		  + fdr.isymBase * input_swap->external_sym_size);
823       lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
824       for (;  lraw_src < lraw_end;  lraw_src += input_swap->external_sym_size)
825 	{
826 	  SYMR internal_sym;
827 
828 	  (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym);
829 
830 	  BFD_ASSERT (internal_sym.sc != scCommon
831 		      && internal_sym.sc != scSCommon);
832 
833 	  /* Adjust the symbol value if appropriate.  */
834 	  switch (internal_sym.st)
835 	    {
836 	    case stNil:
837 	      if (ECOFF_IS_STAB (&internal_sym))
838 		break;
839 	      /* Fall through.  */
840 	    case stGlobal:
841 	    case stStatic:
842 	    case stLabel:
843 	    case stProc:
844 	    case stStaticProc:
845 	      internal_sym.value += section_adjust[internal_sym.sc];
846 	      break;
847 
848 	    default:
849 	      break;
850 	    }
851 
852 	  /* If we are doing a final link, we hash all the strings in
853 	     the local symbol table together.  This reduces the amount
854 	     of space required by debugging information.  We don't do
855 	     this when performing a relocatable link because it would
856 	     prevent us from easily merging different FDR's.  */
857 	  if (! info->relocatable)
858 	    {
859 	      bfd_boolean ffilename;
860 	      const char *name;
861 
862 	      if (! fgotfilename && internal_sym.iss == fdr.rss)
863 		ffilename = TRUE;
864 	      else
865 		ffilename = FALSE;
866 
867 	      /* Hash the name into the string table.  */
868 	      name = input_debug->ss + fdr.issBase + internal_sym.iss;
869 	      if (*name == '\0')
870 		internal_sym.iss = 0;
871 	      else
872 		{
873 		  struct string_hash_entry *sh;
874 
875 		  sh = string_hash_lookup (&ainfo->str_hash, name, TRUE, TRUE);
876 		  if (sh == (struct string_hash_entry *) NULL)
877 		    return FALSE;
878 		  if (sh->val == -1)
879 		    {
880 		      sh->val = output_symhdr->issMax;
881 		      output_symhdr->issMax += strlen (name) + 1;
882 		      if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
883 			ainfo->ss_hash = sh;
884 		      if (ainfo->ss_hash_end
885 			  != (struct string_hash_entry *) NULL)
886 			ainfo->ss_hash_end->next = sh;
887 		      ainfo->ss_hash_end = sh;
888 		    }
889 		  internal_sym.iss = sh->val;
890 		}
891 
892 	      if (ffilename)
893 		{
894 		  fdr.rss = internal_sym.iss;
895 		  fgotfilename = TRUE;
896 		}
897 	    }
898 
899 	  (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
900 	  sym_out += external_sym_size;
901 	}
902 
903       fdr.isymBase = output_symhdr->isymMax;
904       output_symhdr->isymMax += fdr.csym;
905 
906       /* Copy the information that does not need swapping.  */
907 
908       /* FIXME: If we are relaxing, we need to adjust the line
909 	 numbers.  Frankly, forget it.  Anybody using stabs debugging
910 	 information will not use this line number information, and
911 	 stabs are adjusted correctly.  */
912       if (fdr.cbLine > 0)
913 	{
914 	  file_ptr pos = input_symhdr->cbLineOffset + fdr.cbLineOffset;
915 	  if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
916 				 input_bfd, pos, (unsigned long) fdr.cbLine))
917 	    return FALSE;
918 	  fdr.ilineBase = output_symhdr->ilineMax;
919 	  fdr.cbLineOffset = output_symhdr->cbLine;
920 	  output_symhdr->ilineMax += fdr.cline;
921 	  output_symhdr->cbLine += fdr.cbLine;
922 	}
923       if (fdr.caux > 0)
924 	{
925 	  file_ptr pos = (input_symhdr->cbAuxOffset
926 			  + fdr.iauxBase * sizeof (union aux_ext));
927 	  if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
928 				 input_bfd, pos,
929 				 fdr.caux * sizeof (union aux_ext)))
930 	    return FALSE;
931 	  fdr.iauxBase = output_symhdr->iauxMax;
932 	  output_symhdr->iauxMax += fdr.caux;
933 	}
934       if (! info->relocatable)
935 	{
936 
937 	  /* When are are hashing strings, we lie about the number of
938 	     strings attached to each FDR.  We need to set cbSs
939 	     because some versions of dbx apparently use it to decide
940 	     how much of the string table to read in.  */
941 	  fdr.issBase = 0;
942 	  fdr.cbSs = output_symhdr->issMax;
943 	}
944       else if (fdr.cbSs > 0)
945 	{
946 	  file_ptr pos = input_symhdr->cbSsOffset + fdr.issBase;
947 	  if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
948 				 input_bfd, pos, (unsigned long) fdr.cbSs))
949 	    return FALSE;
950 	  fdr.issBase = output_symhdr->issMax;
951 	  output_symhdr->issMax += fdr.cbSs;
952 	}
953 
954       if (output_bfd->xvec->header_byteorder
955 	  == input_bfd->xvec->header_byteorder)
956 	{
957 	  /* The two BFD's have the same endianness, and we don't have
958 	     to adjust the PDR addresses, so simply copying the
959 	     information will suffice.  */
960 	  BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
961 	  if (fdr.cpd > 0)
962 	    {
963 	      file_ptr pos = (input_symhdr->cbPdOffset
964 			      + fdr.ipdFirst * external_pdr_size);
965 	      unsigned long size = fdr.cpd * external_pdr_size;
966 	      if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
967 				     input_bfd, pos, size))
968 		return FALSE;
969 	    }
970 	  BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
971 	  if (fdr.copt > 0)
972 	    {
973 	      file_ptr pos = (input_symhdr->cbOptOffset
974 			      + fdr.ioptBase * external_opt_size);
975 	      unsigned long size = fdr.copt * external_opt_size;
976 	      if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
977 				     input_bfd, pos, size))
978 		return FALSE;
979 	    }
980 	}
981       else
982 	{
983 	  bfd_size_type outsz, insz;
984 	  bfd_byte *in;
985 	  bfd_byte *end;
986 	  bfd_byte *out;
987 
988 	  /* The two BFD's have different endianness, so we must swap
989 	     everything in and out.  This code would always work, but
990 	     it would be unnecessarily slow in the normal case.  */
991 	  outsz = external_pdr_size;
992 	  insz = input_swap->external_pdr_size;
993 	  in = ((bfd_byte *) input_debug->external_pdr
994 		+ fdr.ipdFirst * insz);
995 	  end = in + fdr.cpd * insz;
996 	  sz = fdr.cpd * outsz;
997 	  out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
998 	  if (!out)
999 	    {
1000 	      bfd_set_error (bfd_error_no_memory);
1001 	      return FALSE;
1002 	    }
1003 	  if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out,
1004 				   sz))
1005 	    return FALSE;
1006 	  for (; in < end; in += insz, out += outsz)
1007 	    {
1008 	      PDR pdr;
1009 
1010 	      (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr);
1011 	      (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out);
1012 	    }
1013 
1014 	  /* Swap over the optimization information.  */
1015 	  outsz = external_opt_size;
1016 	  insz = input_swap->external_opt_size;
1017 	  in = ((bfd_byte *) input_debug->external_opt
1018 		+ fdr.ioptBase * insz);
1019 	  end = in + fdr.copt * insz;
1020 	  sz = fdr.copt * outsz;
1021 	  out = (bfd_byte *) objalloc_alloc (ainfo->memory, sz);
1022 	  if (!out)
1023 	    {
1024 	      bfd_set_error (bfd_error_no_memory);
1025 	      return FALSE;
1026 	    }
1027 	  if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out,
1028 				   sz))
1029 	    return FALSE;
1030 	  for (; in < end; in += insz, out += outsz)
1031 	    {
1032 	      OPTR opt;
1033 
1034 	      (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt);
1035 	      (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out);
1036 	    }
1037 	}
1038 
1039       fdr.ipdFirst = output_symhdr->ipdMax;
1040       output_symhdr->ipdMax += fdr.cpd;
1041       fdr.ioptBase = output_symhdr->ioptMax;
1042       output_symhdr->ioptMax += fdr.copt;
1043 
1044       if (fdr.crfd <= 0)
1045 	{
1046 	  /* Point this FDR at the table of RFD's we created.  */
1047 	  fdr.rfdBase = newrfdbase;
1048 	  fdr.crfd = input_symhdr->ifdMax;
1049 	}
1050       else
1051 	{
1052 	  /* Point this FDR at the remapped RFD's.  */
1053 	  fdr.rfdBase += oldrfdbase;
1054 	}
1055 
1056       (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
1057       fdr_out += external_fdr_size;
1058       ++output_symhdr->ifdMax;
1059     }
1060 
1061   return TRUE;
1062 }
1063 
1064 /* Add a string to the debugging information we are accumulating.
1065    Return the offset from the fdr string base.  */
1066 
1067 static long ecoff_add_string
1068   PARAMS ((struct accumulate *, struct bfd_link_info *,
1069 	   struct ecoff_debug_info *, FDR *fdr, const char *string));
1070 
1071 static long
1072 ecoff_add_string (ainfo, info, debug, fdr, string)
1073      struct accumulate *ainfo;
1074      struct bfd_link_info *info;
1075      struct ecoff_debug_info *debug;
1076      FDR *fdr;
1077      const char *string;
1078 {
1079   HDRR *symhdr;
1080   size_t len;
1081   bfd_size_type ret;
1082 
1083   symhdr = &debug->symbolic_header;
1084   len = strlen (string);
1085   if (info->relocatable)
1086     {
1087       if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string,
1088 			       len + 1))
1089 	return -1;
1090       ret = symhdr->issMax;
1091       symhdr->issMax += len + 1;
1092       fdr->cbSs += len + 1;
1093     }
1094   else
1095     {
1096       struct string_hash_entry *sh;
1097 
1098       sh = string_hash_lookup (&ainfo->str_hash, string, TRUE, TRUE);
1099       if (sh == (struct string_hash_entry *) NULL)
1100 	return -1;
1101       if (sh->val == -1)
1102 	{
1103 	  sh->val = symhdr->issMax;
1104 	  symhdr->issMax += len + 1;
1105 	  if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
1106 	    ainfo->ss_hash = sh;
1107 	  if (ainfo->ss_hash_end
1108 	      != (struct string_hash_entry *) NULL)
1109 	    ainfo->ss_hash_end->next = sh;
1110 	  ainfo->ss_hash_end = sh;
1111 	}
1112       ret = sh->val;
1113     }
1114 
1115   return ret;
1116 }
1117 
1118 /* Add debugging information from a non-ECOFF file.  */
1119 
1120 bfd_boolean
1121 bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
1122 				  output_swap, input_bfd, info)
1123      PTR handle;
1124      bfd *output_bfd;
1125      struct ecoff_debug_info *output_debug;
1126      const struct ecoff_debug_swap *output_swap;
1127      bfd *input_bfd;
1128      struct bfd_link_info *info;
1129 {
1130   struct accumulate *ainfo = (struct accumulate *) handle;
1131   void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
1132     = output_swap->swap_sym_out;
1133   HDRR *output_symhdr = &output_debug->symbolic_header;
1134   FDR fdr;
1135   asection *sec;
1136   asymbol **symbols;
1137   asymbol **sym_ptr;
1138   asymbol **sym_end;
1139   long symsize;
1140   long symcount;
1141   PTR external_fdr;
1142 
1143   memset ((PTR) &fdr, 0, sizeof fdr);
1144 
1145   sec = bfd_get_section_by_name (input_bfd, ".text");
1146   if (sec != NULL)
1147     fdr.adr = sec->output_section->vma + sec->output_offset;
1148   else
1149     {
1150       /* FIXME: What about .init or .fini?  */
1151       fdr.adr = 0;
1152     }
1153 
1154   fdr.issBase = output_symhdr->issMax;
1155   fdr.cbSs = 0;
1156   fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1157 			      input_bfd->filename);
1158   if (fdr.rss == -1)
1159     return FALSE;
1160   fdr.isymBase = output_symhdr->isymMax;
1161 
1162   /* Get the local symbols from the input BFD.  */
1163   symsize = bfd_get_symtab_upper_bound (input_bfd);
1164   if (symsize < 0)
1165     return FALSE;
1166   symbols = (asymbol **) bfd_alloc (output_bfd, (bfd_size_type) symsize);
1167   if (symbols == (asymbol **) NULL)
1168     return FALSE;
1169   symcount = bfd_canonicalize_symtab (input_bfd, symbols);
1170   if (symcount < 0)
1171     return FALSE;
1172   sym_end = symbols + symcount;
1173 
1174   /* Handle the local symbols.  Any external symbols are handled
1175      separately.  */
1176   fdr.csym = 0;
1177   for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1178     {
1179       SYMR internal_sym;
1180       PTR external_sym;
1181 
1182       if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1183 	continue;
1184       memset ((PTR) &internal_sym, 0, sizeof internal_sym);
1185       internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1186 					   (*sym_ptr)->name);
1187 
1188       if (internal_sym.iss == -1)
1189 	return FALSE;
1190       if (bfd_is_com_section ((*sym_ptr)->section)
1191 	  || bfd_is_und_section ((*sym_ptr)->section))
1192 	internal_sym.value = (*sym_ptr)->value;
1193       else
1194 	internal_sym.value = ((*sym_ptr)->value
1195 			      + (*sym_ptr)->section->output_offset
1196 			      + (*sym_ptr)->section->output_section->vma);
1197       internal_sym.st = stNil;
1198       internal_sym.sc = scUndefined;
1199       internal_sym.index = indexNil;
1200 
1201       external_sym = (PTR) objalloc_alloc (ainfo->memory,
1202 					   output_swap->external_sym_size);
1203       if (!external_sym)
1204 	{
1205 	  bfd_set_error (bfd_error_no_memory);
1206 	  return FALSE;
1207 	}
1208       (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1209       add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1210 			  external_sym,
1211 			  (unsigned long) output_swap->external_sym_size);
1212       ++fdr.csym;
1213       ++output_symhdr->isymMax;
1214     }
1215 
1216   bfd_release (output_bfd, (PTR) symbols);
1217 
1218   /* Leave everything else in the FDR zeroed out.  This will cause
1219      the lang field to be langC.  The fBigendian field will
1220      indicate little endian format, but it doesn't matter because
1221      it only applies to aux fields and there are none.  */
1222   external_fdr = (PTR) objalloc_alloc (ainfo->memory,
1223 				       output_swap->external_fdr_size);
1224   if (!external_fdr)
1225     {
1226       bfd_set_error (bfd_error_no_memory);
1227       return FALSE;
1228     }
1229   (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1230   add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1231 		      external_fdr,
1232 		      (unsigned long) output_swap->external_fdr_size);
1233 
1234   ++output_symhdr->ifdMax;
1235 
1236   return TRUE;
1237 }
1238 
1239 /* Set up ECOFF debugging information for the external symbols.
1240    FIXME: This is done using a memory buffer, but it should be
1241    probably be changed to use a shuffle structure.  The assembler uses
1242    this interface, so that must be changed to do something else.  */
1243 
1244 bfd_boolean
1245 bfd_ecoff_debug_externals (abfd, debug, swap, relocatable, get_extr,
1246 			   set_index)
1247      bfd *abfd;
1248      struct ecoff_debug_info *debug;
1249      const struct ecoff_debug_swap *swap;
1250      bfd_boolean relocatable;
1251      bfd_boolean (*get_extr) PARAMS ((asymbol *, EXTR *));
1252      void (*set_index) PARAMS ((asymbol *, bfd_size_type));
1253 {
1254   HDRR * const symhdr = &debug->symbolic_header;
1255   asymbol **sym_ptr_ptr;
1256   size_t c;
1257 
1258   sym_ptr_ptr = bfd_get_outsymbols (abfd);
1259   if (sym_ptr_ptr == NULL)
1260     return TRUE;
1261 
1262   for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1263     {
1264       asymbol *sym_ptr;
1265       EXTR esym;
1266 
1267       sym_ptr = *sym_ptr_ptr;
1268 
1269       /* Get the external symbol information.  */
1270       if (! (*get_extr) (sym_ptr, &esym))
1271 	continue;
1272 
1273       /* If we're producing an executable, move common symbols into
1274 	 bss.  */
1275       if (! relocatable)
1276 	{
1277 	  if (esym.asym.sc == scCommon)
1278 	    esym.asym.sc = scBss;
1279 	  else if (esym.asym.sc == scSCommon)
1280 	    esym.asym.sc = scSBss;
1281 	}
1282 
1283       if (bfd_is_com_section (sym_ptr->section)
1284 	  || bfd_is_und_section (sym_ptr->section)
1285 	  || sym_ptr->section->output_section == (asection *) NULL)
1286 	{
1287 	  /* FIXME: gas does not keep the value of a small undefined
1288 	     symbol in the symbol itself, because of relocation
1289 	     problems.  */
1290 	  if (esym.asym.sc != scSUndefined
1291 	      || esym.asym.value == 0
1292 	      || sym_ptr->value != 0)
1293 	    esym.asym.value = sym_ptr->value;
1294 	}
1295       else
1296 	esym.asym.value = (sym_ptr->value
1297 			   + sym_ptr->section->output_offset
1298 			   + sym_ptr->section->output_section->vma);
1299 
1300       if (set_index)
1301 	(*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1302 
1303       if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1304 					  sym_ptr->name, &esym))
1305 	return FALSE;
1306     }
1307 
1308   return TRUE;
1309 }
1310 
1311 /* Add a single external symbol to the debugging information.  */
1312 
1313 bfd_boolean
1314 bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym)
1315      bfd *abfd;
1316      struct ecoff_debug_info *debug;
1317      const struct ecoff_debug_swap *swap;
1318      const char *name;
1319      EXTR *esym;
1320 {
1321   const bfd_size_type external_ext_size = swap->external_ext_size;
1322   void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
1323     = swap->swap_ext_out;
1324   HDRR * const symhdr = &debug->symbolic_header;
1325   size_t namelen;
1326 
1327   namelen = strlen (name);
1328 
1329   if ((size_t) (debug->ssext_end - debug->ssext)
1330       < symhdr->issExtMax + namelen + 1)
1331     {
1332       if (! ecoff_add_bytes ((char **) &debug->ssext,
1333 			     (char **) &debug->ssext_end,
1334 			     symhdr->issExtMax + namelen + 1))
1335 	return FALSE;
1336     }
1337   if ((size_t) ((char *) debug->external_ext_end
1338 		- (char *) debug->external_ext)
1339       < (symhdr->iextMax + 1) * external_ext_size)
1340     {
1341       char *external_ext = debug->external_ext;
1342       char *external_ext_end = debug->external_ext_end;
1343       if (! ecoff_add_bytes ((char **) &external_ext,
1344 			     (char **) &external_ext_end,
1345 			     (symhdr->iextMax + 1) * (size_t) external_ext_size))
1346 	return FALSE;
1347       debug->external_ext = external_ext;
1348       debug->external_ext_end = external_ext_end;
1349     }
1350 
1351   esym->asym.iss = symhdr->issExtMax;
1352 
1353   (*swap_ext_out) (abfd, esym,
1354 		   ((char *) debug->external_ext
1355 		    + symhdr->iextMax * swap->external_ext_size));
1356 
1357   ++symhdr->iextMax;
1358 
1359   strcpy (debug->ssext + symhdr->issExtMax, name);
1360   symhdr->issExtMax += namelen + 1;
1361 
1362   return TRUE;
1363 }
1364 
1365 /* Align the ECOFF debugging information.  */
1366 
1367 static void
1368 ecoff_align_debug (abfd, debug, swap)
1369      bfd *abfd ATTRIBUTE_UNUSED;
1370      struct ecoff_debug_info *debug;
1371      const struct ecoff_debug_swap *swap;
1372 {
1373   HDRR * const symhdr = &debug->symbolic_header;
1374   bfd_size_type debug_align, aux_align, rfd_align;
1375   size_t add;
1376 
1377   /* Adjust the counts so that structures are aligned.  */
1378   debug_align = swap->debug_align;
1379   aux_align = debug_align / sizeof (union aux_ext);
1380   rfd_align = debug_align / swap->external_rfd_size;
1381 
1382   add = debug_align - (symhdr->cbLine & (debug_align - 1));
1383   if (add != debug_align)
1384     {
1385       if (debug->line != (unsigned char *) NULL)
1386 	memset ((PTR) (debug->line + symhdr->cbLine), 0, add);
1387       symhdr->cbLine += add;
1388     }
1389 
1390   add = debug_align - (symhdr->issMax & (debug_align - 1));
1391   if (add != debug_align)
1392     {
1393       if (debug->ss != (char *) NULL)
1394 	memset ((PTR) (debug->ss + symhdr->issMax), 0, add);
1395       symhdr->issMax += add;
1396     }
1397 
1398   add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1399   if (add != debug_align)
1400     {
1401       if (debug->ssext != (char *) NULL)
1402 	memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add);
1403       symhdr->issExtMax += add;
1404     }
1405 
1406   add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1407   if (add != aux_align)
1408     {
1409       if (debug->external_aux != (union aux_ext *) NULL)
1410 	memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0,
1411 		add * sizeof (union aux_ext));
1412       symhdr->iauxMax += add;
1413     }
1414 
1415   add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1416   if (add != rfd_align)
1417     {
1418       if (debug->external_rfd != (PTR) NULL)
1419 	memset ((PTR) ((char *) debug->external_rfd
1420 		       + symhdr->crfd * swap->external_rfd_size),
1421 		0, (size_t) (add * swap->external_rfd_size));
1422       symhdr->crfd += add;
1423     }
1424 }
1425 
1426 /* Return the size required by the ECOFF debugging information.  */
1427 
1428 bfd_size_type
1429 bfd_ecoff_debug_size (abfd, debug, swap)
1430      bfd *abfd;
1431      struct ecoff_debug_info *debug;
1432      const struct ecoff_debug_swap *swap;
1433 {
1434   bfd_size_type tot;
1435 
1436   ecoff_align_debug (abfd, debug, swap);
1437   tot = swap->external_hdr_size;
1438 
1439 #define ADD(count, size) \
1440   tot += debug->symbolic_header.count * size
1441 
1442   ADD (cbLine, sizeof (unsigned char));
1443   ADD (idnMax, swap->external_dnr_size);
1444   ADD (ipdMax, swap->external_pdr_size);
1445   ADD (isymMax, swap->external_sym_size);
1446   ADD (ioptMax, swap->external_opt_size);
1447   ADD (iauxMax, sizeof (union aux_ext));
1448   ADD (issMax, sizeof (char));
1449   ADD (issExtMax, sizeof (char));
1450   ADD (ifdMax, swap->external_fdr_size);
1451   ADD (crfd, swap->external_rfd_size);
1452   ADD (iextMax, swap->external_ext_size);
1453 
1454 #undef ADD
1455 
1456   return tot;
1457 }
1458 
1459 /* Write out the ECOFF symbolic header, given the file position it is
1460    going to be placed at.  This assumes that the counts are set
1461    correctly.  */
1462 
1463 static bfd_boolean
1464 ecoff_write_symhdr (abfd, debug, swap, where)
1465      bfd *abfd;
1466      struct ecoff_debug_info *debug;
1467      const struct ecoff_debug_swap *swap;
1468      file_ptr where;
1469 {
1470   HDRR * const symhdr = &debug->symbolic_header;
1471   char *buff = NULL;
1472 
1473   ecoff_align_debug (abfd, debug, swap);
1474 
1475   /* Go to the right location in the file.  */
1476   if (bfd_seek (abfd, where, SEEK_SET) != 0)
1477     return FALSE;
1478 
1479   where += swap->external_hdr_size;
1480 
1481   symhdr->magic = swap->sym_magic;
1482 
1483   /* Fill in the file offsets.  */
1484 #define SET(offset, count, size) \
1485   if (symhdr->count == 0) \
1486     symhdr->offset = 0; \
1487   else \
1488     { \
1489       symhdr->offset = where; \
1490       where += symhdr->count * size; \
1491     }
1492 
1493   SET (cbLineOffset, cbLine, sizeof (unsigned char));
1494   SET (cbDnOffset, idnMax, swap->external_dnr_size);
1495   SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1496   SET (cbSymOffset, isymMax, swap->external_sym_size);
1497   SET (cbOptOffset, ioptMax, swap->external_opt_size);
1498   SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1499   SET (cbSsOffset, issMax, sizeof (char));
1500   SET (cbSsExtOffset, issExtMax, sizeof (char));
1501   SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1502   SET (cbRfdOffset, crfd, swap->external_rfd_size);
1503   SET (cbExtOffset, iextMax, swap->external_ext_size);
1504 #undef SET
1505 
1506   buff = (PTR) bfd_malloc (swap->external_hdr_size);
1507   if (buff == NULL && swap->external_hdr_size != 0)
1508     goto error_return;
1509 
1510   (*swap->swap_hdr_out) (abfd, symhdr, buff);
1511   if (bfd_bwrite (buff, swap->external_hdr_size, abfd)
1512       != swap->external_hdr_size)
1513     goto error_return;
1514 
1515   if (buff != NULL)
1516     free (buff);
1517   return TRUE;
1518  error_return:
1519   if (buff != NULL)
1520     free (buff);
1521   return FALSE;
1522 }
1523 
1524 /* Write out the ECOFF debugging information.  This function assumes
1525    that the information (the pointers and counts) in *DEBUG have been
1526    set correctly.  WHERE is the position in the file to write the
1527    information to.  This function fills in the file offsets in the
1528    symbolic header.  */
1529 
1530 bfd_boolean
1531 bfd_ecoff_write_debug (abfd, debug, swap, where)
1532      bfd *abfd;
1533      struct ecoff_debug_info *debug;
1534      const struct ecoff_debug_swap *swap;
1535      file_ptr where;
1536 {
1537   HDRR * const symhdr = &debug->symbolic_header;
1538 
1539   if (! ecoff_write_symhdr (abfd, debug, swap, where))
1540     return FALSE;
1541 
1542 #define WRITE(ptr, count, size, offset) \
1543   BFD_ASSERT (symhdr->offset == 0 \
1544 	      || (bfd_vma) bfd_tell (abfd) == symhdr->offset); \
1545   if (bfd_bwrite ((PTR) debug->ptr, (bfd_size_type) size * symhdr->count, abfd)\
1546       != size * symhdr->count) \
1547     return FALSE;
1548 
1549   WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1550   WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1551   WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1552   WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1553   WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1554   WRITE (external_aux, iauxMax, (bfd_size_type) sizeof (union aux_ext),
1555 	 cbAuxOffset);
1556   WRITE (ss, issMax, sizeof (char), cbSsOffset);
1557   WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1558   WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1559   WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1560   WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1561 #undef WRITE
1562 
1563   return TRUE;
1564 }
1565 
1566 /* Write out a shuffle list.  */
1567 
1568 static bfd_boolean ecoff_write_shuffle
1569   PARAMS ((bfd *, const struct ecoff_debug_swap *, struct shuffle *,
1570 	   PTR space));
1571 
1572 static bfd_boolean
1573 ecoff_write_shuffle (abfd, swap, shuffle, space)
1574      bfd *abfd;
1575      const struct ecoff_debug_swap *swap;
1576      struct shuffle *shuffle;
1577      PTR space;
1578 {
1579   register struct shuffle *l;
1580   unsigned long total;
1581 
1582   total = 0;
1583   for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1584     {
1585       if (! l->filep)
1586 	{
1587 	  if (bfd_bwrite (l->u.memory, (bfd_size_type) l->size, abfd)
1588 	      != l->size)
1589 	    return FALSE;
1590 	}
1591       else
1592 	{
1593 	  if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1594 	      || bfd_bread (space, (bfd_size_type) l->size,
1595 			   l->u.file.input_bfd) != l->size
1596 	      || bfd_bwrite (space, (bfd_size_type) l->size, abfd) != l->size)
1597 	    return FALSE;
1598 	}
1599       total += l->size;
1600     }
1601 
1602   if ((total & (swap->debug_align - 1)) != 0)
1603     {
1604       unsigned int i;
1605       bfd_byte *s;
1606 
1607       i = swap->debug_align - (total & (swap->debug_align - 1));
1608       s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1609       if (s == NULL && i != 0)
1610 	return FALSE;
1611 
1612       if (bfd_bwrite ((PTR) s, (bfd_size_type) i, abfd) != i)
1613 	{
1614 	  free (s);
1615 	  return FALSE;
1616 	}
1617       free (s);
1618     }
1619 
1620   return TRUE;
1621 }
1622 
1623 /* Write out debugging information using accumulated linker
1624    information.  */
1625 
1626 bfd_boolean
1627 bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where)
1628      PTR handle;
1629      bfd *abfd;
1630      struct ecoff_debug_info *debug;
1631      const struct ecoff_debug_swap *swap;
1632      struct bfd_link_info *info;
1633      file_ptr where;
1634 {
1635   struct accumulate *ainfo = (struct accumulate *) handle;
1636   PTR space = NULL;
1637   bfd_size_type amt;
1638 
1639   if (! ecoff_write_symhdr (abfd, debug, swap, where))
1640     goto error_return;
1641 
1642   amt = ainfo->largest_file_shuffle;
1643   space = (PTR) bfd_malloc (amt);
1644   if (space == NULL && ainfo->largest_file_shuffle != 0)
1645     goto error_return;
1646 
1647   if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1648       || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1649       || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1650       || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1651       || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
1652     goto error_return;
1653 
1654   /* The string table is written out from the hash table if this is a
1655      final link.  */
1656   if (info->relocatable)
1657     {
1658       BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1659       if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
1660 	goto error_return;
1661     }
1662   else
1663     {
1664       unsigned long total;
1665       bfd_byte null;
1666       struct string_hash_entry *sh;
1667 
1668       BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1669       null = 0;
1670       if (bfd_bwrite ((PTR) &null, (bfd_size_type) 1, abfd) != 1)
1671 	goto error_return;
1672       total = 1;
1673       BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1674       for (sh = ainfo->ss_hash;
1675 	   sh != (struct string_hash_entry *) NULL;
1676 	   sh = sh->next)
1677 	{
1678 	  size_t len;
1679 
1680 	  len = strlen (sh->root.string);
1681 	  amt = len + 1;
1682 	  if (bfd_bwrite ((PTR) sh->root.string, amt, abfd) != amt)
1683 	    goto error_return;
1684 	  total += len + 1;
1685 	}
1686 
1687       if ((total & (swap->debug_align - 1)) != 0)
1688 	{
1689 	  unsigned int i;
1690 	  bfd_byte *s;
1691 
1692 	  i = swap->debug_align - (total & (swap->debug_align - 1));
1693 	  s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1694 	  if (s == NULL && i != 0)
1695 	    goto error_return;
1696 
1697 	  if (bfd_bwrite ((PTR) s, (bfd_size_type) i, abfd) != i)
1698 	    {
1699 	      free (s);
1700 	      goto error_return;
1701 	    }
1702 	  free (s);
1703 	}
1704     }
1705 
1706   /* The external strings and symbol are not converted over to using
1707      shuffles.  FIXME: They probably should be.  */
1708   amt = debug->symbolic_header.issExtMax;
1709   if (bfd_bwrite (debug->ssext, amt, abfd) != amt)
1710     goto error_return;
1711   if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1712     {
1713       unsigned int i;
1714       bfd_byte *s;
1715 
1716       i = (swap->debug_align
1717 	   - (debug->symbolic_header.issExtMax & (swap->debug_align - 1)));
1718       s = (bfd_byte *) bfd_zmalloc ((bfd_size_type) i);
1719       if (s == NULL && i != 0)
1720 	goto error_return;
1721 
1722       if (bfd_bwrite ((PTR) s, (bfd_size_type) i, abfd) != i)
1723 	{
1724 	  free (s);
1725 	  goto error_return;
1726 	}
1727       free (s);
1728     }
1729 
1730   if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1731       || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
1732     goto error_return;
1733 
1734   BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1735 	      || (debug->symbolic_header.cbExtOffset
1736 		  == (bfd_vma) bfd_tell (abfd)));
1737 
1738   amt = debug->symbolic_header.iextMax * swap->external_ext_size;
1739   if (bfd_bwrite (debug->external_ext, amt, abfd) != amt)
1740     goto error_return;
1741 
1742   if (space != NULL)
1743     free (space);
1744   return TRUE;
1745 
1746  error_return:
1747   if (space != NULL)
1748     free (space);
1749   return FALSE;
1750 }
1751 
1752 /* Handle the find_nearest_line function for both ECOFF and MIPS ELF
1753    files.  */
1754 
1755 /* Compare FDR entries.  This is called via qsort.  */
1756 
1757 static int
1758 cmp_fdrtab_entry (leftp, rightp)
1759      const PTR leftp;
1760      const PTR rightp;
1761 {
1762   const struct ecoff_fdrtab_entry *lp =
1763     (const struct ecoff_fdrtab_entry *) leftp;
1764   const struct ecoff_fdrtab_entry *rp =
1765     (const struct ecoff_fdrtab_entry *) rightp;
1766 
1767   if (lp->base_addr < rp->base_addr)
1768     return -1;
1769   if (lp->base_addr > rp->base_addr)
1770     return 1;
1771   return 0;
1772 }
1773 
1774 /* Each file descriptor (FDR) has a memory address, to simplify
1775    looking up an FDR by address, we build a table covering all FDRs
1776    that have a least one procedure descriptor in them.  The final
1777    table will be sorted by address so we can look it up via binary
1778    search.  */
1779 
1780 static bfd_boolean
1781 mk_fdrtab (abfd, debug_info, debug_swap, line_info)
1782      bfd *abfd;
1783      struct ecoff_debug_info * const debug_info;
1784      const struct ecoff_debug_swap * const debug_swap;
1785      struct ecoff_find_line *line_info;
1786 {
1787   struct ecoff_fdrtab_entry *tab;
1788   FDR *fdr_ptr;
1789   FDR *fdr_start;
1790   FDR *fdr_end;
1791   bfd_boolean stabs;
1792   long len;
1793   bfd_size_type amt;
1794 
1795   fdr_start = debug_info->fdr;
1796   fdr_end = fdr_start + debug_info->symbolic_header.ifdMax;
1797 
1798   /* First, let's see how long the table needs to be.  */
1799   for (len = 0, fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
1800     {
1801       if (fdr_ptr->cpd == 0)	/* Skip FDRs that have no PDRs.  */
1802 	continue;
1803       ++len;
1804     }
1805 
1806   /* Now, create and fill in the table.  */
1807   amt = (bfd_size_type) len * sizeof (struct ecoff_fdrtab_entry);
1808   line_info->fdrtab = (struct ecoff_fdrtab_entry*) bfd_zalloc (abfd, amt);
1809   if (line_info->fdrtab == NULL)
1810     return FALSE;
1811   line_info->fdrtab_len = len;
1812 
1813   tab = line_info->fdrtab;
1814   for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
1815     {
1816       if (fdr_ptr->cpd == 0)
1817 	continue;
1818 
1819       /* Check whether this file has stabs debugging information.  In
1820 	 a file with stabs debugging information, the second local
1821 	 symbol is named @stabs.  */
1822       stabs = FALSE;
1823       if (fdr_ptr->csym >= 2)
1824 	{
1825 	  char *sym_ptr;
1826 	  SYMR sym;
1827 
1828 	  sym_ptr = ((char *) debug_info->external_sym
1829 		     + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
1830 	  (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
1831 	  if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
1832 		      STABS_SYMBOL) == 0)
1833 	    stabs = TRUE;
1834 	}
1835 
1836       if (!stabs)
1837 	{
1838 	  /* eraxxon: There are at least two problems with this computation:
1839 	     1) PDRs do *not* contain offsets but full vma's; and typically the
1840 	     address of the first PDR is the address of the FDR, which will
1841 	     make (most) of the results of the original computation 0!
1842 	     2) Once in a wacky while, the Compaq compiler generated PDR
1843 	     addresses do not equal the FDR vma, but they (the PDR address)
1844 	     are still vma's and not offsets.  Cf. comments in
1845 	     'lookup_line'.  */
1846 	  /* The address of the first PDR is the offset of that
1847 	     procedure relative to the beginning of file FDR.  */
1848 	  tab->base_addr = fdr_ptr->adr;
1849 	}
1850       else
1851 	{
1852 	  /* XXX I don't know about stabs, so this is a guess
1853 	     (davidm@cs.arizona.edu).  */
1854 	  tab->base_addr = fdr_ptr->adr;
1855 	}
1856       tab->fdr = fdr_ptr;
1857       ++tab;
1858     }
1859 
1860   /* Finally, the table is sorted in increasing memory-address order.
1861      The table is mostly sorted already, but there are cases (e.g.,
1862      static functions in include files), where this does not hold.
1863      Use "odump -PFv" to verify...  */
1864   qsort ((PTR) line_info->fdrtab, (size_t) len,
1865 	 sizeof (struct ecoff_fdrtab_entry), cmp_fdrtab_entry);
1866 
1867   return TRUE;
1868 }
1869 
1870 /* Return index of first FDR that covers to OFFSET.  */
1871 
1872 static long
1873 fdrtab_lookup (line_info, offset)
1874      struct ecoff_find_line *line_info;
1875      bfd_vma offset;
1876 {
1877   long low, high, len;
1878   long mid = -1;
1879   struct ecoff_fdrtab_entry *tab;
1880 
1881   len = line_info->fdrtab_len;
1882   if (len == 0)
1883     return -1;
1884 
1885   tab = line_info->fdrtab;
1886   for (low = 0, high = len - 1 ; low != high ;)
1887     {
1888       mid = (high + low) / 2;
1889       if (offset >= tab[mid].base_addr && offset < tab[mid + 1].base_addr)
1890 	goto find_min;
1891 
1892       if (tab[mid].base_addr > offset)
1893 	high = mid;
1894       else
1895 	low = mid + 1;
1896     }
1897 
1898   /* eraxxon: at this point 'offset' is either lower than the lowest entry or
1899      higher than the highest entry. In the former case high = low = mid = 0;
1900      we want to return -1.  In the latter case, low = high and mid = low - 1;
1901      we want to return the index of the highest entry.  Only in former case
1902      will the following 'catch-all' test be true.  */
1903   ++mid;
1904 
1905   /* Last entry is catch-all for all higher addresses.  */
1906   if (offset < tab[mid].base_addr)
1907     return -1;
1908 
1909  find_min:
1910 
1911   /* eraxxon: There may be multiple FDRs in the table with the
1912      same base_addr; make sure that we are at the first one.  */
1913   while (mid > 0 && tab[mid - 1].base_addr == tab[mid].base_addr)
1914     --mid;
1915 
1916   return mid;
1917 }
1918 
1919 /* Look up a line given an address, storing the information in
1920    LINE_INFO->cache.  */
1921 
1922 static bfd_boolean
1923 lookup_line (abfd, debug_info, debug_swap, line_info)
1924      bfd *abfd;
1925      struct ecoff_debug_info * const debug_info;
1926      const struct ecoff_debug_swap * const debug_swap;
1927      struct ecoff_find_line *line_info;
1928 {
1929   struct ecoff_fdrtab_entry *tab;
1930   bfd_vma offset;
1931   bfd_boolean stabs;
1932   FDR *fdr_ptr;
1933   int i;
1934 
1935   /* eraxxon: note that 'offset' is the full vma, not a section offset.  */
1936   offset = line_info->cache.start;
1937 
1938   /* Build FDR table (sorted by object file's base-address) if we
1939      don't have it already.  */
1940   if (line_info->fdrtab == NULL
1941       && !mk_fdrtab (abfd, debug_info, debug_swap, line_info))
1942     return FALSE;
1943 
1944   tab = line_info->fdrtab;
1945 
1946   /* Find first FDR for address OFFSET.  */
1947   i = fdrtab_lookup (line_info, offset);
1948   if (i < 0)
1949     return FALSE;		/* no FDR, no fun...  */
1950 
1951   /* eraxxon: 'fdrtab_lookup' doesn't give what we want, at least for Compaq's
1952      C++ compiler 6.2.  Consider three FDRs with starting addresses of x, y,
1953      and z, respectively, such that x < y < z.  Assume further that
1954      y < 'offset' < z.  It is possible at times that the PDR for 'offset' is
1955      associated with FDR x and *not* with FDR y.  Erg!!
1956 
1957      From a binary dump of my C++ test case 'moo' using Compaq's coffobjanl
1958      (output format has been edited for our purposes):
1959 
1960      FDR [2]: (main.C): First instruction: 0x12000207c <x>
1961        PDR [5] for File [2]: LoopTest__Xv                 <0x1200020a0> (a)
1962        PDR [7] for File [2]: foo__Xv                      <0x120002168>
1963      FDR [1]: (-1):     First instruction: 0x1200020e8 <y>
1964        PDR [3] for File [1]:                              <0x120001ad0> (b)
1965      FDR [6]: (-1):     First instruction: 0x1200026f0 <z>
1966 
1967      (a) In the case of PDR5, the vma is such that the first few instructions
1968      of the procedure can be found.  But since the size of this procedure is
1969      160b, the vma will soon cross into the 'address space' of FDR1 and no
1970      debugging info will be found.  How repugnant!
1971 
1972      (b) It is also possible for a PDR to have a *lower* vma than its associated
1973      FDR; see FDR1 and PDR3.  Gross!
1974 
1975      Since the FDRs that are causing so much havok (in this case) 1) do not
1976      describe actual files (fdr.rss == -1), and 2) contain only compiler
1977      generated routines, I thought a simple fix would be to exclude them from
1978      the FDR table in 'mk_fdrtab'.  But, besides not knowing for certain
1979      whether this would be correct, it creates an additional problem.  If we
1980      happen to ask for source file info on a compiler generated (procedure)
1981      symbol -- which is still in the symbol table -- the result can be
1982      information from a real procedure!  This is because compiler generated
1983      procedures with vma's higher than the last FDR in the fdr table will be
1984      associated with a PDR from this FDR, specifically the PDR with the
1985      highest vma.  This wasn't a problem before, because each procedure had a
1986      PDR.  (Yes, this problem could be eliminated if we kept the size of the
1987      last PDR around, but things are already getting ugly).
1988 
1989      Probably, a better solution would be to have a sorted PDR table.  Each
1990      PDR would have a pointer to its FDR so file information could still be
1991      obtained.  A FDR table could still be constructed if necessary -- since
1992      it only contains pointers, not much extra memory would be used -- but
1993      the PDR table would be searched to locate debugging info.
1994 
1995      There is still at least one remaining issue.  Sometimes a FDR can have a
1996      bogus name, but contain PDRs that should belong to another FDR with a
1997      real name.  E.g:
1998 
1999      FDR [3]: 0000000120001b50 (/home/.../Array.H~alt~deccxx_5E5A62AD)
2000        PDR [a] for File [3]: 0000000120001b50
2001        PDR [b] for File [3]: 0000000120001cf0
2002        PDR [c] for File [3]: 0000000120001dc8
2003        PDR [d] for File [3]: 0000000120001e40
2004        PDR [e] for File [3]: 0000000120001eb8
2005        PDR [f] for File [3]: 0000000120001f4c
2006      FDR [4]: 0000000120001b50 (/home/.../Array.H)
2007 
2008      Here, FDR4 has the correct name, but should (seemingly) contain PDRa-f.
2009      The symbol table for PDR4 does contain symbols for PDRa-f, but so does
2010      the symbol table for FDR3.  However the former is different; perhaps this
2011      can be detected easily. (I'm not sure at this point.)  This problem only
2012      seems to be associated with files with templates.  I am assuming the idea
2013      is that there is a 'fake' FDR (with PDRs) for each differently typed set
2014      of templates that must be generated.  Currently, FDR4 is completely
2015      excluded from the FDR table in 'mk_fdrtab' because it contains no PDRs.
2016 
2017      Since I don't have time to prepare a real fix for this right now, be
2018      prepared for 'A Horrible Hack' to force the inspection of all non-stabs
2019      FDRs.  It's coming...  */
2020   fdr_ptr = tab[i].fdr;
2021 
2022   /* Check whether this file has stabs debugging information.  In a
2023      file with stabs debugging information, the second local symbol is
2024      named @stabs.  */
2025   stabs = FALSE;
2026   if (fdr_ptr->csym >= 2)
2027     {
2028       char *sym_ptr;
2029       SYMR sym;
2030 
2031       sym_ptr = ((char *) debug_info->external_sym
2032 		 + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size);
2033       (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2034       if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss,
2035 		  STABS_SYMBOL) == 0)
2036 	stabs = TRUE;
2037     }
2038 
2039   if (!stabs)
2040     {
2041       bfd_size_type external_pdr_size;
2042       char *pdr_ptr;
2043       char *best_pdr = NULL;
2044       FDR *best_fdr;
2045       bfd_signed_vma best_dist = -1;
2046       PDR pdr;
2047       unsigned char *line_ptr;
2048       unsigned char *line_end;
2049       int lineno;
2050       /* This file uses ECOFF debugging information.  Each FDR has a
2051          list of procedure descriptors (PDR).  The address in the FDR
2052          is the absolute address of the first procedure.  The address
2053          in the first PDR gives the offset of that procedure relative
2054          to the object file's base-address.  The addresses in
2055          subsequent PDRs specify each procedure's address relative to
2056          the object file's base-address.  To make things more juicy,
2057          whenever the PROF bit in the PDR is set, the real entry point
2058          of the procedure may be 16 bytes below what would normally be
2059          the procedure's entry point.  Instead, DEC came up with a
2060          wicked scheme to create profiled libraries "on the fly":
2061          instead of shipping a regular and a profiled version of each
2062          library, they insert 16 bytes of unused space in front of
2063          each procedure and set the "prof" bit in the PDR to indicate
2064          that there is a gap there (this is done automagically by "as"
2065          when option "-pg" is specified).  Thus, normally, you link
2066          against such a library and, except for lots of 16 byte gaps
2067          between functions, things will behave as usual.  However,
2068          when invoking "ld" with option "-pg", it will fill those gaps
2069          with code that calls mcount().  It then moves the function's
2070          entry point down by 16 bytes, and out pops a binary that has
2071          all functions profiled.
2072 
2073          NOTE: Neither FDRs nor PDRs are strictly sorted in memory
2074                order.  For example, when including header-files that
2075                define functions, the FDRs follow behind the including
2076                file, even though their code may have been generated at
2077                a lower address.  File coff-alpha.c from libbfd
2078                illustrates this (use "odump -PFv" to look at a file's
2079                FDR/PDR).  Similarly, PDRs are sometimes out of order
2080                as well.  An example of this is OSF/1 v3.0 libc's
2081                malloc.c.  I'm not sure why this happens, but it could
2082                be due to optimizations that reorder a function's
2083                position within an object-file.
2084 
2085          Strategy:
2086 
2087          On the first call to this function, we build a table of FDRs
2088          that is sorted by the base-address of the object-file the FDR
2089          is referring to.  Notice that each object-file may contain
2090          code from multiple source files (e.g., due to code defined in
2091          include files).  Thus, for any given base-address, there may
2092          be multiple FDRs (but this case is, fortunately, uncommon).
2093          lookup(addr) guarantees to return the first FDR that applies
2094          to address ADDR.  Thus, after invoking lookup(), we have a
2095          list of FDRs that may contain the PDR for ADDR.  Next, we
2096          walk through the PDRs of these FDRs and locate the one that
2097          is closest to ADDR (i.e., for which the difference between
2098          ADDR and the PDR's entry point is positive and minimal).
2099          Once, the right FDR and PDR are located, we simply walk
2100          through the line-number table to lookup the line-number that
2101          best matches ADDR.  Obviously, things could be sped up by
2102          keeping a sorted list of PDRs instead of a sorted list of
2103          FDRs.  However, this would increase space requirements
2104          considerably, which is undesirable.  */
2105       external_pdr_size = debug_swap->external_pdr_size;
2106 
2107       /* eraxxon: The Horrible Hack: Because of the problems above, set 'i'
2108 	 to 0 so we look through all FDRs.
2109 
2110 	 Because FDR's without any symbols are assumed to be non-stabs,
2111 	 searching through all FDRs may cause the following code to try to
2112 	 read stabs FDRs as ECOFF ones.  However, I don't think this will
2113 	 harm anything.  */
2114       i = 0;
2115 
2116       /* Search FDR list starting at tab[i] for the PDR that best matches
2117          OFFSET.  Normally, the FDR list is only one entry long.  */
2118       best_fdr = NULL;
2119       do
2120 	{
2121 	  /* eraxxon: 'dist' and 'min_dist' can be negative now
2122              because we iterate over every FDR rather than just ones
2123              with a base address less than or equal to 'offset'.  */
2124 	  bfd_signed_vma dist = -1, min_dist = -1;
2125 	  char *pdr_hold;
2126 	  char *pdr_end;
2127 
2128 	  fdr_ptr = tab[i].fdr;
2129 
2130 	  pdr_ptr = ((char *) debug_info->external_pdr
2131 		     + fdr_ptr->ipdFirst * external_pdr_size);
2132 	  pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size;
2133 	  (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2134 	  /* Find PDR that is closest to OFFSET.  If pdr.prof is set,
2135 	     the procedure entry-point *may* be 0x10 below pdr.adr.  We
2136 	     simply pretend that pdr.prof *implies* a lower entry-point.
2137 	     This is safe because it just means that may identify 4 NOPs
2138 	     in front of the function as belonging to the function.  */
2139 	  for (pdr_hold = NULL;
2140 	       pdr_ptr < pdr_end;
2141 	       (pdr_ptr += external_pdr_size,
2142 		(*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr)))
2143 	    {
2144 	      if (offset >= (pdr.adr - 0x10 * pdr.prof))
2145 		{
2146 		  dist = offset - (pdr.adr - 0x10 * pdr.prof);
2147 
2148 		  /* eraxxon: 'dist' can be negative now.  Note that
2149                      'min_dist' can be negative if 'pdr_hold' below is NULL.  */
2150 		  if (!pdr_hold || (dist >= 0 && dist < min_dist))
2151 		    {
2152 		      min_dist = dist;
2153 		      pdr_hold = pdr_ptr;
2154 		    }
2155 		}
2156 	    }
2157 
2158 	  if (!best_pdr || (min_dist >= 0 && min_dist < best_dist))
2159 	    {
2160 	      best_dist = (bfd_vma) min_dist;
2161 	      best_fdr = fdr_ptr;
2162 	      best_pdr = pdr_hold;
2163 	    }
2164 	  /* Continue looping until base_addr of next entry is different.  */
2165 	}
2166       /* eraxxon: We want to iterate over all FDRs.
2167 	 See previous comment about 'fdrtab_lookup'.  */
2168       while (++i < line_info->fdrtab_len);
2169 
2170       if (!best_fdr || !best_pdr)
2171 	return FALSE;			/* Shouldn't happen...  */
2172 
2173       /* Phew, finally we got something that we can hold onto.  */
2174       fdr_ptr = best_fdr;
2175       pdr_ptr = best_pdr;
2176       (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr);
2177       /* Now we can look for the actual line number.  The line numbers
2178          are stored in a very funky format, which I won't try to
2179          describe.  The search is bounded by the end of the FDRs line
2180          number entries.  */
2181       line_end = debug_info->line + fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2182 
2183       /* Make offset relative to procedure entry.  */
2184       offset -= pdr.adr - 0x10 * pdr.prof;
2185       lineno = pdr.lnLow;
2186       line_ptr = debug_info->line + fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2187       while (line_ptr < line_end)
2188 	{
2189 	  int delta;
2190 	  unsigned int count;
2191 
2192 	  delta = *line_ptr >> 4;
2193 	  if (delta >= 0x8)
2194 	    delta -= 0x10;
2195 	  count = (*line_ptr & 0xf) + 1;
2196 	  ++line_ptr;
2197 	  if (delta == -8)
2198 	    {
2199 	      delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2200 	      if (delta >= 0x8000)
2201 		delta -= 0x10000;
2202 	      line_ptr += 2;
2203 	    }
2204 	  lineno += delta;
2205 	  if (offset < count * 4)
2206 	    {
2207 	      line_info->cache.stop += count * 4 - offset;
2208 	      break;
2209 	    }
2210 	  offset -= count * 4;
2211 	}
2212 
2213       /* If fdr_ptr->rss is -1, then this file does not have full
2214          symbols, at least according to gdb/mipsread.c.  */
2215       if (fdr_ptr->rss == -1)
2216 	{
2217 	  line_info->cache.filename = NULL;
2218 	  if (pdr.isym == -1)
2219 	    line_info->cache.functionname = NULL;
2220 	  else
2221 	    {
2222 	      EXTR proc_ext;
2223 
2224 	      (*debug_swap->swap_ext_in)
2225 		(abfd,
2226 		 ((char *) debug_info->external_ext
2227 		  + pdr.isym * debug_swap->external_ext_size),
2228 		 &proc_ext);
2229 	      line_info->cache.functionname = (debug_info->ssext
2230 					       + proc_ext.asym.iss);
2231 	    }
2232 	}
2233       else
2234 	{
2235 	  SYMR proc_sym;
2236 
2237 	  line_info->cache.filename = (debug_info->ss
2238 				       + fdr_ptr->issBase
2239 				       + fdr_ptr->rss);
2240 	  (*debug_swap->swap_sym_in)
2241 	    (abfd,
2242 	     ((char *) debug_info->external_sym
2243 	      + ((fdr_ptr->isymBase + pdr.isym)
2244 		 * debug_swap->external_sym_size)),
2245 	     &proc_sym);
2246 	  line_info->cache.functionname = (debug_info->ss
2247 					   + fdr_ptr->issBase
2248 					   + proc_sym.iss);
2249 	}
2250       if (lineno == ilineNil)
2251 	lineno = 0;
2252       line_info->cache.line_num = lineno;
2253     }
2254   else
2255     {
2256       bfd_size_type external_sym_size;
2257       const char *directory_name;
2258       const char *main_file_name;
2259       const char *current_file_name;
2260       const char *function_name;
2261       const char *line_file_name;
2262       bfd_vma low_func_vma;
2263       bfd_vma low_line_vma;
2264       bfd_boolean past_line;
2265       bfd_boolean past_fn;
2266       char *sym_ptr, *sym_ptr_end;
2267       size_t len, funclen;
2268       char *buffer = NULL;
2269 
2270       /* This file uses stabs debugging information.  When gcc is not
2271 	 optimizing, it will put the line number information before
2272 	 the function name stabs entry.  When gcc is optimizing, it
2273 	 will put the stabs entry for all the function first, followed
2274 	 by the line number information.  (This appears to happen
2275 	 because of the two output files used by the -mgpopt switch,
2276 	 which is implied by -O).  This means that we must keep
2277 	 looking through the symbols until we find both a line number
2278 	 and a function name which are beyond the address we want.  */
2279 
2280       line_info->cache.filename = NULL;
2281       line_info->cache.functionname = NULL;
2282       line_info->cache.line_num = 0;
2283 
2284       directory_name = NULL;
2285       main_file_name = NULL;
2286       current_file_name = NULL;
2287       function_name = NULL;
2288       line_file_name = NULL;
2289       low_func_vma = 0;
2290       low_line_vma = 0;
2291       past_line = FALSE;
2292       past_fn = FALSE;
2293 
2294       external_sym_size = debug_swap->external_sym_size;
2295 
2296       sym_ptr = ((char *) debug_info->external_sym
2297 		 + (fdr_ptr->isymBase + 2) * external_sym_size);
2298       sym_ptr_end = sym_ptr + (fdr_ptr->csym - 2) * external_sym_size;
2299       for (;
2300 	   sym_ptr < sym_ptr_end && (! past_line || ! past_fn);
2301 	   sym_ptr += external_sym_size)
2302 	{
2303 	  SYMR sym;
2304 
2305 	  (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym);
2306 
2307 	  if (ECOFF_IS_STAB (&sym))
2308 	    {
2309 	      switch (ECOFF_UNMARK_STAB (sym.index))
2310 		{
2311 		case N_SO:
2312 		  main_file_name = current_file_name =
2313 		    debug_info->ss + fdr_ptr->issBase + sym.iss;
2314 
2315 		  /* Check the next symbol to see if it is also an
2316                      N_SO symbol.  */
2317 		  if (sym_ptr + external_sym_size < sym_ptr_end)
2318 		    {
2319 		      SYMR nextsym;
2320 
2321 		      (*debug_swap->swap_sym_in) (abfd,
2322 						  sym_ptr + external_sym_size,
2323 						  &nextsym);
2324 		      if (ECOFF_IS_STAB (&nextsym)
2325 			  && ECOFF_UNMARK_STAB (nextsym.index) == N_SO)
2326 			{
2327  			  directory_name = current_file_name;
2328 			  main_file_name = current_file_name =
2329 			    debug_info->ss + fdr_ptr->issBase + nextsym.iss;
2330 			  sym_ptr += external_sym_size;
2331 			}
2332 		    }
2333 		  break;
2334 
2335 		case N_SOL:
2336 		  current_file_name =
2337 		    debug_info->ss + fdr_ptr->issBase + sym.iss;
2338 		  break;
2339 
2340 		case N_FUN:
2341 		  if (sym.value > offset)
2342 		    past_fn = TRUE;
2343 		  else if (sym.value >= low_func_vma)
2344 		    {
2345 		      low_func_vma = sym.value;
2346 		      function_name =
2347 			debug_info->ss + fdr_ptr->issBase + sym.iss;
2348 		    }
2349 		  break;
2350 		}
2351 	    }
2352 	  else if (sym.st == stLabel && sym.index != indexNil)
2353 	    {
2354 	      if (sym.value > offset)
2355 		past_line = TRUE;
2356 	      else if (sym.value >= low_line_vma)
2357 		{
2358 		  low_line_vma = sym.value;
2359 		  line_file_name = current_file_name;
2360 		  line_info->cache.line_num = sym.index;
2361 		}
2362 	    }
2363 	}
2364 
2365       if (line_info->cache.line_num != 0)
2366 	main_file_name = line_file_name;
2367 
2368       /* We need to remove the stuff after the colon in the function
2369          name.  We also need to put the directory name and the file
2370          name together.  */
2371       if (function_name == NULL)
2372 	len = funclen = 0;
2373       else
2374 	len = funclen = strlen (function_name) + 1;
2375 
2376       if (main_file_name != NULL
2377 	  && directory_name != NULL
2378 	  && main_file_name[0] != '/')
2379 	len += strlen (directory_name) + strlen (main_file_name) + 1;
2380 
2381       if (len != 0)
2382 	{
2383 	  if (line_info->find_buffer != NULL)
2384 	    free (line_info->find_buffer);
2385 	  buffer = (char *) bfd_malloc ((bfd_size_type) len);
2386 	  if (buffer == NULL)
2387 	    return FALSE;
2388 	  line_info->find_buffer = buffer;
2389 	}
2390 
2391       if (function_name != NULL)
2392 	{
2393 	  char *colon;
2394 
2395 	  strcpy (buffer, function_name);
2396 	  colon = strchr (buffer, ':');
2397 	  if (colon != NULL)
2398 	    *colon = '\0';
2399 	  line_info->cache.functionname = buffer;
2400 	}
2401 
2402       if (main_file_name != NULL)
2403 	{
2404 	  if (directory_name == NULL || main_file_name[0] == '/')
2405 	    line_info->cache.filename = main_file_name;
2406 	  else
2407 	    {
2408 	      sprintf (buffer + funclen, "%s%s", directory_name,
2409 		       main_file_name);
2410 	      line_info->cache.filename = buffer + funclen;
2411 	    }
2412 	}
2413     }
2414 
2415   return TRUE;
2416 }
2417 
2418 /* Do the work of find_nearest_line.  */
2419 
2420 bfd_boolean
2421 _bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap,
2422 			line_info, filename_ptr, functionname_ptr, retline_ptr)
2423      bfd *abfd;
2424      asection *section;
2425      bfd_vma offset;
2426      struct ecoff_debug_info * const debug_info;
2427      const struct ecoff_debug_swap * const debug_swap;
2428      struct ecoff_find_line *line_info;
2429      const char **filename_ptr;
2430      const char **functionname_ptr;
2431      unsigned int *retline_ptr;
2432 {
2433   offset += section->vma;
2434 
2435   if (line_info->cache.sect == NULL
2436       || line_info->cache.sect != section
2437       || offset < line_info->cache.start
2438       || offset >= line_info->cache.stop)
2439     {
2440       line_info->cache.sect = section;
2441       line_info->cache.start = offset;
2442       line_info->cache.stop = offset;
2443       if (! lookup_line (abfd, debug_info, debug_swap, line_info))
2444 	{
2445 	  line_info->cache.sect = NULL;
2446 	  return FALSE;
2447 	}
2448     }
2449 
2450   *filename_ptr = line_info->cache.filename;
2451   *functionname_ptr = line_info->cache.functionname;
2452   *retline_ptr = line_info->cache.line_num;
2453 
2454   return TRUE;
2455 }
2456 
2457 /* These routines copy symbolic information into a memory buffer.
2458 
2459    FIXME: The whole point of the shuffle code is to avoid storing
2460    everything in memory, since the linker is such a memory hog.  This
2461    code makes that effort useless.  It is only called by the MIPS ELF
2462    code when generating a shared library, so it is not that big a
2463    deal, but it should be fixed eventually.  */
2464 
2465 /* Collect a shuffle into a memory buffer.  */
2466 
2467 static bfd_boolean ecoff_collect_shuffle
2468   PARAMS ((struct shuffle *, bfd_byte *));
2469 
2470 static bfd_boolean
2471 ecoff_collect_shuffle (l, buff)
2472      struct shuffle *l;
2473      bfd_byte *buff;
2474 {
2475   unsigned long total;
2476 
2477   total = 0;
2478   for (; l != (struct shuffle *) NULL; l = l->next)
2479     {
2480       if (! l->filep)
2481 	memcpy (buff, l->u.memory, l->size);
2482       else
2483 	{
2484 	  if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
2485 	      || (bfd_bread (buff, (bfd_size_type) l->size, l->u.file.input_bfd)
2486 		  != l->size))
2487 	    return FALSE;
2488 	}
2489       total += l->size;
2490       buff += l->size;
2491     }
2492 
2493   return TRUE;
2494 }
2495 
2496 /* Copy PDR information into a memory buffer.  */
2497 
2498 bfd_boolean
2499 _bfd_ecoff_get_accumulated_pdr (handle, buff)
2500      PTR handle;
2501      bfd_byte *buff;
2502 {
2503   struct accumulate *ainfo = (struct accumulate *) handle;
2504 
2505   return ecoff_collect_shuffle (ainfo->pdr, buff);
2506 }
2507 
2508 /* Copy symbol information into a memory buffer.  */
2509 
2510 bfd_boolean
2511 _bfd_ecoff_get_accumulated_sym (handle, buff)
2512      PTR handle;
2513      bfd_byte *buff;
2514 {
2515   struct accumulate *ainfo = (struct accumulate *) handle;
2516 
2517   return ecoff_collect_shuffle (ainfo->sym, buff);
2518 }
2519 
2520 /* Copy the string table into a memory buffer.  */
2521 
2522 bfd_boolean
2523 _bfd_ecoff_get_accumulated_ss (handle, buff)
2524      PTR handle;
2525      bfd_byte *buff;
2526 {
2527   struct accumulate *ainfo = (struct accumulate *) handle;
2528   struct string_hash_entry *sh;
2529   unsigned long total;
2530 
2531   /* The string table is written out from the hash table if this is a
2532      final link.  */
2533   BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
2534   *buff++ = '\0';
2535   total = 1;
2536   BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
2537   for (sh = ainfo->ss_hash;
2538        sh != (struct string_hash_entry *) NULL;
2539        sh = sh->next)
2540     {
2541       size_t len;
2542 
2543       len = strlen (sh->root.string);
2544       memcpy (buff, (PTR) sh->root.string, len + 1);
2545       total += len + 1;
2546       buff += len + 1;
2547     }
2548 
2549   return TRUE;
2550 }
2551