daily update
[deliverable/binutils-gdb.git] / gdb / somread.c
1 /* Read HP PA/Risc object files for GDB.
2 Copyright 1991, 1992, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4 Written by Fred Fish at Cygnus Support.
5
6 This file is part of GDB.
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 2 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., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 #include "defs.h"
24 #include "bfd.h"
25 #include <syms.h>
26 #include "symtab.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29 #include "buildsym.h"
30 #include "stabsread.h"
31 #include "gdb-stabs.h"
32 #include "complaints.h"
33 #include "gdb_string.h"
34 #include "demangle.h"
35 #include "som.h"
36 #include "libhppa.h"
37
38 /* Various things we might complain about... */
39
40 static void som_symfile_init (struct objfile *);
41
42 static void som_new_init (struct objfile *);
43
44 static void som_symfile_read (struct objfile *, int);
45
46 static void som_symfile_finish (struct objfile *);
47
48 static void
49 som_symtab_read (bfd *, struct objfile *, struct section_offsets *);
50
51 static void
52 som_symfile_offsets (struct objfile *, struct section_addr_info *);
53
54 /* FIXME: These should really be in a common header somewhere */
55
56 extern void hpread_build_psymtabs (struct objfile *, int);
57
58 extern void hpread_symfile_finish (struct objfile *);
59
60 extern void hpread_symfile_init (struct objfile *);
61
62 extern void do_pxdb (bfd *);
63
64 /*
65
66 LOCAL FUNCTION
67
68 som_symtab_read -- read the symbol table of a SOM file
69
70 SYNOPSIS
71
72 void som_symtab_read (bfd *abfd, struct objfile *objfile,
73 struct section_offsets *section_offsets)
74
75 DESCRIPTION
76
77 Given an open bfd, a base address to relocate symbols to, and a
78 flag that specifies whether or not this bfd is for an executable
79 or not (may be shared library for example), add all the global
80 function and data symbols to the minimal symbol table.
81 */
82
83 static void
84 som_symtab_read (bfd *abfd, struct objfile *objfile,
85 struct section_offsets *section_offsets)
86 {
87 unsigned int number_of_symbols;
88 int val, dynamic;
89 char *stringtab;
90 asection *shlib_info;
91 struct symbol_dictionary_record *buf, *bufp, *endbufp;
92 char *symname;
93 CONST int symsize = sizeof (struct symbol_dictionary_record);
94 CORE_ADDR text_offset, data_offset;
95
96
97 text_offset = ANOFFSET (section_offsets, 0);
98 data_offset = ANOFFSET (section_offsets, 1);
99
100 number_of_symbols = bfd_get_symcount (abfd);
101
102 /* FIXME (alloca): could be quite large. */
103 buf = alloca (symsize * number_of_symbols);
104 bfd_seek (abfd, obj_som_sym_filepos (abfd), SEEK_SET);
105 val = bfd_bread (buf, symsize * number_of_symbols, abfd);
106 if (val != symsize * number_of_symbols)
107 error ("Couldn't read symbol dictionary!");
108
109 /* FIXME (alloca): could be quite large. */
110 stringtab = alloca (obj_som_stringtab_size (abfd));
111 bfd_seek (abfd, obj_som_str_filepos (abfd), SEEK_SET);
112 val = bfd_bread (stringtab, obj_som_stringtab_size (abfd), abfd);
113 if (val != obj_som_stringtab_size (abfd))
114 error ("Can't read in HP string table.");
115
116 /* We need to determine if objfile is a dynamic executable (so we
117 can do the right thing for ST_ENTRY vs ST_CODE symbols).
118
119 There's nothing in the header which easily allows us to do
120 this.
121
122 This code used to rely upon the existence of a $SHLIB_INFO$
123 section to make this determination. HP claims that it is
124 more accurate to check for a nonzero text offset, but they
125 have not provided any information about why that test is
126 more accurate. */
127 dynamic = (text_offset != 0);
128
129 endbufp = buf + number_of_symbols;
130 for (bufp = buf; bufp < endbufp; ++bufp)
131 {
132 enum minimal_symbol_type ms_type;
133
134 QUIT;
135
136 switch (bufp->symbol_scope)
137 {
138 case SS_UNIVERSAL:
139 case SS_EXTERNAL:
140 switch (bufp->symbol_type)
141 {
142 case ST_SYM_EXT:
143 case ST_ARG_EXT:
144 continue;
145
146 case ST_CODE:
147 case ST_PRI_PROG:
148 case ST_SEC_PROG:
149 case ST_MILLICODE:
150 symname = bufp->name.n_strx + stringtab;
151 ms_type = mst_text;
152 bufp->symbol_value += text_offset;
153 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
154 break;
155
156 case ST_ENTRY:
157 symname = bufp->name.n_strx + stringtab;
158 /* For a dynamic executable, ST_ENTRY symbols are
159 the stubs, while the ST_CODE symbol is the real
160 function. */
161 if (dynamic)
162 ms_type = mst_solib_trampoline;
163 else
164 ms_type = mst_text;
165 bufp->symbol_value += text_offset;
166 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
167 break;
168
169 case ST_STUB:
170 symname = bufp->name.n_strx + stringtab;
171 ms_type = mst_solib_trampoline;
172 bufp->symbol_value += text_offset;
173 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
174 break;
175
176 case ST_DATA:
177 symname = bufp->name.n_strx + stringtab;
178 bufp->symbol_value += data_offset;
179 ms_type = mst_data;
180 break;
181 default:
182 continue;
183 }
184 break;
185
186 #if 0
187 /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!). */
188 case SS_GLOBAL:
189 #endif
190 case SS_LOCAL:
191 switch (bufp->symbol_type)
192 {
193 case ST_SYM_EXT:
194 case ST_ARG_EXT:
195 continue;
196
197 case ST_CODE:
198 symname = bufp->name.n_strx + stringtab;
199 ms_type = mst_file_text;
200 bufp->symbol_value += text_offset;
201 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
202
203 check_strange_names:
204 /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local
205 label prefixes for stabs, constant data, etc. So we need
206 only filter out L$ symbols which are left in due to
207 limitations in how GAS generates SOM relocations.
208
209 When linking in the HPUX C-library the HP linker has
210 the nasty habit of placing section symbols from the literal
211 subspaces in the middle of the program's text. Filter
212 those out as best we can. Check for first and last character
213 being '$'.
214
215 And finally, the newer HP compilers emit crud like $PIC_foo$N
216 in some circumstance (PIC code I guess). It's also claimed
217 that they emit D$ symbols too. What stupidity. */
218 if ((symname[0] == 'L' && symname[1] == '$')
219 || (symname[0] == '$' && symname[strlen (symname) - 1] == '$')
220 || (symname[0] == 'D' && symname[1] == '$')
221 || (strncmp (symname, "$PIC", 4) == 0))
222 continue;
223 break;
224
225 case ST_PRI_PROG:
226 case ST_SEC_PROG:
227 case ST_MILLICODE:
228 symname = bufp->name.n_strx + stringtab;
229 ms_type = mst_file_text;
230 bufp->symbol_value += text_offset;
231 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
232 break;
233
234 case ST_ENTRY:
235 symname = bufp->name.n_strx + stringtab;
236 /* SS_LOCAL symbols in a shared library do not have
237 export stubs, so we do not have to worry about
238 using mst_file_text vs mst_solib_trampoline here like
239 we do for SS_UNIVERSAL and SS_EXTERNAL symbols above. */
240 ms_type = mst_file_text;
241 bufp->symbol_value += text_offset;
242 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
243 break;
244
245 case ST_STUB:
246 symname = bufp->name.n_strx + stringtab;
247 ms_type = mst_solib_trampoline;
248 bufp->symbol_value += text_offset;
249 bufp->symbol_value = SMASH_TEXT_ADDRESS (bufp->symbol_value);
250 break;
251
252
253 case ST_DATA:
254 symname = bufp->name.n_strx + stringtab;
255 bufp->symbol_value += data_offset;
256 ms_type = mst_file_data;
257 goto check_strange_names;
258
259 default:
260 continue;
261 }
262 break;
263
264 /* This can happen for common symbols when -E is passed to the
265 final link. No idea _why_ that would make the linker force
266 common symbols to have an SS_UNSAT scope, but it does.
267
268 This also happens for weak symbols, but their type is
269 ST_DATA. */
270 case SS_UNSAT:
271 switch (bufp->symbol_type)
272 {
273 case ST_STORAGE:
274 case ST_DATA:
275 symname = bufp->name.n_strx + stringtab;
276 bufp->symbol_value += data_offset;
277 ms_type = mst_data;
278 break;
279
280 default:
281 continue;
282 }
283 break;
284
285 default:
286 continue;
287 }
288
289 if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
290 error ("Invalid symbol data; bad HP string table offset: %d",
291 bufp->name.n_strx);
292
293 prim_record_minimal_symbol (symname, bufp->symbol_value, ms_type,
294 objfile);
295 }
296 }
297
298 /* Scan and build partial symbols for a symbol file.
299 We have been initialized by a call to som_symfile_init, which
300 currently does nothing.
301
302 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
303 in each section. This is ignored, as it isn't needed for SOM.
304
305 MAINLINE is true if we are reading the main symbol
306 table (as opposed to a shared lib or dynamically loaded file).
307
308 This function only does the minimum work necessary for letting the
309 user "name" things symbolically; it does not read the entire symtab.
310 Instead, it reads the external and static symbols and puts them in partial
311 symbol tables. When more extensive information is requested of a
312 file, the corresponding partial symbol table is mutated into a full
313 fledged symbol table by going back and reading the symbols
314 for real.
315
316 We look for sections with specific names, to tell us what debug
317 format to look for: FIXME!!!
318
319 somstab_build_psymtabs() handles STABS symbols.
320
321 Note that SOM files have a "minimal" symbol table, which is vaguely
322 reminiscent of a COFF symbol table, but has only the minimal information
323 necessary for linking. We process this also, and use the information to
324 build gdb's minimal symbol table. This gives us some minimal debugging
325 capability even for files compiled without -g. */
326
327 static void
328 som_symfile_read (struct objfile *objfile, int mainline)
329 {
330 bfd *abfd = objfile->obfd;
331 struct cleanup *back_to;
332
333 do_pxdb (symfile_bfd_open (objfile->name));
334
335 init_minimal_symbol_collection ();
336 back_to = make_cleanup_discard_minimal_symbols ();
337
338 /* Read in the import list and the export list. Currently
339 the export list isn't used; the import list is used in
340 hp-symtab-read.c to handle static vars declared in other
341 shared libraries. */
342 init_import_symbols (objfile);
343 #if 0 /* Export symbols not used today 1997-08-05 */
344 init_export_symbols (objfile);
345 #else
346 objfile->export_list = NULL;
347 objfile->export_list_size = 0;
348 #endif
349
350 /* Process the normal SOM symbol table first.
351 This reads in the DNTT and string table, but doesn't
352 actually scan the DNTT. It does scan the linker symbol
353 table and thus build up a "minimal symbol table". */
354
355 som_symtab_read (abfd, objfile, objfile->section_offsets);
356
357 /* Now read information from the stabs debug sections.
358 This is a no-op for SOM.
359 Perhaps it is intended for some kind of mixed STABS/SOM
360 situation? */
361 stabsect_build_psymtabs (objfile, mainline,
362 "$GDB_SYMBOLS$", "$GDB_STRINGS$", "$TEXT$");
363
364 /* Now read the native debug information.
365 This builds the psymtab. This used to be done via a scan of
366 the DNTT, but is now done via the PXDB-built quick-lookup tables
367 together with a scan of the GNTT. See hp-psymtab-read.c. */
368 hpread_build_psymtabs (objfile, mainline);
369
370 /* Install any minimal symbols that have been collected as the current
371 minimal symbols for this objfile.
372 Further symbol-reading is done incrementally, file-by-file,
373 in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
374 contains the code to do the actual DNTT scanning and symtab building. */
375 install_minimal_symbols (objfile);
376
377 /* Force hppa-tdep.c to re-read the unwind descriptors. */
378 objfile->obj_private = NULL;
379 do_cleanups (back_to);
380 }
381
382 /* Initialize anything that needs initializing when a completely new symbol
383 file is specified (not just adding some symbols from another file, e.g. a
384 shared library).
385
386 We reinitialize buildsym, since we may be reading stabs from a SOM file. */
387
388 static void
389 som_new_init (struct objfile *ignore)
390 {
391 stabsread_new_init ();
392 buildsym_new_init ();
393 }
394
395 /* Perform any local cleanups required when we are done with a particular
396 objfile. I.E, we are in the process of discarding all symbol information
397 for an objfile, freeing up all memory held for it, and unlinking the
398 objfile struct from the global list of known objfiles. */
399
400 static void
401 som_symfile_finish (struct objfile *objfile)
402 {
403 if (objfile->sym_stab_info != NULL)
404 {
405 xmfree (objfile->md, objfile->sym_stab_info);
406 }
407 hpread_symfile_finish (objfile);
408 }
409
410 /* SOM specific initialization routine for reading symbols. */
411
412 static void
413 som_symfile_init (struct objfile *objfile)
414 {
415 /* SOM objects may be reordered, so set OBJF_REORDERED. If we
416 find this causes a significant slowdown in gdb then we could
417 set it in the debug symbol readers only when necessary. */
418 objfile->flags |= OBJF_REORDERED;
419 hpread_symfile_init (objfile);
420 }
421
422 /* SOM specific parsing routine for section offsets.
423
424 Plain and simple for now. */
425
426 static void
427 som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
428 {
429 int i;
430 CORE_ADDR text_addr;
431
432 objfile->num_sections = SECT_OFF_MAX;
433 objfile->section_offsets = (struct section_offsets *)
434 obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
435
436 /* FIXME: ezannoni 2000-04-20 The section names in SOM are not
437 .text, .data, etc, but $TEXT$, $DATA$,... We should initialize
438 SET_OFF_* from bfd. (See default_symfile_offsets()). But I don't
439 know the correspondence between SOM sections and GDB's idea of
440 section names. So for now we default to what is was before these
441 changes.*/
442 objfile->sect_index_text = 0;
443 objfile->sect_index_data = 1;
444 objfile->sect_index_bss = 2;
445 objfile->sect_index_rodata = 3;
446
447 /* First see if we're a shared library. If so, get the section
448 offsets from the library, else get them from addrs. */
449 if (!som_solib_section_offsets (objfile, objfile->section_offsets))
450 {
451 /* Note: Here is OK to compare with ".text" because this is the
452 name that gdb itself gives to that section, not the SOM
453 name. */
454 for (i = 0; i < SECT_OFF_MAX && addrs->other[i].name; i++)
455 if (strcmp (addrs->other[i].name, ".text") == 0)
456 break;
457 text_addr = addrs->other[i].addr;
458
459 for (i = 0; i < SECT_OFF_MAX; i++)
460 (objfile->section_offsets)->offsets[i] = text_addr;
461 }
462 }
463
464 /* Read in and initialize the SOM import list which is present
465 for all executables and shared libraries. The import list
466 consists of the symbols that are referenced in OBJFILE but
467 not defined there. (Variables that are imported are dealt
468 with as "loc_indirect" vars.)
469 Return value = number of import symbols read in. */
470 int
471 init_import_symbols (struct objfile *objfile)
472 {
473 unsigned int import_list;
474 unsigned int import_list_size;
475 unsigned int string_table;
476 unsigned int string_table_size;
477 char *string_buffer;
478 register int i;
479 register int j;
480 register int k;
481 asection *text_section; /* section handle */
482 unsigned int dl_header[12]; /* SOM executable header */
483
484 /* A struct for an entry in the SOM import list */
485 typedef struct
486 {
487 int name; /* index into the string table */
488 short dont_care1; /* we don't use this */
489 unsigned char type; /* 0 = NULL, 2 = Data, 3 = Code, 7 = Storage, 13 = Plabel */
490 unsigned int reserved2:8; /* not used */
491 }
492 SomImportEntry;
493
494 /* We read 100 entries in at a time from the disk file. */
495 #define SOM_READ_IMPORTS_NUM 100
496 #define SOM_READ_IMPORTS_CHUNK_SIZE (sizeof (SomImportEntry) * SOM_READ_IMPORTS_NUM)
497 SomImportEntry buffer[SOM_READ_IMPORTS_NUM];
498
499 /* Initialize in case we error out */
500 objfile->import_list = NULL;
501 objfile->import_list_size = 0;
502
503 /* It doesn't work, for some reason, to read in space $TEXT$;
504 the subspace $SHLIB_INFO$ has to be used. Some BFD quirk? pai/1997-08-05 */
505 text_section = bfd_get_section_by_name (objfile->obfd, "$SHLIB_INFO$");
506 if (!text_section)
507 return 0;
508 /* Get the SOM executable header */
509 bfd_get_section_contents (objfile->obfd, text_section, dl_header, 0, 12 * sizeof (int));
510
511 /* Check header version number for 10.x HP-UX */
512 /* Currently we deal only with 10.x systems; on 9.x the version # is 89060912.
513 FIXME: Change for future HP-UX releases and mods to the SOM executable format */
514 if (dl_header[0] != 93092112)
515 return 0;
516
517 import_list = dl_header[4];
518 import_list_size = dl_header[5];
519 if (!import_list_size)
520 return 0;
521 string_table = dl_header[10];
522 string_table_size = dl_header[11];
523 if (!string_table_size)
524 return 0;
525
526 /* Suck in SOM string table */
527 string_buffer = (char *) xmalloc (string_table_size);
528 bfd_get_section_contents (objfile->obfd, text_section, string_buffer,
529 string_table, string_table_size);
530
531 /* Allocate import list in the psymbol obstack; this has nothing
532 to do with psymbols, just a matter of convenience. We want the
533 import list to be freed when the objfile is deallocated */
534 objfile->import_list
535 = (ImportEntry *) obstack_alloc (&objfile->psymbol_obstack,
536 import_list_size * sizeof (ImportEntry));
537
538 /* Read in the import entries, a bunch at a time */
539 for (j = 0, k = 0;
540 j < (import_list_size / SOM_READ_IMPORTS_NUM);
541 j++)
542 {
543 bfd_get_section_contents (objfile->obfd, text_section, buffer,
544 import_list + j * SOM_READ_IMPORTS_CHUNK_SIZE,
545 SOM_READ_IMPORTS_CHUNK_SIZE);
546 for (i = 0; i < SOM_READ_IMPORTS_NUM; i++, k++)
547 {
548 if (buffer[i].type != (unsigned char) 0)
549 {
550 objfile->import_list[k]
551 = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
552 strcpy (objfile->import_list[k], string_buffer + buffer[i].name);
553 /* Some day we might want to record the type and other information too */
554 }
555 else /* null type */
556 objfile->import_list[k] = NULL;
557
558 }
559 }
560
561 /* Get the leftovers */
562 if (k < import_list_size)
563 bfd_get_section_contents (objfile->obfd, text_section, buffer,
564 import_list + k * sizeof (SomImportEntry),
565 (import_list_size - k) * sizeof (SomImportEntry));
566 for (i = 0; k < import_list_size; i++, k++)
567 {
568 if (buffer[i].type != (unsigned char) 0)
569 {
570 objfile->import_list[k]
571 = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
572 strcpy (objfile->import_list[k], string_buffer + buffer[i].name);
573 /* Some day we might want to record the type and other information too */
574 }
575 else
576 objfile->import_list[k] = NULL;
577 }
578
579 objfile->import_list_size = import_list_size;
580 xfree (string_buffer);
581 return import_list_size;
582 }
583
584 /* Read in and initialize the SOM export list which is present
585 for all executables and shared libraries. The import list
586 consists of the symbols that are referenced in OBJFILE but
587 not defined there. (Variables that are imported are dealt
588 with as "loc_indirect" vars.)
589 Return value = number of import symbols read in. */
590 int
591 init_export_symbols (struct objfile *objfile)
592 {
593 unsigned int export_list;
594 unsigned int export_list_size;
595 unsigned int string_table;
596 unsigned int string_table_size;
597 char *string_buffer;
598 register int i;
599 register int j;
600 register int k;
601 asection *text_section; /* section handle */
602 unsigned int dl_header[12]; /* SOM executable header */
603
604 /* A struct for an entry in the SOM export list */
605 typedef struct
606 {
607 int next; /* for hash table use -- we don't use this */
608 int name; /* index into string table */
609 int value; /* offset or plabel */
610 int dont_care1; /* not used */
611 unsigned char type; /* 0 = NULL, 2 = Data, 3 = Code, 7 = Storage, 13 = Plabel */
612 char dont_care2; /* not used */
613 short dont_care3; /* not used */
614 }
615 SomExportEntry;
616
617 /* We read 100 entries in at a time from the disk file. */
618 #define SOM_READ_EXPORTS_NUM 100
619 #define SOM_READ_EXPORTS_CHUNK_SIZE (sizeof (SomExportEntry) * SOM_READ_EXPORTS_NUM)
620 SomExportEntry buffer[SOM_READ_EXPORTS_NUM];
621
622 /* Initialize in case we error out */
623 objfile->export_list = NULL;
624 objfile->export_list_size = 0;
625
626 /* It doesn't work, for some reason, to read in space $TEXT$;
627 the subspace $SHLIB_INFO$ has to be used. Some BFD quirk? pai/1997-08-05 */
628 text_section = bfd_get_section_by_name (objfile->obfd, "$SHLIB_INFO$");
629 if (!text_section)
630 return 0;
631 /* Get the SOM executable header */
632 bfd_get_section_contents (objfile->obfd, text_section, dl_header, 0, 12 * sizeof (int));
633
634 /* Check header version number for 10.x HP-UX */
635 /* Currently we deal only with 10.x systems; on 9.x the version # is 89060912.
636 FIXME: Change for future HP-UX releases and mods to the SOM executable format */
637 if (dl_header[0] != 93092112)
638 return 0;
639
640 export_list = dl_header[8];
641 export_list_size = dl_header[9];
642 if (!export_list_size)
643 return 0;
644 string_table = dl_header[10];
645 string_table_size = dl_header[11];
646 if (!string_table_size)
647 return 0;
648
649 /* Suck in SOM string table */
650 string_buffer = (char *) xmalloc (string_table_size);
651 bfd_get_section_contents (objfile->obfd, text_section, string_buffer,
652 string_table, string_table_size);
653
654 /* Allocate export list in the psymbol obstack; this has nothing
655 to do with psymbols, just a matter of convenience. We want the
656 export list to be freed when the objfile is deallocated */
657 objfile->export_list
658 = (ExportEntry *) obstack_alloc (&objfile->psymbol_obstack,
659 export_list_size * sizeof (ExportEntry));
660
661 /* Read in the export entries, a bunch at a time */
662 for (j = 0, k = 0;
663 j < (export_list_size / SOM_READ_EXPORTS_NUM);
664 j++)
665 {
666 bfd_get_section_contents (objfile->obfd, text_section, buffer,
667 export_list + j * SOM_READ_EXPORTS_CHUNK_SIZE,
668 SOM_READ_EXPORTS_CHUNK_SIZE);
669 for (i = 0; i < SOM_READ_EXPORTS_NUM; i++, k++)
670 {
671 if (buffer[i].type != (unsigned char) 0)
672 {
673 objfile->export_list[k].name
674 = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
675 strcpy (objfile->export_list[k].name, string_buffer + buffer[i].name);
676 objfile->export_list[k].address = buffer[i].value;
677 /* Some day we might want to record the type and other information too */
678 }
679 else
680 /* null type */
681 {
682 objfile->export_list[k].name = NULL;
683 objfile->export_list[k].address = 0;
684 }
685 }
686 }
687
688 /* Get the leftovers */
689 if (k < export_list_size)
690 bfd_get_section_contents (objfile->obfd, text_section, buffer,
691 export_list + k * sizeof (SomExportEntry),
692 (export_list_size - k) * sizeof (SomExportEntry));
693 for (i = 0; k < export_list_size; i++, k++)
694 {
695 if (buffer[i].type != (unsigned char) 0)
696 {
697 objfile->export_list[k].name
698 = (char *) obstack_alloc (&objfile->psymbol_obstack, strlen (string_buffer + buffer[i].name) + 1);
699 strcpy (objfile->export_list[k].name, string_buffer + buffer[i].name);
700 /* Some day we might want to record the type and other information too */
701 objfile->export_list[k].address = buffer[i].value;
702 }
703 else
704 {
705 objfile->export_list[k].name = NULL;
706 objfile->export_list[k].address = 0;
707 }
708 }
709
710 objfile->export_list_size = export_list_size;
711 xfree (string_buffer);
712 return export_list_size;
713 }
714 \f
715
716
717 /* Register that we are able to handle SOM object file formats. */
718
719 static struct sym_fns som_sym_fns =
720 {
721 bfd_target_som_flavour,
722 som_new_init, /* sym_new_init: init anything gbl to entire symtab */
723 som_symfile_init, /* sym_init: read initial info, setup for sym_read() */
724 som_symfile_read, /* sym_read: read a symbol file into symtab */
725 som_symfile_finish, /* sym_finish: finished with file, cleanup */
726 som_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
727 NULL /* next: pointer to next struct sym_fns */
728 };
729
730 void
731 _initialize_somread (void)
732 {
733 add_symtab_fns (&som_sym_fns);
734 }
This page took 0.046169 seconds and 4 git commands to generate.