Change the stream argument to _filtered to GDB_FILE *.
[deliverable/binutils-gdb.git] / gdb / elfread.c
CommitLineData
35f5886e 1/* Read ELF (Executable and Linking Format) object files for GDB.
c2e4669f 2 Copyright 1991, 1992 Free Software Foundation, Inc.
35f5886e
FF
3 Written by Fred Fish at Cygnus Support.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
35f5886e 21#include "defs.h"
35f5886e 22#include "bfd.h"
fc773653 23#include <time.h> /* For time_t in libbfd.h. */
ddf5d7e8 24#include <sys/types.h> /* For time_t, if not in time.h. */
f70be3e4 25#include "libbfd.h" /* For bfd_elf_find_section */
2084a176 26#include "libelf.h"
35f5886e 27#include "symtab.h"
1ab3bf1b 28#include "symfile.h"
5e2e79f8 29#include "objfiles.h"
be772100 30#include "buildsym.h"
2731625a 31#include "stabsread.h"
2670f34d 32#include "gdb-stabs.h"
51b80b00 33#include "complaints.h"
740b7efa 34#include <string.h>
2e4964ad 35#include "demangle.h"
35f5886e 36
2670f34d
JG
37/* The struct elfinfo is available only during ELF symbol table and
38 psymtab reading. It is destroyed at the complation of psymtab-reading.
39 It's local to elf_symfile_read. */
40
35f5886e 41struct elfinfo {
d5931d79 42 file_ptr dboffset; /* Offset to dwarf debug section */
35f5886e 43 unsigned int dbsize; /* Size of dwarf debug section */
d5931d79 44 file_ptr lnoffset; /* Offset to dwarf line number section */
35f5886e 45 unsigned int lnsize; /* Size of dwarf line number section */
346168a2
JG
46 asection *stabsect; /* Section pointer for .stab section */
47 asection *stabindexsect; /* Section pointer for .stab.index section */
35f5886e
FF
48};
49
2670f34d
JG
50/* Various things we might complain about... */
51
52struct complaint section_info_complaint =
53 {"elf/stab section information %s without a preceding file symbol", 0, 0};
54
55struct complaint section_info_dup_complaint =
56 {"duplicated elf/stab section information for %s", 0, 0};
57
58struct complaint stab_info_mismatch_complaint =
59 {"elf/stab section information missing for %s", 0, 0};
60
61struct complaint stab_info_questionable_complaint =
62 {"elf/stab section information questionable for %s", 0, 0};
63
1ab3bf1b 64static void
80d68b1d 65elf_symfile_init PARAMS ((struct objfile *));
1ab3bf1b
JG
66
67static void
80d68b1d 68elf_new_init PARAMS ((struct objfile *));
1ab3bf1b
JG
69
70static void
2670f34d 71elf_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
80d68b1d
FF
72
73static void
74elf_symfile_finish PARAMS ((struct objfile *));
1ab3bf1b
JG
75
76static void
be772100 77elf_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
1ab3bf1b 78
2670f34d 79static void
77fe3f84 80free_elfinfo PARAMS ((void *));
2670f34d
JG
81
82static struct section_offsets *
83elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
84
51b57ded
FF
85static void
86record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
87 enum minimal_symbol_type, char *,
88 struct objfile *));
1ab3bf1b
JG
89
90static void
77fe3f84 91elf_locate_sections PARAMS ((bfd *, asection *, void *));
1ab3bf1b 92
35f5886e
FF
93/* We are called once per section from elf_symfile_read. We
94 need to examine each section we are passed, check to see
95 if it is something we are interested in processing, and
96 if so, stash away some access information for the section.
97
98 For now we recognize the dwarf debug information sections and
99 line number sections from matching their section names. The
100 ELF definition is no real help here since it has no direct
101 knowledge of DWARF (by design, so any debugging format can be
102 used).
103
346168a2
JG
104 We also recognize the ".stab" sections used by the Sun compilers
105 released with Solaris 2.
106
898140fe
JK
107 FIXME: The section names should not be hardwired strings (what
108 should they be? I don't think most object file formats have enough
109 section flags to specify what kind of debug section it is
110 -kingdon). */
35f5886e
FF
111
112static void
be772100
JG
113elf_locate_sections (ignore_abfd, sectp, eip)
114 bfd *ignore_abfd;
1ab3bf1b
JG
115 asection *sectp;
116 PTR eip;
35f5886e 117{
1ab3bf1b
JG
118 register struct elfinfo *ei;
119
120 ei = (struct elfinfo *) eip;
35f5886e
FF
121 if (STREQ (sectp -> name, ".debug"))
122 {
123 ei -> dboffset = sectp -> filepos;
e5849334 124 ei -> dbsize = bfd_get_section_size_before_reloc (sectp);
35f5886e
FF
125 }
126 else if (STREQ (sectp -> name, ".line"))
127 {
128 ei -> lnoffset = sectp -> filepos;
e5849334 129 ei -> lnsize = bfd_get_section_size_before_reloc (sectp);
35f5886e 130 }
346168a2
JG
131 else if (STREQ (sectp -> name, ".stab"))
132 {
133 ei -> stabsect = sectp;
134 }
135 else if (STREQ (sectp -> name, ".stab.index"))
136 {
137 ei -> stabindexsect = sectp;
138 }
35f5886e
FF
139}
140
1ab3bf1b
JG
141#if 0 /* Currently unused */
142
f8b76e70 143char *
1ab3bf1b
JG
144elf_interpreter (abfd)
145 bfd *abfd;
f8b76e70
FF
146{
147 sec_ptr interp_sec;
148 unsigned size;
149 char *interp = NULL;
150
151 interp_sec = bfd_get_section_by_name (abfd, ".interp");
152 if (interp_sec)
153 {
154 size = bfd_section_size (abfd, interp_sec);
155 interp = alloca (size);
156 if (bfd_get_section_contents (abfd, interp_sec, interp, (file_ptr)0,
157 size))
158 {
159 interp = savestring (interp, size - 1);
160 }
161 else
162 {
163 interp = NULL;
164 }
165 }
166 return (interp);
167}
168
1ab3bf1b
JG
169#endif
170
346168a2
JG
171static void
172record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
173 char *name;
174 CORE_ADDR address;
175 enum minimal_symbol_type ms_type;
176 char *info; /* FIXME, is this really char *? */
177 struct objfile *objfile;
178{
610a7e74
ILT
179 int section;
180
181 /* Guess the section from the type. This is likely to be wrong in
182 some cases. */
183 switch (ms_type)
184 {
185 case mst_text:
186 case mst_file_text:
187 section = SECT_OFF_TEXT;
188 break;
189 case mst_data:
190 case mst_file_data:
191 section = SECT_OFF_DATA;
192 break;
193 case mst_bss:
194 case mst_file_bss:
195 section = SECT_OFF_BSS;
196 break;
197 default:
198 section = -1;
199 break;
200 }
201
346168a2 202 name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
610a7e74 203 prim_record_minimal_symbol_and_info (name, address, ms_type, info, section);
346168a2
JG
204}
205
f8b76e70
FF
206/*
207
208LOCAL FUNCTION
209
210 elf_symtab_read -- read the symbol table of an ELF file
211
212SYNOPSIS
213
be772100 214 void elf_symtab_read (bfd *abfd, CORE_ADDR addr,
1ab3bf1b 215 struct objfile *objfile)
f8b76e70
FF
216
217DESCRIPTION
218
219 Given an open bfd, a base address to relocate symbols to, and a
220 flag that specifies whether or not this bfd is for an executable
221 or not (may be shared library for example), add all the global
1ab3bf1b 222 function and data symbols to the minimal symbol table.
f8b76e70 223
2670f34d
JG
224 In stabs-in-ELF, as implemented by Sun, there are some local symbols
225 defined in the ELF symbol table, which can be used to locate
226 the beginnings of sections from each ".o" file that was linked to
227 form the executable objfile. We gather any such info and record it
228 in data structures hung off the objfile's private data.
229
f8b76e70
FF
230*/
231
a7446af6 232static void
be772100 233elf_symtab_read (abfd, addr, objfile)
1ab3bf1b
JG
234 bfd *abfd;
235 CORE_ADDR addr;
1ab3bf1b 236 struct objfile *objfile;
a7446af6
FF
237{
238 unsigned int storage_needed;
239 asymbol *sym;
240 asymbol **symbol_table;
241 unsigned int number_of_symbols;
242 unsigned int i;
2670f34d 243 int index;
a7446af6 244 struct cleanup *back_to;
f8b76e70 245 CORE_ADDR symaddr;
1ab3bf1b 246 enum minimal_symbol_type ms_type;
6c8f91a1 247 /* If sectinfo is nonNULL, it contains section info that should end up
2670f34d 248 filed in the objfile. */
6c8f91a1 249 struct stab_section_info *sectinfo = NULL;
2670f34d
JG
250 /* If filesym is nonzero, it points to a file symbol, but we haven't
251 seen any section info for it yet. */
252 asymbol *filesym = 0;
253 struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
965a5c32 254 objfile->sym_stab_info;
6c8f91a1 255 unsigned long size;
a7446af6
FF
256
257 storage_needed = get_symtab_upper_bound (abfd);
a7446af6
FF
258 if (storage_needed > 0)
259 {
3b0b9220 260 symbol_table = (asymbol **) xmalloc (storage_needed);
a7446af6
FF
261 back_to = make_cleanup (free, symbol_table);
262 number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
a7446af6
FF
263 for (i = 0; i < number_of_symbols; i++)
264 {
2670f34d 265 sym = symbol_table[i];
6c8f91a1 266 if (sym -> name == NULL || *sym -> name == '\0')
379dd965 267 {
6c8f91a1
FF
268 /* Skip names that don't exist (shouldn't happen), or names
269 that are null strings (may happen). */
379dd965
FF
270 continue;
271 }
6c8f91a1
FF
272 if (sym -> flags & BSF_FILE)
273 {
274 /* STT_FILE debugging symbol that helps stabs-in-elf debugging.
275 Chain any old one onto the objfile; remember new sym. */
276 if (sectinfo != NULL)
277 {
278 sectinfo -> next = dbx -> stab_section_info;
279 dbx -> stab_section_info = sectinfo;
280 sectinfo = NULL;
281 }
282 filesym = sym;
283 }
284 else if (sym -> flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
a7446af6 285 {
6c8f91a1
FF
286 /* Select global/local/weak symbols. Note that bfd puts abs
287 symbols in their own section, so all symbols we are
288 interested in will have a section. */
a608f919
FF
289 /* Bfd symbols are section relative. */
290 symaddr = sym -> value + sym -> section -> vma;
c2e4669f
JG
291 /* Relocate all non-absolute symbols by base address. */
292 if (sym -> section != &bfd_abs_section)
6c8f91a1
FF
293 {
294 symaddr += addr;
295 }
f8b76e70
FF
296 /* For non-absolute symbols, use the type of the section
297 they are relative to, to intuit text/data. Bfd provides
298 no way of figuring this out for absolute symbols. */
6c8f91a1
FF
299 if (sym -> section == &bfd_abs_section)
300 {
301 ms_type = mst_abs;
302 }
303 else if (sym -> section -> flags & SEC_CODE)
f8b76e70 304 {
379dd965
FF
305 if (sym -> flags & BSF_GLOBAL)
306 {
307 ms_type = mst_text;
308 }
5ec3ba25 309 else if (sym->name[0] == '.' && sym->name[1] == 'L')
bbf1ff10
JK
310 /* Looks like a compiler-generated label. Skip it.
311 The assembler should be skipping these (to keep
312 executables small), but apparently with gcc on the
313 delta m88k SVR4, it loses. So to have us check too
314 should be harmless (but I encourage people to fix this
315 in the assembler instead of adding checks here). */
5ec3ba25 316 continue;
379dd965
FF
317 else
318 {
319 ms_type = mst_file_text;
320 }
f8b76e70 321 }
90141f9c 322 else if (sym -> section -> flags & SEC_ALLOC)
f8b76e70 323 {
379dd965
FF
324 if (sym -> flags & BSF_GLOBAL)
325 {
90141f9c 326 if (sym -> section -> flags & SEC_LOAD)
379dd965
FF
327 {
328 ms_type = mst_data;
329 }
330 else
331 {
332 ms_type = mst_bss;
333 }
334 }
6c8f91a1 335 else if (sym -> flags & BSF_LOCAL)
379dd965 336 {
6c8f91a1
FF
337 /* Named Local variable in a Data section. Check its
338 name for stabs-in-elf. The STREQ macro checks the
339 first character inline, so we only actually do a
340 strcmp function call on names that start with 'B'
341 or 'D' */
342 index = SECT_OFF_MAX;
343 if (STREQ ("Bbss.bss", sym -> name))
344 {
345 index = SECT_OFF_BSS;
346 }
347 else if (STREQ ("Ddata.data", sym -> name))
348 {
349 index = SECT_OFF_DATA;
350 }
351 else if (STREQ ("Drodata.rodata", sym -> name))
352 {
353 index = SECT_OFF_RODATA;
354 }
355 if (index != SECT_OFF_MAX)
356 {
357 /* Found a special local symbol. Allocate a
358 sectinfo, if needed, and fill it in. */
359 if (sectinfo == NULL)
360 {
361 sectinfo = (struct stab_section_info *)
362 xmmalloc (objfile -> md, sizeof (*sectinfo));
363 memset ((PTR) sectinfo, 0, sizeof (*sectinfo));
364 if (filesym == NULL)
365 {
366 complain (&section_info_complaint,
367 sym -> name);
368 }
369 else
370 {
371 sectinfo -> filename =
372 (char *) filesym -> name;
373 }
374 }
375 if (sectinfo -> sections[index] != 0)
376 {
377 complain (&section_info_dup_complaint,
378 sectinfo -> filename);
379 }
380 /* Bfd symbols are section relative. */
381 symaddr = sym -> value + sym -> section -> vma;
382 /* Relocate non-absolute symbols by base address. */
383 if (sym -> section != &bfd_abs_section)
384 {
385 symaddr += addr;
386 }
387 sectinfo -> sections[index] = symaddr;
388 /* The special local symbols don't go in the
389 minimal symbol table, so ignore this one. */
390 continue;
391 }
392 /* Not a special stabs-in-elf symbol, do regular
393 symbol processing. */
90141f9c 394 if (sym -> section -> flags & SEC_LOAD)
379dd965
FF
395 {
396 ms_type = mst_file_data;
397 }
398 else
399 {
400 ms_type = mst_file_bss;
401 }
402 }
6c8f91a1
FF
403 else
404 {
405 ms_type = mst_unknown;
406 }
f8b76e70
FF
407 }
408 else
409 {
4c7c6bab
JG
410 /* FIXME: Solaris2 shared libraries include lots of
411 odd "absolute" and "undefined" symbols, that play
412 hob with actions like finding what function the PC
379dd965 413 is in. Ignore them if they aren't text, data, or bss. */
4c7c6bab
JG
414 /* ms_type = mst_unknown; */
415 continue; /* Skip this symbol. */
f8b76e70 416 }
346168a2 417 /* Pass symbol size field in via BFD. FIXME!!! */
538b2068 418 size = ((elf_symbol_type *) sym) -> internal_elf_sym.st_size;
6c8f91a1
FF
419 record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
420 ms_type, (PTR) size, objfile);
2670f34d 421 }
a7446af6
FF
422 }
423 do_cleanups (back_to);
424 }
425}
426
35f5886e
FF
427/* Scan and build partial symbols for a symbol file.
428 We have been initialized by a call to elf_symfile_init, which
429 currently does nothing.
430
2670f34d
JG
431 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
432 in each section. We simplify it down to a single offset for all
433 symbols. FIXME.
35f5886e
FF
434
435 MAINLINE is true if we are reading the main symbol
436 table (as opposed to a shared lib or dynamically loaded file).
437
438 This function only does the minimum work necessary for letting the
439 user "name" things symbolically; it does not read the entire symtab.
440 Instead, it reads the external and static symbols and puts them in partial
441 symbol tables. When more extensive information is requested of a
442 file, the corresponding partial symbol table is mutated into a full
443 fledged symbol table by going back and reading the symbols
346168a2
JG
444 for real.
445
446 We look for sections with specific names, to tell us what debug
447 format to look for: FIXME!!!
448
449 dwarf_build_psymtabs() builds psymtabs for DWARF symbols;
450 elfstab_build_psymtabs() handles STABS symbols.
a7446af6
FF
451
452 Note that ELF files have a "minimal" symbol table, which looks a lot
453 like a COFF symbol table, but has only the minimal information necessary
346168a2
JG
454 for linking. We process this also, and use the information to
455 build gdb's minimal symbol table. This gives us some minimal debugging
456 capability even for files compiled without -g. */
35f5886e
FF
457
458static void
2670f34d 459elf_symfile_read (objfile, section_offsets, mainline)
80d68b1d 460 struct objfile *objfile;
2670f34d 461 struct section_offsets *section_offsets;
1ab3bf1b 462 int mainline;
35f5886e 463{
80d68b1d 464 bfd *abfd = objfile->obfd;
35f5886e 465 struct elfinfo ei;
a7446af6 466 struct cleanup *back_to;
346168a2 467 CORE_ADDR offset;
35f5886e 468
1ab3bf1b
JG
469 init_minimal_symbol_collection ();
470 back_to = make_cleanup (discard_minimal_symbols, 0);
a7446af6 471
2670f34d 472 memset ((char *) &ei, 0, sizeof (ei));
6b801388 473
2670f34d 474 /* Allocate struct to keep track of the symfile */
965a5c32 475 objfile->sym_stab_info = (PTR)
2670f34d 476 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
965a5c32 477 memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
2670f34d 478 make_cleanup (free_elfinfo, (PTR) objfile);
6b801388 479
2670f34d 480 /* Process the normal ELF symbol table first. This may write some
965a5c32 481 chain of info into the dbx_symfile_info in objfile->sym_stab_info,
2670f34d 482 which can later be used by elfstab_offset_sections. */
a7446af6 483
2670f34d
JG
484 /* FIXME, should take a section_offsets param, not just an offset. */
485 offset = ANOFFSET (section_offsets, 0);
346168a2 486 elf_symtab_read (abfd, offset, objfile);
a7446af6 487
346168a2 488 /* Now process debugging information, which is contained in
a7446af6
FF
489 special ELF sections. We first have to find them... */
490
1ab3bf1b 491 bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
35f5886e
FF
492 if (ei.dboffset && ei.lnoffset)
493 {
346168a2 494 /* DWARF sections */
d5931d79 495 dwarf_build_psymtabs (objfile,
2670f34d 496 section_offsets, mainline,
35f5886e 497 ei.dboffset, ei.dbsize,
d5931d79 498 ei.lnoffset, ei.lnsize);
35f5886e 499 }
346168a2
JG
500 if (ei.stabsect)
501 {
502 /* STABS sections */
503
504 /* FIXME: Sun didn't really know how to implement this well.
505 They made .stab sections that don't point to the .stabstr
506 section with the sh_link field. BFD doesn't make string table
507 sections visible to the caller. So we have to search the
508 ELF section table, not the BFD section table, for the string
509 table. */
2084a176 510 struct elf32_internal_shdr *elf_sect;
346168a2 511
872dd3fe 512 elf_sect = bfd_elf_find_section (abfd, ".stabstr");
346168a2
JG
513 if (elf_sect)
514 elfstab_build_psymtabs (objfile,
2670f34d 515 section_offsets,
346168a2
JG
516 mainline,
517 ei.stabsect->filepos, /* .stab offset */
518 bfd_get_section_size_before_reloc (ei.stabsect),/* .stab size */
d5931d79 519 (file_ptr) elf_sect->sh_offset, /* .stabstr offset */
346168a2
JG
520 elf_sect->sh_size); /* .stabstr size */
521 }
a7446af6 522
1ab3bf1b 523 if (!have_partial_symbols ())
35f5886e
FF
524 {
525 wrap_here ("");
526 printf_filtered ("(no debugging symbols found)...");
527 wrap_here ("");
528 }
a7446af6 529
1ab3bf1b
JG
530 /* Install any minimal symbols that have been collected as the current
531 minimal symbols for this objfile. */
532
80d68b1d 533 install_minimal_symbols (objfile);
1ab3bf1b 534
a7446af6 535 do_cleanups (back_to);
35f5886e
FF
536}
537
965a5c32 538/* This cleans up the objfile's sym_stab_info pointer, and the chain of
2670f34d
JG
539 stab_section_info's, that might be dangling from it. */
540
541static void
542free_elfinfo (objp)
543 PTR objp;
544{
545 struct objfile *objfile = (struct objfile *)objp;
546 struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
965a5c32 547 objfile->sym_stab_info;
2670f34d
JG
548 struct stab_section_info *ssi, *nssi;
549
550 ssi = dbxinfo->stab_section_info;
551 while (ssi)
552 {
553 nssi = ssi->next;
554 mfree (objfile->md, ssi);
555 ssi = nssi;
556 }
557
558 dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */
559}
560
561
35f5886e
FF
562/* Initialize anything that needs initializing when a completely new symbol
563 file is specified (not just adding some symbols from another file, e.g. a
564 shared library).
565
346168a2 566 We reinitialize buildsym, since we may be reading stabs from an ELF file. */
35f5886e
FF
567
568static void
be772100
JG
569elf_new_init (ignore)
570 struct objfile *ignore;
80d68b1d 571{
d07734e3 572 stabsread_new_init ();
80d68b1d
FF
573 buildsym_new_init ();
574}
575
576/* Perform any local cleanups required when we are done with a particular
577 objfile. I.E, we are in the process of discarding all symbol information
578 for an objfile, freeing up all memory held for it, and unlinking the
579 objfile struct from the global list of known objfiles. */
580
581static void
582elf_symfile_finish (objfile)
583 struct objfile *objfile;
35f5886e 584{
965a5c32 585 if (objfile -> sym_stab_info != NULL)
80d68b1d 586 {
965a5c32 587 mfree (objfile -> md, objfile -> sym_stab_info);
80d68b1d 588 }
35f5886e
FF
589}
590
591/* ELF specific initialization routine for reading symbols.
592
593 It is passed a pointer to a struct sym_fns which contains, among other
594 things, the BFD for the file whose symbols are being read, and a slot for
595 a pointer to "private data" which we can fill with goodies.
596
597 For now at least, we have nothing in particular to do, so this function is
598 just a stub. */
599
600static void
be772100
JG
601elf_symfile_init (ignore)
602 struct objfile *ignore;
35f5886e
FF
603{
604}
605
2670f34d
JG
606/* ELF specific parsing routine for section offsets.
607
608 Plain and simple for now. */
609
610static
611struct section_offsets *
612elf_symfile_offsets (objfile, addr)
613 struct objfile *objfile;
614 CORE_ADDR addr;
615{
616 struct section_offsets *section_offsets;
617 int i;
4d57c599
JK
618
619 objfile->num_sections = SECT_OFF_MAX;
2670f34d
JG
620 section_offsets = (struct section_offsets *)
621 obstack_alloc (&objfile -> psymbol_obstack,
4d57c599
JK
622 sizeof (struct section_offsets)
623 + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
2670f34d
JG
624
625 for (i = 0; i < SECT_OFF_MAX; i++)
626 ANOFFSET (section_offsets, i) = addr;
4d57c599 627
2670f34d
JG
628 return section_offsets;
629}
630\f
631/* When handling an ELF file that contains Sun STABS debug info,
632 some of the debug info is relative to the particular chunk of the
633 section that was generated in its individual .o file. E.g.
634 offsets to static variables are relative to the start of the data
635 segment *for that module before linking*. This information is
636 painfully squirreled away in the ELF symbol table as local symbols
637 with wierd names. Go get 'em when needed. */
638
639void
640elfstab_offset_sections (objfile, pst)
641 struct objfile *objfile;
642 struct partial_symtab *pst;
643{
644 char *filename = pst->filename;
645 struct dbx_symfile_info *dbx = (struct dbx_symfile_info *)
965a5c32 646 objfile->sym_stab_info;
2670f34d
JG
647 struct stab_section_info *maybe = dbx->stab_section_info;
648 struct stab_section_info *questionable = 0;
649 int i;
650 char *p;
651
652 /* The ELF symbol info doesn't include path names, so strip the path
653 (if any) from the psymtab filename. */
654 while (0 != (p = strchr (filename, '/')))
655 filename = p+1;
656
657 /* FIXME: This linear search could speed up significantly
658 if it was chained in the right order to match how we search it,
659 and if we unchained when we found a match. */
660 for (; maybe; maybe = maybe->next)
661 {
662 if (filename[0] == maybe->filename[0]
2e4964ad 663 && STREQ (filename, maybe->filename))
2670f34d
JG
664 {
665 /* We found a match. But there might be several source files
666 (from different directories) with the same name. */
667 if (0 == maybe->found)
668 break;
669 questionable = maybe; /* Might use it later. */
670 }
671 }
672
673 if (maybe == 0 && questionable != 0)
674 {
675 complain (&stab_info_questionable_complaint, filename);
676 maybe = questionable;
677 }
678
679 if (maybe)
680 {
681 /* Found it! Allocate a new psymtab struct, and fill it in. */
682 maybe->found++;
683 pst->section_offsets = (struct section_offsets *)
684 obstack_alloc (&objfile -> psymbol_obstack,
685 sizeof (struct section_offsets) +
686 sizeof (pst->section_offsets->offsets) * (SECT_OFF_MAX-1));
687
688 for (i = 0; i < SECT_OFF_MAX; i++)
689 ANOFFSET (pst->section_offsets, i) = maybe->sections[i];
690 return;
691 }
692
693 /* We were unable to find any offsets for this file. Complain. */
694 if (dbx->stab_section_info) /* If there *is* any info, */
695 complain (&stab_info_mismatch_complaint, filename);
696}
35f5886e 697\f
4d57c599 698/* Register that we are able to handle ELF object file formats. */
35f5886e 699
80d68b1d
FF
700static struct sym_fns elf_sym_fns =
701{
0eed42de 702 bfd_target_elf_flavour,
35f5886e
FF
703 elf_new_init, /* sym_new_init: init anything gbl to entire symtab */
704 elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */
705 elf_symfile_read, /* sym_read: read a symbol file into symtab */
80d68b1d 706 elf_symfile_finish, /* sym_finish: finished with file, cleanup */
2670f34d 707 elf_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
35f5886e
FF
708 NULL /* next: pointer to next struct sym_fns */
709};
710
711void
1ab3bf1b 712_initialize_elfread ()
35f5886e
FF
713{
714 add_symtab_fns (&elf_sym_fns);
715}
This page took 0.159044 seconds and 4 git commands to generate.