/* Data structures for RS/6000 shared libraries, for GDB.
   Copyright 1991, 1992, 1994, 1997 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

/* The vmap struct is used to describe the virtual address space of
   the target we are manipulating.  The first entry is always the "exec"
   file.  Subsequent entries correspond to other objects that are
   mapped into the address space of a process created from the "exec" file.
   These are either in response to exec()ing the file, in which case all
   shared libraries are loaded, or a "load" system call, followed by the
   user's issuance of a "load" command.  */

struct vmap
  {
    struct vmap *nxt;		/* ptr to next in chain                 */
    bfd *bfd;			/* BFD for mappable object library      */
    char *name;			/* ptr to object file name              */
    char *member;		/* ptr to member name                   */
    CORE_ADDR tstart;		/* virtual addr where member is mapped  */
    CORE_ADDR tend;		/* virtual upper bound of member        */
    CORE_ADDR tvma;		/* virtual addr of text section in object file */
    CORE_ADDR toffs;		/* offset of text section in object file */
    CORE_ADDR dstart;		/* virtual address of data start        */
    CORE_ADDR dend;		/* virtual address of data end          */
    CORE_ADDR dvma;		/* virtual addr of data section in object file */

    /* This is NULL for the exec-file.  */
    struct objfile *objfile;

    unsigned loaded:1;		/* True if symbols are loaded           */
    unsigned padding:15;
  };


struct vmap_and_bfd
  {
    bfd *pbfd;
    struct vmap *pvmap;
  };

extern struct vmap *vmap;

/* Hook for symbol table relocation at runtime. */

extern void (*xcoff_relocate_symtab_hook) PARAMS ((unsigned int));
