OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [somread.c] - Blame information for rev 1775

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* 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
 
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
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.