************************************************************************/
#include "defs.h"
-#include "elf/common.h"
-#include "elf/external.h"
-#include "elf/internal.h"
#include "bfd.h"
#include "libbfd.h" /* For bfd_elf_find_section */
+#include "libelf.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#include "gdb-stabs.h"
#include "complaints.h"
#include <string.h>
-
-#define STREQ(a,b) (strcmp((a),(b))==0)
+#include "demangle.h"
/* The struct elfinfo is available only during ELF symbol table and
psymtab reading. It is destroyed at the complation of psymtab-reading.
static struct section_offsets *
elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-#if 0
-static void
-record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type,
- struct objfile *));
-#endif
-
static void
record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
enum minimal_symbol_type, char *,
#endif
-/*
-
-LOCAL FUNCTION
-
- record_minimal_symbol -- add entry to minimal symbol table
-
-SYNOPSIS
-
- static void record_minimal_symbol (char *name, CORE_ADDR address)
-
-DESCRIPTION
-
- Given a pointer to the name of a symbol that should be added to the
- minimal symbol table and the address associated with that symbol, records
- this information for later use in building the minimal symbol table.
-
- */
-
-#if 0 /* FIXME: Unused */
-
-static void
-record_minimal_symbol (name, address, ms_type, objfile)
- char *name;
- CORE_ADDR address;
- enum minimal_symbol_type ms_type;
- struct objfile *objfile;
-{
- name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol (name, address, ms_type);
-}
-
-#endif
-
static void
record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
char *name;
struct objfile *objfile;
{
name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol_and_info (name, address, ms_type, info);
+ prim_record_minimal_symbol_and_info (name, address, ms_type, info, -1);
}
/*
if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
&& (sym -> section != NULL))
{
- symaddr = sym -> value;
+ /* Bfd symbols are section relative. */
+ symaddr = sym -> value + sym -> section -> vma;
/* Relocate all non-absolute symbols by base address. */
if (sym -> section != &bfd_abs_section)
symaddr += addr;
continue; /* Skip this symbol. */
}
/* Pass symbol size field in via BFD. FIXME!!! */
- record_minimal_symbol_and_info ((char *) sym -> name,
- symaddr, ms_type, sym->udata, objfile);
+ {
+ elf32_symbol_type *esym = (elf32_symbol_type *) sym;
+ unsigned long size = esym->internal_elf_sym.st_size;
+ record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
+ ms_type, (PTR) size, objfile);
+ }
}
/* See if this is a debugging symbol that helps Solaris
switch (sym->name[1])
{
case 'b':
- if (!strcmp ("Bbss.bss", sym->name))
+ if (STREQ ("Bbss.bss", sym->name))
index = SECT_OFF_BSS;
break;
case 'd':
- if (!strcmp ("Ddata.data", sym->name))
+ if (STREQ ("Ddata.data", sym->name))
index = SECT_OFF_DATA;
break;
case 'r':
- if (!strcmp ("Drodata.rodata", sym->name))
+ if (STREQ ("Drodata.rodata", sym->name))
index = SECT_OFF_RODATA;
break;
}
if (sectinfo->sections[index])
complain (§ion_info_dup_complaint, sectinfo->filename);
- symaddr = sym -> value;
+ /* Bfd symbols are section relative. */
+ symaddr = sym -> value + sym -> section -> vma;
/* Relocate all non-absolute symbols by base address. */
if (sym -> section != &bfd_abs_section)
symaddr += addr;
sections visible to the caller. So we have to search the
ELF section table, not the BFD section table, for the string
table. */
- struct elf_internal_shdr *elf_sect;
+ struct elf32_internal_shdr *elf_sect;
elf_sect = bfd_elf_find_section (abfd, ".stabstr");
if (elf_sect)
for (; maybe; maybe = maybe->next)
{
if (filename[0] == maybe->filename[0]
- && !strcmp (filename, maybe->filename))
+ && STREQ (filename, maybe->filename))
{
/* We found a match. But there might be several source files
(from different directories) with the same name. */