xcoffsolib.h: Use 'abfd' for bfd variables instead of 'bfd'.
Sun cc doesn't like variable names that match their typedef'd type.
+Fri Oct 8 15:54:06 1993 Fred Fish (fnf@deneb.cygnus.com)
+
+ * osfsolib.c, remote-sim.c, remote.c, solib.c, xcoffexec.c,
+ xcoffsolib.h: Use 'abfd' for bfd variables instead of 'bfd'.
+ Sun cc doesn't like variable names that match their typedef'd type.
+
Fri Oct 8 14:56:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* inflow.c: Remove unused includes of sys/param.h, etc.
struct section_table *sections;
struct section_table *sections_end;
struct section_table *textsection;
- bfd *bfd;
+ bfd *abfd;
};
static struct so_list *so_list_head; /* List of known shared objects */
scratch_pathname, bfd_errmsg (bfd_error));
}
/* Leave bfd open, core_xfer_memory and "info files" need it. */
- so -> bfd = abfd;
+ so -> abfd = abfd;
abfd -> cacheable = true;
if (!bfd_check_format (abfd, bfd_object))
{
free ((PTR)so_list_head -> sections);
}
- if (so_list_head -> bfd)
+ if (so_list_head -> abfd)
{
- bfd_filename = bfd_get_filename (so_list_head -> bfd);
- bfd_close (so_list_head -> bfd);
+ bfd_filename = bfd_get_filename (so_list_head -> abfd);
+ bfd_close (so_list_head -> abfd);
}
else
/* This happens for the executable on SVR4. */
* This is a utility routine that sim_load() can call to do the work.
* The result is 0 for success, non-zero for failure.
*
- * Eg: int sim_load (bfd *bfd, char *prog) { return sim_load_standard (bfd); }
+ * Eg: int sim_load (bfd *abfd, char *prog) { return sim_load_standard (abfd); }
*/
sim_load_standard (abfd)
#include "frame.h"
#include "regex.h"
#include "inferior.h"
+#include "language.h"
#define MAX_PATH_SIZE 256 /* FIXME: Should be dynamic */
#define BKPT_AT_SYMBOL 1
+#if defined (BKPT_AT_SYMBOL) && defined (SVR4_SHARED_LIBS)
static char *bkpt_names[] = {
#ifdef SOLIB_BKPT_NAME
SOLIB_BKPT_NAME, /* Prefer configured name if it exists. */
"main",
NULL
};
+#endif
/* local data declarations */
struct section_table *sections;
struct section_table *sections_end;
struct section_table *textsection;
- bfd *bfd;
+ bfd *abfd;
};
static struct so_list *so_list_head; /* List of known shared objects */
{
perror_with_name (filename);
}
- /* Leave scratch_pathname allocated. bfd->name will point to it. */
+ /* Leave scratch_pathname allocated. abfd->name will point to it. */
- abfd = bfd_fdopenr (scratch_pathname, NULL, scratch_chan);
+ abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
if (!abfd)
{
close (scratch_chan);
scratch_pathname, bfd_errmsg (bfd_error));
}
/* Leave bfd open, core_xfer_memory and "info files" need it. */
- so -> bfd = abfd;
+ so -> abfd = abfd;
abfd -> cacheable = true;
if (!bfd_check_format (abfd, bfd_object))
#ifndef SVR4_SHARED_LIBS
-/* This routine can be a real performance hog. According to some gprof data
- which mtranle@paris.IntelliCorp.COM (Minh Tran-Le) sent, almost all the
- time spend in solib_add (up to 20 minutes with 35 shared libraries) is
- spent here, with 5/6 in lookup_minimal_symbol and 1/6 in read_memory.
-
- Possible solutions:
-
- * Hash the minimal symbols.
+/* In GDB 4.9 this routine was a real performance hog. According to
+ some gprof data which mtranle@paris.IntelliCorp.COM (Minh Tran-Le)
+ sent, almost all the time spend in solib_add (up to 20 minutes with
+ 35 shared libraries) was spent here, with 5/6 in
+ lookup_minimal_symbol and 1/6 in read_memory.
- * Just record the name of the minimal symbol and lazily patch the
- addresses.
-
- * Tell everyone to switch to Solaris2.
-
-(1) Move the call to special_symbol_handling out of the find_solib
-loop in solib_add. This will call it once, rather than 35 times, when
-you have 35 shared libraries. It's in the loop to pass the current
-solib's objfile so the symbols are added to that objfile's minsym.
-But since the symbols are in common (BSS), it doesn't really matter
-which objfile's minsyms they are added to, I think.
-
-(2) Indeed, it might be best to create an objfile just for common minsyms,
-thus not needing any objfile argument to solib_add_common_symbols.
-
-(3) Remove the call to lookup_minimal_symbol from
-solib_add_common_symbols. If a symbol appears multiple times in the
-minsyms, we probably cope, more or less. Note that if we had an
-objfile for just minsyms, install_minimal_symbols would automatically
-remove duplicates caused by running solib_add_common_symbols several
-times.
-*/
+ To fix this, we moved the call to special_symbol_handling out of the
+ loop in solib_add, so this only gets called once, rather than once
+ for every shared library, and also removed the call to lookup_minimal_symbol
+ in this routine. */
static void
solib_add_common_symbols (rtc_symp, objfile)
name++;
}
+#if 0
+ /* I think this is unnecessary, GDB can probably deal with
+ duplicate minimal symbols, more or less. And the duplication
+ which used to happen because this was called for each shared
+ library is gone now that we are just called once. */
/* FIXME: Do we really want to exclude symbols which happen
to match symbols for other locations in the inferior's
address space, even when they are in different linkage units? */
if (lookup_minimal_symbol (name, (struct objfile *) NULL) == NULL)
+#endif
{
name = obsavestring (name, strlen (name),
&objfile -> symbol_obstack);
we have no way currently to find the filename. Don't gripe about
any problems we might have, just fail. */
- if ((interp_bfd = bfd_fdopenr ("unnamed", NULL, fd)) == NULL)
+ if ((interp_bfd = bfd_fdopenr ("unnamed", gnutarget, fd)) == NULL)
{
return (0);
}
struct target_ops *target;
{
register struct so_list *so = NULL; /* link map state variable */
+
+ /* Last shared library that we read. */
+ struct so_list *so_last = NULL;
+
char *re_err;
int count;
int old;
"Error while reading shared library symbols:\n",
RETURN_MASK_ALL))
{
- special_symbol_handling (so);
+ so_last = so;
so -> symbols_loaded = 1;
}
}
{
old = target -> to_sections_end - target -> to_sections;
target -> to_sections = (struct section_table *)
- realloc ((char *)target -> to_sections,
+ xrealloc ((char *)target -> to_sections,
(sizeof (struct section_table)) * (count + old));
}
else
{
old = 0;
target -> to_sections = (struct section_table *)
- malloc ((sizeof (struct section_table)) * count);
+ xmalloc ((sizeof (struct section_table)) * count);
}
target -> to_sections_end = target -> to_sections + (count + old);
}
}
}
+
+ /* Calling this once at the end means that we put all the minimal
+ symbols for commons into the objfile for the last shared library.
+ Since they are in common, this should not be a problem. If we
+ delete the objfile with the minimal symbols, we can put all the
+ symbols into a new objfile (and will on the next call to solib_add).
+
+ An alternate approach would be to create an objfile just for
+ common minsyms, thus not needing any objfile argument to
+ solib_add_common_symbols. */
+
+ if (so_last)
+ special_symbol_handling (so_last);
}
/*
"Shared Object Library");
header_done++;
}
- printf ("%-12s", local_hex_string_custom ((int) LM_ADDR (so), "08"));
- printf ("%-12s", local_hex_string_custom (so -> lmend, "08"));
+ printf ("%-12s",
+ local_hex_string_custom ((unsigned long) LM_ADDR (so),
+ "08l"));
+ printf ("%-12s",
+ local_hex_string_custom ((unsigned long) so -> lmend,
+ "08l"));
printf ("%-12s", so -> symbols_loaded ? "Yes" : "No");
printf ("%s\n", so -> so_name);
}
{
free ((PTR)so_list_head -> sections);
}
- if (so_list_head -> bfd)
+ if (so_list_head -> abfd)
{
- bfd_filename = bfd_get_filename (so_list_head -> bfd);
- bfd_close (so_list_head -> bfd);
+ bfd_filename = bfd_get_filename (so_list_head -> abfd);
+ bfd_close (so_list_head -> abfd);
}
else
/* This happens for the executable on SVR4. */
stop_signal = 0;
do
{
- target_resume (0, stop_signal);
+ target_resume (inferior_pid, 0, stop_signal);
wait_for_inferior ();
}
while (stop_signal != SIGTRAP);
add_vmap(ldi)
register struct ld_info *ldi;
{
- bfd *bfd, *last;
+ bfd *abfd, *last;
register char *mem, *objname;
struct objfile *obj;
struct vmap *vp;
if (ldi->ldinfo_fd < 0)
/* Note that this opens it once for every member; a possible
enhancement would be to only open it once for every object. */
- bfd = bfd_openr (objname, gnutarget);
+ abfd = bfd_openr (objname, gnutarget);
else
- bfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
- if (!bfd)
+ abfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
+ if (!abfd)
error("Could not open `%s' as an executable file: %s",
objname, bfd_errmsg(bfd_error));
/* make sure we have an object file */
- if (bfd_check_format(bfd, bfd_object))
- vp = map_vmap (bfd, 0);
+ if (bfd_check_format(abfd, bfd_object))
+ vp = map_vmap (abfd, 0);
- else if (bfd_check_format(bfd, bfd_archive)) {
+ else if (bfd_check_format(abfd, bfd_archive)) {
last = 0;
/*
* FIXME??? am I tossing BFDs? bfd?
*/
- while (last = bfd_openr_next_archived_file(bfd, last))
+ while (last = bfd_openr_next_archived_file(abfd, last))
if (STREQ(mem, last->filename))
break;
if (!last) {
- bfd_close(bfd);
+ bfd_close(abfd);
/* FIXME -- should be error */
- warning("\"%s\": member \"%s\" missing.", bfd->filename, mem);
+ warning("\"%s\": member \"%s\" missing.", abfd->filename, mem);
return;
}
goto obj_err;
}
- vp = map_vmap (last, bfd);
+ vp = map_vmap (last, abfd);
}
else {
obj_err:
- bfd_close(bfd);
+ bfd_close(abfd);
error ("\"%s\": not in executable format: %s.",
objname, bfd_errmsg(bfd_error));
/*NOTREACHED*/
}
- obj = allocate_objfile (vp->bfd, 0);
+ obj = allocate_objfile (vp->abfd, 0);
vp->objfile = obj;
#ifndef SOLIB_SYMBOLS_MANUAL
|| (memb[0] && !STREQ(memb, vp->member)))
continue;
- io = bfd_cache_lookup(vp->bfd); /* totally opaque! */
+ io = bfd_cache_lookup(vp->abfd); /* totally opaque! */
if (!io)
fatal("cannot find BFD's iostream for %s", vp->name);
if (p->endaddr >= memend)
{
/* Entire transfer is within this section. */
- res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
+ res = xfer_fn (p->abfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
return (res != false)? len: 0;
}
else if (p->endaddr <= memaddr)
{
/* This section overlaps the transfer. Just do half. */
len = p->endaddr - memaddr;
- res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
+ res = xfer_fn (p->abfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
return (res != false)? len: 0;
}
else if (p->addr < nextsectaddr)
if (info_verbose)
printf_filtered (" @ %s",
local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
- printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
- if (p->bfd != abfd) {
- printf_filtered (" in %s", bfd_get_filename (p->bfd));
+ printf_filtered (" is %s", bfd_section_name (p->abfd, p->sec_ptr));
+ if (p->abfd != abfd) {
+ printf_filtered (" in %s", bfd_get_filename (p->abfd));
}
printf_filtered ("\n");
}
for (vp = vmap; vp; vp = vp->nxt) {
if (!strncmp(secname
- , bfd_section_name(vp->bfd, vp->sex), seclen)
- && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
+ , bfd_section_name(vp->abfd, vp->sex), seclen)
+ && bfd_section_name(vp->abfd, vp->sex)[seclen] == '\0') {
offset = secaddr - vp->tstart;
vp->tstart += offset;
vp->tend += offset;
So for text sections, bfd_section_vma tends to be 0x200,
and if vp->tstart is 0xd0002000, then the first byte of
the text section on disk corresponds to address 0xd0002200. */
- stp->bfd = vp->bfd;
- stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
- stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
- stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
+ stp->abfd = vp->abfd;
+ stp->sec_ptr = bfd_get_section_by_name (stp->abfd, ".text");
+ stp->addr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->tstart;
+ stp->endaddr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->tend;
stp++;
- stp->bfd = vp->bfd;
- stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
- stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
- stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
+ stp->abfd = vp->abfd;
+ stp->sec_ptr = bfd_get_section_by_name (stp->abfd, ".data");
+ stp->addr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->dstart;
+ stp->endaddr = bfd_section_vma (stp->abfd, stp->sec_ptr) + vp->dend;
}
vmap_symtab (vp);
struct vmap {
struct vmap *nxt; /* ^ to next in chain */
- bfd *bfd; /* BFD for mappable object library */
+ bfd *abfd; /* BFD for mappable object library */
char *name; /* ^ to object file name */
char *member; /* ^ to member name */
CORE_ADDR tstart; /* virtual addr where member is mapped */