* bug in tracepoint protocol implementation
@ 2000-10-02 11:04 Josef Ezra
2000-10-02 11:20 ` Michael Snyder
0 siblings, 1 reply; 7+ messages in thread
From: Josef Ezra @ 2000-10-02 11:04 UTC (permalink / raw)
To: gdb-patches, shagam, sgordon
hi
file: tracepoint.c
function: stringify_collection_list
old:
count += strlen (end);
end += count ;
new:
count += strlen (end);
end = temp_buf + count ;
reasoning:
When saving more then one memrange parameter, the old code leaves 'gaps' in
the temp_buf string.
Looks like few are using gdb's tracepoints (otherwise this bug wouldn't
survive that long).
Josef Ezra
EMC2
jezra@emc.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: bug in tracepoint protocol implementation
2000-10-02 11:04 bug in tracepoint protocol implementation Josef Ezra
@ 2000-10-02 11:20 ` Michael Snyder
2000-10-03 10:29 ` Josef Ezra
[not found] ` <004e01c039d8$774c1d50$6c219fa8@lss.emc.com>
0 siblings, 2 replies; 7+ messages in thread
From: Michael Snyder @ 2000-10-02 11:20 UTC (permalink / raw)
To: Josef Ezra; +Cc: gdb-patches, shagam, sgordon
Josef Ezra wrote:
>
> hi
>
> file: tracepoint.c
> function: stringify_collection_list
>
> old:
> count += strlen (end);
> end += count ;
>
> new:
> count += strlen (end);
> end = temp_buf + count ;
>
> reasoning:
> When saving more then one memrange parameter, the old code
> leaves 'gaps' in the temp_buf string.
Josef,
Your change is correct (thank you). However, would you
please re-submit it after consulting the file "CONTRIBUTING"
in your gdb source directory? Or see:
http://sources.redhat.com/gdb/#contribute
Briefly, to streamline the process of accepting GDB
contributions, we request the following format:
* brief description of the problem being addressed
* ChangeLog entry
* Diff of the changes, such as will be acceptable
as input to "patch" (eg. "cvs diff -c3p tracepoint.c")
Hate to put you thru the exercise of resubmitting such a
simple patch, but it will be good experience if you intend
to make further GDB contributions (as I hope you will).
Thanks,
Michael Snyder
From jtc@redback.com Mon Oct 02 14:31:00 2000
From: jtc@redback.com (J.T. Conklin)
To: gdb-patches@sourceware.cygnus.com
Subject: [RFA]: Changes to move dcache above target vector functions.
Date: Mon, 02 Oct 2000 14:31:00 -0000
Message-id: <5md7hjnd5v.fsf@jtc.redback.com>
X-SW-Source: 2000-10/msg00011.html
Content-length: 35316
Early last month, I trolled for comments about the enclosed patch.
The only bite I got was about my suggestion that reset is a higher
level concept and probably deserves a separate command / target
function.
I'd seeking approval to commit the enclosed patch. It's the same as
the earlier one, except I "fixed" the problem with invalidating the
dcache in ocd.c's bdm_reset_command(). This was fixed by accessing
target_dcache in ocd.c. This is an abstraction layer violation, but
it seemed the most expedient way to handle the problem. Support for a
reset command would make this hack unnecessary. I'm open to changing
this if necessary.
--jtc
2000-10-02 J.T. Conklin <jtc@redback.com>
* monitor.c (#include "dcache.h"): Removed.
(remote_dcache): Removed.
(monitor_open): Removed code that created local dcache.
(flush_monitor_dcache): Removed (unused function).
(monitor_resume): Removed call to dcache_invd().
(monitor_load): Likewise.
(monitor_xfer_memory): Changed to call monitor_write_memory(),
monitor_write_memory_block(), and monitor_read_memory() instead
of dcache_xfer_memory().
* monitor.h (flush_monitor_dcache): Removed (unused function).
* ocd.c (#include "dcache.h"): Removed.
(ocd_dcache): Removed.
(ocd_open): Removed code that created local dcache.
(ocd_resume): Removed call to dcache_invd().
(ocd_xfer_memory): Changed to call ocd_write_bytes() and
ocd_read_bytes() instead of dcache_xfer_memory().
(bdm_reset_command): Invalidate target dcache.
* remote-bug.c (bug_load): Remove call to dcache_invd().
(bug_resume): Likewise.
(bug_settings): Remove dcache, readfunc, and writefunc fields
from initializer.
(bug_xfer_memory): Changed to call bug_read_memory() and
bug_write_memory() instead of dcache_xfer_memory().
* remote-nindy.c (#include "dcache.h"): Removed.
(nindy_dcache): Removed.
(nindy_open): Removed code that created local dcache.
(nindy_resume): Removed call to dcache_invd().
(nindy_load): Likewise.
(nindy_xfer_inferior_memory): Changed to call ninMemPut() and
ninMemGet() instead of dcache_xfer_memory().
* remote-sds.c (#include "dcache.h"): Removed.
(sds_dcache): Removed.
(sds_open): Removed code that created local dcache.
(sds_resume): Removed call to dcache_invd().
(sds_xfer_memory): Changed to call sds_write_bytes() and
sds_read_bytes() instead of dcache_xfer_memory().
* remote-utils.c (gr_open): Removed code that created local dcache.
* remote-utils.h (#include "dcache.h"): Removed.
(struct gr_settings): Removed dcache, readfunc, and writefunc fields.
(gr_get_dcache, gr_set_dcache): Removed macro definitions.
* remote.c (#include "dcache.h"): Removed.
(remote_dcache): Removed.
(remote_open_1): Removed code that created local dcache.
(remote_async_open_1): Likewise.
(remote_resume): Removed call to dcache_invd().
(remote_async_resume): Likewise.
(remote_xfer_memory): Changed to call remote_write_bytes() and
remote_read_bytes() instead of dcache_xfer_memory().
* wince.c (#include "dcache.h"): Removed.
(remote_dcache): Removed.
(child_create_inferior): Removed code that created local dcache.
(child_xfer_memory): Changed to call remote_write_bytes() and
remote_read_bytes() instead of dcache_xfer_memory().
(child_resume): Removed call to dcache_invd().
* target.c (target_dcache): Added.
(target_load): Invalidate target_dcache.
(do_xfer_memory): New function.
(target_xfer_memory): Reimplement in terms of dcache_xfer_memory().
(target_xfer_memory_partial): Likewise.
(initialize_targets): Create target_dcache.
* target.h (#include "dcache.h"): Added.
(target_open): Invalidate target_dcache.
(target_resume): Likewise.
(do_xfer_memory): New declaration.
* dcache.c (dcache_init): Removed reading and writing arguments.
(dcache_struct): Removed read_memory and write_memory fields.
(dcache_write_line): Call do_xfer_memory.
(dcache_read_line): Likewise.
(dcache_xfer_memory): Likewise.
(dcache_invalidate): Renamed from dcache_invd.
(dcache_init): Updated.
(dcache_xfer_memory): Updated.
* dcache.h (memxferfunc): Removed definition.
(dcache_init): Removed reading and writing arguments.
Index: dcache.c
===================================================================
RCS file: /cvs/src/src/gdb/dcache.c,v
retrieving revision 1.9
diff -c -r1.9 dcache.c
*** dcache.c 2000/09/01 00:12:10 1.9
--- dcache.c 2000/10/02 21:04:18
***************
*** 1,8 ****
! /* Caching code. Typically used by remote back ends for
! caching remote memory.
- Copyright 1992-1993, 1995, 1998-1999 Free Software Foundation, Inc.
-
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
--- 1,6 ----
! /* Caching code.
! Copyright 1992-1993, 1995, 1998-1999, 2000 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
***************
*** 25,30 ****
--- 23,29 ----
#include "gdbcmd.h"
#include "gdb_string.h"
#include "gdbcore.h"
+ #include "target.h"
/*
The data cache could lead to incorrect results because it doesn't know
***************
*** 126,137 ****
struct dcache_struct
{
- /* Function to actually read the target memory. */
- memxferfunc read_memory;
-
- /* Function to actually write the target memory */
- memxferfunc write_memory;
-
/* free list */
struct dcache_block *free_head;
struct dcache_block *free_tail;
--- 125,130 ----
***************
*** 175,181 ****
/* Free all the data cache blocks, thus discarding all cached data. */
void
! dcache_invd (DCACHE *dcache)
{
int i;
dcache->valid_head = 0;
--- 168,174 ----
/* Free all the data cache blocks, thus discarding all cached data. */
void
! dcache_invalidate (DCACHE *dcache)
{
int i;
dcache->valid_head = 0;
***************
*** 250,259 ****
int done = 0;
while (done < len)
{
! int t = dcache->write_memory (db->addr + s + done,
! db->data + s + done,
! len - done);
! if (t == 0)
return 0;
done += t;
}
--- 243,252 ----
int done = 0;
while (done < len)
{
! int t = do_xfer_memory (db->addr + s + done,
! db->data + s + done,
! len - done, 1);
! if (t <= 0)
return 0;
done += t;
}
***************
*** 267,273 ****
return 1;
}
-
/* Read cache line */
static int
dcache_read_line (DCACHE *dcache, struct dcache_block *db)
--- 260,265 ----
***************
*** 291,298 ****
while (len > 0)
{
! res = (*dcache->read_memory) (memaddr, myaddr, len);
! if (res == 0)
return 0;
memaddr += res;
--- 283,290 ----
while (len > 0)
{
! res = do_xfer_memory (memaddr, myaddr, len, 0);
! if (res <= 0)
return 0;
memaddr += res;
***************
*** 420,438 ****
/* Initialize the data cache. */
DCACHE *
! dcache_init (memxferfunc reading, memxferfunc writing)
{
int csize = sizeof (struct dcache_block) * DCACHE_SIZE;
DCACHE *dcache;
dcache = (DCACHE *) xmalloc (sizeof (*dcache));
- dcache->read_memory = reading;
- dcache->write_memory = writing;
dcache->the_cache = (struct dcache_block *) xmalloc (csize);
memset (dcache->the_cache, 0, csize);
! dcache_invd (dcache);
last_cache = dcache;
return dcache;
--- 412,428 ----
/* Initialize the data cache. */
DCACHE *
! dcache_init (void)
{
int csize = sizeof (struct dcache_block) * DCACHE_SIZE;
DCACHE *dcache;
dcache = (DCACHE *) xmalloc (sizeof (*dcache));
dcache->the_cache = (struct dcache_block *) xmalloc (csize);
memset (dcache->the_cache, 0, csize);
! dcache_invalidate (dcache);
last_cache = dcache;
return dcache;
***************
*** 481,493 ****
}
else
{
- memxferfunc xfunc;
- xfunc = should_write ? dcache->write_memory : dcache->read_memory;
-
if (dcache->cache_has_stuff)
! dcache_invd (dcache);
! len = xfunc (memaddr, myaddr, len);
}
return len;
}
--- 471,480 ----
}
else
{
if (dcache->cache_has_stuff)
! dcache_invalidate (dcache);
! len = do_xfer_memory(memaddr, myaddr, len, should_write);
}
return len;
}
Index: dcache.h
===================================================================
RCS file: /cvs/src/src/gdb/dcache.h,v
retrieving revision 1.5
diff -c -r1.5 dcache.h
*** dcache.h 2000/08/18 22:52:22 1.5
--- dcache.h 2000/10/02 21:04:18
***************
*** 23,44 ****
#ifndef DCACHE_H
#define DCACHE_H
- typedef int (*memxferfunc) (CORE_ADDR memaddr, char *myaddr, int len);
-
typedef struct dcache_struct DCACHE;
/* Invalidate DCACHE. */
! void dcache_invd (DCACHE * dcache);
/* Initialize DCACHE. */
! DCACHE *dcache_init (memxferfunc reading, memxferfunc writing);
/* Free a DCACHE */
void dcache_free (DCACHE *);
/* Simple to call from <remote>_xfer_memory */
! int dcache_xfer_memory (DCACHE * cache, CORE_ADDR mem, char *my, int len,
int should_write);
/* Turn dcache state on or off */
--- 23,42 ----
#ifndef DCACHE_H
#define DCACHE_H
typedef struct dcache_struct DCACHE;
/* Invalidate DCACHE. */
! void dcache_invalidate (DCACHE *dcache);
/* Initialize DCACHE. */
! DCACHE *dcache_init (void);
/* Free a DCACHE */
void dcache_free (DCACHE *);
/* Simple to call from <remote>_xfer_memory */
! int dcache_xfer_memory (DCACHE *cache, CORE_ADDR mem, char *my, int len,
int should_write);
/* Turn dcache state on or off */
Index: monitor.c
===================================================================
RCS file: /cvs/src/src/gdb/monitor.c,v
retrieving revision 1.12
diff -c -r1.12 monitor.c
*** monitor.c 2000/09/24 04:42:12 1.12
--- monitor.c 2000/10/02 21:04:26
***************
*** 51,57 ****
#include "gdbcmd.h"
#include "inferior.h"
#include "gdb_regex.h"
- #include "dcache.h"
#include "srec.h"
static char *dev_name;
--- 51,56 ----
***************
*** 130,136 ****
static int dump_reg_flag; /* Non-zero means do a dump_registers cmd when
monitor_wait wakes up. */
- static DCACHE *remote_dcache;
static int first_time = 0; /* is this the first time we're executing after
gaving created the child proccess? */
--- 129,134 ----
***************
*** 838,852 ****
monitor_printf (current_monitor->line_term);
- if (remote_dcache)
- dcache_free (remote_dcache);
-
- if (current_monitor->flags & MO_HAS_BLOCKWRITES)
- remote_dcache = dcache_init (monitor_read_memory,
- monitor_write_memory_block);
- else
- remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
-
start_remote ();
}
--- 836,841 ----
***************
*** 929,940 ****
/* Tell the remote machine to resume. */
- void
- flush_monitor_dcache (void)
- {
- dcache_invd (remote_dcache);
- }
-
static void
monitor_resume (int pid, int step, enum target_signal sig)
{
--- 918,923 ----
***************
*** 948,954 ****
dump_reg_flag = 1;
return;
}
- dcache_invd (remote_dcache);
if (step)
monitor_printf (current_monitor->step);
else
--- 931,936 ----
***************
*** 2008,2014 ****
monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
struct target_ops *target)
{
! return dcache_xfer_memory (remote_dcache, memaddr, myaddr, len, write);
}
static void
--- 1990,2010 ----
monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
struct target_ops *target)
{
! int res;
!
! if (write)
! {
! if (current_monitor->flags & MO_HAS_BLOCKWRITES)
! res = monitor_write_memory_block(memaddr, myaddr, len);
! else
! res = monitor_write_memory(memaddr, myaddr, len);
! }
! else
! {
! res = monitor_read_memory(memaddr, myaddr, len);
! }
!
! return res;
}
static void
***************
*** 2145,2151 ****
static void
monitor_load (char *file, int from_tty)
{
- dcache_invd (remote_dcache);
monitor_debug ("MON load\n");
if (current_monitor->load_routine)
--- 2141,2146 ----
Index: monitor.h
===================================================================
RCS file: /cvs/src/src/gdb/monitor.h,v
retrieving revision 1.4
diff -c -r1.4 monitor.h
*** monitor.h 2000/06/10 01:32:12 1.4
--- monitor.h 2000/10/02 21:04:27
***************
*** 246,249 ****
extern char *monitor_get_dev_name (void);
extern void init_monitor_ops (struct target_ops *);
extern int monitor_dump_reg_block (char *dump_cmd);
- extern void flush_monitor_dcache (void);
--- 246,248 ----
Index: ocd.c
===================================================================
RCS file: /cvs/src/src/gdb/ocd.c,v
retrieving revision 1.9
diff -c -r1.9 ocd.c
*** ocd.c 2000/09/26 04:27:59 1.9
--- ocd.c 2000/10/02 21:04:30
***************
*** 31,37 ****
#include "gdbcmd.h"
#include "objfiles.h"
#include "gdb-stabs.h"
- #include "dcache.h"
#include <sys/types.h>
#include <signal.h>
#include "serial.h"
--- 31,36 ----
***************
*** 273,280 ****
/* Open a connection to a remote debugger.
NAME is the filename used for communication. */
- static DCACHE *ocd_dcache;
-
void
ocd_open (char *name, int from_tty, enum ocd_target_type target_type,
struct target_ops *ops)
--- 272,277 ----
***************
*** 292,302 ****
unpush_target (current_ops);
- if (!ocd_dcache)
- ocd_dcache = dcache_init (ocd_read_bytes, ocd_write_bytes);
- else
- dcache_invd (ocd_dcache);
-
if (strncmp (name, "wiggler", 7) == 0)
{
ocd_desc = SERIAL_OPEN ("ocd");
--- 289,294 ----
***************
*** 387,394 ****
{
int pktlen;
- dcache_invd (ocd_dcache);
-
if (step)
ocd_do_command (OCD_STEP, &last_run_status, &pktlen);
else
--- 379,384 ----
***************
*** 772,778 ****
ocd_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int should_write,
struct target_ops *target)
{
! return dcache_xfer_memory (ocd_dcache, memaddr, myaddr, len, should_write);
}
\f
void
--- 762,775 ----
ocd_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int should_write,
struct target_ops *target)
{
! int res;
!
! if (should_write)
! res = ocd_write_bytes (memaddr, myaddr, len);
! else
! res = ocd_read_bytes (memaddr, myaddr, len);
!
! return res;
}
\f
void
***************
*** 1315,1321 ****
error ("Not connected to OCD device.");
ocd_do_command (OCD_RESET, &status, &pktlen);
! dcache_invd (ocd_dcache);
registers_changed ();
}
--- 1312,1318 ----
error ("Not connected to OCD device.");
ocd_do_command (OCD_RESET, &status, &pktlen);
! dcache_invalidate (target_dcache);
registers_changed ();
}
Index: remote-bug.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-bug.c,v
retrieving revision 1.6
diff -c -r1.6 remote-bug.c
*** remote-bug.c 2000/08/18 22:52:22 1.6
--- remote-bug.c 2000/10/02 21:04:31
***************
*** 119,125 ****
sr_check_open ();
- dcache_invd (gr_get_dcache ());
inferior_pid = 0;
abfd = bfd_openr (args, 0);
if (!abfd)
--- 119,124 ----
***************
*** 198,209 ****
static struct gr_settings bug_settings =
{
- NULL, /* dcache */
"Bug>", /* prompt */
&bug_ops, /* ops */
bug_clear_breakpoints, /* clear_all_breakpoints */
- bug_read_memory, /* readfunc */
- bug_write_memory, /* writefunc */
gr_generic_checkin, /* checkin */
};
--- 197,205 ----
***************
*** 242,249 ****
void
bug_resume (int pid, int step, enum target_signal sig)
{
- dcache_invd (gr_get_dcache ());
-
if (step)
{
sr_write_cr ("t");
--- 238,243 ----
***************
*** 561,570 ****
int write;
struct target_ops *target; /* ignored */
{
if (len <= 0)
return 0;
! return dcache_xfer_memory (gr_get_dcache (), memaddr, myaddr, len, write);
}
static void
--- 555,571 ----
int write;
struct target_ops *target; /* ignored */
{
+ int res;
+
if (len <= 0)
return 0;
+
+ if (write)
+ res = bug_write_memory (memaddr, myaddr, len);
+ else
+ res = bug_read_memory (memaddr, myaddr, len);
! return res;
}
static void
Index: remote-nindy.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-nindy.c,v
retrieving revision 1.7
diff -c -r1.7 remote-nindy.c
*** remote-nindy.c 2000/08/18 22:52:23 1.7
--- remote-nindy.c 2000/10/02 21:04:32
***************
*** 115,126 ****
#include "serial.h"
#include "nindy-share/env.h"
#include "nindy-share/stop.h"
-
- #include "dcache.h"
#include "remote-utils.h"
- static DCACHE *nindy_dcache;
-
extern int unlink ();
extern char *getenv ();
extern char *mktemp ();
--- 115,122 ----
***************
*** 188,198 ****
have_regs = regs_changed = 0;
- if (!nindy_dcache)
- nindy_dcache = dcache_init (ninMemGet, ninMemPut);
- else
- dcache_invd (nindy_dcache);
-
/* Allow user to interrupt the following -- we could hang if there's
no NINDY at the other end of the remote tty. */
immediate_quit++;
--- 184,189 ----
***************
*** 269,275 ****
if (siggnal != TARGET_SIGNAL_0 && siggnal != stop_signal)
warning ("Can't send signals to remote NINDY targets.");
- dcache_invd (nindy_dcache);
if (regs_changed)
{
nindy_store_registers (-1);
--- 260,265 ----
***************
*** 492,501 ****
int should_write;
struct target_ops *target; /* ignored */
{
if (len <= 0)
return 0;
! return dcache_xfer_memory (nindy_dcache, memaddr, myaddr,
! len, should_write);
}
\f
static void
--- 482,498 ----
int should_write;
struct target_ops *target; /* ignored */
{
+ int res;
+
if (len <= 0)
return 0;
!
! if (should_write)
! res = ninMemPut (memaddr, myaddr, len);
! else
! res = ninMemGet (memaddr, myaddr, len);
!
! return res;
}
\f
static void
***************
*** 614,621 ****
}
}
bfd_close (file);
-
- dcache_invd(nindy_dcache);
}
static int
--- 611,616 ----
Index: remote-sds.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-sds.c,v
retrieving revision 1.7
diff -c -r1.7 remote-sds.c
*** remote-sds.c 2000/09/01 00:12:10 1.7
--- remote-sds.c 2000/10/02 21:04:34
***************
*** 37,43 ****
#include "gdb-stabs.h"
#include "gdbthread.h"
#include "gdbcore.h"
- #include "dcache.h"
#ifdef USG
#include <sys/types.h>
--- 37,42 ----
***************
*** 190,197 ****
/* Open a connection to a remote debugger.
NAME is the filename used for communication. */
- static DCACHE *sds_dcache;
-
static void
sds_open (char *name, int from_tty)
{
--- 189,194 ----
***************
*** 203,213 ****
unpush_target (&sds_ops);
- if (!sds_dcache)
- sds_dcache = dcache_init (sds_read_bytes, sds_write_bytes);
- else
- dcache_invd (sds_dcache);
-
sds_desc = SERIAL_OPEN (name);
if (!sds_desc)
perror_with_name (name);
--- 200,205 ----
***************
*** 358,365 ****
{
unsigned char buf[PBUFSIZ];
- dcache_invd (sds_dcache);
-
last_sent_signal = siggnal;
last_sent_step = step;
--- 350,355 ----
***************
*** 673,679 ****
int should_write;
struct target_ops *target; /* ignored */
{
! return dcache_xfer_memory (sds_dcache, memaddr, myaddr, len, should_write);
}
\f
--- 663,676 ----
int should_write;
struct target_ops *target; /* ignored */
{
! int res;
!
! if (should_write)
! res = sds_write_bytes (memaddr, myaddr, len);
! else
! res = sds_read_bytes (memaddr, myaddr, len);
!
! return res;
}
\f
Index: remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-utils.c,v
retrieving revision 1.7
diff -c -r1.7 remote-utils.c
*** remote-utils.c 2000/09/01 00:12:10 1.7
--- remote-utils.c 2000/10/02 21:04:34
***************
*** 154,171 ****
void
gr_open (char *args, int from_tty, struct gr_settings *gr)
{
- DCACHE *dcache;
-
target_preopen (from_tty);
sr_scan_args (gr->ops->to_shortname, args);
unpush_target (gr->ops);
gr_settings = gr;
-
- if ((dcache = gr_get_dcache()) == NULL)
- gr_set_dcache (dcache_init (gr->readfunc, gr->writefunc));
- else
- dcache_invd (dcache);
if (sr_get_desc () != NULL)
gr_close (0);
--- 154,164 ----
Index: remote-utils.h
===================================================================
RCS file: /cvs/src/src/gdb/remote-utils.h,v
retrieving revision 1.4
diff -c -r1.4 remote-utils.h
*** remote-utils.h 2000/06/19 18:59:07 1.4
--- remote-utils.h 2000/10/02 21:04:35
***************
*** 24,30 ****
#include "serial.h"
#include "target.h"
- #include "dcache.h"
/* Stuff that should be shared (and handled consistently) among the various
remote targets. */
--- 24,29 ----
***************
*** 73,93 ****
struct gr_settings
{
- /* This is our data cache. */
- DCACHE *dcache;
char *prompt;
struct target_ops *ops;
int (*clear_all_breakpoints) (void);
- memxferfunc readfunc;
- memxferfunc writefunc;
void (*checkin) (void);
};
extern struct gr_settings *gr_settings;
-
- /* get and set dcache. */
- #define gr_get_dcache() (gr_settings->dcache)
- #define gr_set_dcache(newval) (gr_settings->dcache = (newval))
/* get and set prompt. */
#define gr_get_prompt() (gr_settings->prompt)
--- 72,84 ----
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.23
diff -c -r1.23 remote.c
*** remote.c 2000/09/01 00:12:10 1.23
--- remote.c 2000/10/02 21:04:41
***************
*** 37,44 ****
#include "gdbthread.h"
#include "remote.h"
- #include "dcache.h"
-
#include <ctype.h>
#include <sys/time.h>
#ifdef USG
--- 37,42 ----
***************
*** 2027,2034 ****
/* Generic code for opening a connection to a remote target. */
- static DCACHE *remote_dcache;
-
static void
init_all_packet_configs (void)
{
--- 2025,2030 ----
***************
*** 2057,2067 ****
unpush_target (target);
- if (!remote_dcache)
- remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
- else
- dcache_invd (remote_dcache);
-
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
perror_with_name (name);
--- 2053,2058 ----
***************
*** 2140,2147 ****
unpush_target (target);
- remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
-
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
perror_with_name (name);
--- 2131,2136 ----
***************
*** 2309,2316 ****
else
set_thread (pid, 0); /* run this thread */
- dcache_invd (remote_dcache);
-
last_sent_signal = siggnal;
last_sent_step = step;
--- 2298,2303 ----
***************
*** 2343,2350 ****
else
set_thread (pid, 0); /* run this thread */
- dcache_invd (remote_dcache);
-
last_sent_signal = siggnal;
last_sent_step = step;
--- 2330,2335 ----
***************
*** 3559,3570 ****
{
CORE_ADDR targ_addr;
int targ_len;
REMOTE_TRANSLATE_XFER_ADDRESS (mem_addr, mem_len, &targ_addr, &targ_len);
if (targ_len <= 0)
return 0;
! return dcache_xfer_memory (remote_dcache, targ_addr, buffer,
! targ_len, should_write);
}
--- 3544,3561 ----
{
CORE_ADDR targ_addr;
int targ_len;
+ int res;
+
REMOTE_TRANSLATE_XFER_ADDRESS (mem_addr, mem_len, &targ_addr, &targ_len);
if (targ_len <= 0)
return 0;
+
+ if (should_write)
+ res = remote_write_bytes (targ_addr, buffer, targ_len);
+ else
+ res = remote_read_bytes (targ_addr, buffer, targ_len);
! return res;
}
***************
*** 5049,5059 ****
target_preopen (from_tty);
unpush_target (&remote_cisco_ops);
-
- if (!remote_dcache)
- remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
- else
- dcache_invd (remote_dcache);
remote_desc = SERIAL_OPEN (name);
if (!remote_desc)
--- 5040,5045 ----
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.11
diff -c -r1.11 target.c
*** target.c 2000/09/28 07:48:14 1.11
--- target.c 2000/10/02 21:04:44
***************
*** 31,36 ****
--- 31,37 ----
#include "symfile.h"
#include "objfiles.h"
#include "gdb_wait.h"
+ #include "dcache.h"
#include <signal.h>
extern int errno;
***************
*** 177,182 ****
--- 178,185 ----
static void setup_target_debug (void);
+ DCACHE *target_dcache;
+
/* The user just typed 'target' without the name of a target. */
/* ARGSUSED */
***************
*** 229,234 ****
--- 232,238 ----
void
target_load (char *arg, int from_tty)
{
+ dcache_invalidate (target_dcache);
(*current_target.to_load) (arg, from_tty);
}
***************
*** 843,853 ****
Result is 0 or errno value. */
! static int
! target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
{
- int curlen;
int res;
struct target_ops *t;
struct target_stack_item *item;
--- 847,857 ----
Result is 0 or errno value. */
! int
! do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
{
int res;
+ int done = 0;
struct target_ops *t;
struct target_stack_item *item;
***************
*** 863,884 ****
res = current_target.to_xfer_memory
(memaddr, myaddr, len, write, ¤t_target);
if (res == len)
! return 0;
if (res > 0)
goto bump;
/* If res <= 0 then we call it again in the loop. Ah well. */
! for (; len > 0;)
{
- curlen = len; /* Want to do it all */
for (item = target_stack; item; item = item->next)
{
t = item->target_ops;
if (!t->to_has_memory)
continue;
! res = t->to_xfer_memory (memaddr, myaddr, curlen, write, t);
if (res > 0)
break; /* Handled all or part of xfer */
if (t->to_has_all_memory)
--- 867,887 ----
res = current_target.to_xfer_memory
(memaddr, myaddr, len, write, ¤t_target);
if (res == len)
! return len;
if (res > 0)
goto bump;
/* If res <= 0 then we call it again in the loop. Ah well. */
! while (len > 0)
{
for (item = target_stack; item; item = item->next)
{
t = item->target_ops;
if (!t->to_has_memory)
continue;
! res = t->to_xfer_memory (memaddr, myaddr, len, write, t);
if (res > 0)
break; /* Handled all or part of xfer */
if (t->to_has_all_memory)
***************
*** 887,892 ****
--- 890,923 ----
if (res <= 0)
{
+ return -1;
+ }
+ bump:
+ done += res;
+ memaddr += res;
+ myaddr += res;
+ len -= res;
+ }
+
+ return done;
+ }
+
+ static int
+ target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
+ {
+ int res;
+
+ /* Zero length requests are ok and require no work. */
+ if (len == 0)
+ {
+ return 0;
+ }
+
+ while (len > 0)
+ {
+ res = dcache_xfer_memory(target_dcache, memaddr, myaddr, len, write);
+ if (res <= 0)
+ {
/* If this address is for nonexistent memory,
read zeros if reading, or do nothing if writing. Return error. */
if (!write)
***************
*** 896,906 ****
else
return errno;
}
! bump:
memaddr += res;
! myaddr += res;
! len -= res;
}
return 0; /* We managed to cover it all somehow. */
}
--- 927,938 ----
else
return errno;
}
!
memaddr += res;
! myaddr += res;
! len -= res;
}
+
return 0; /* We managed to cover it all somehow. */
}
***************
*** 908,914 ****
/* Perform a partial memory transfer. */
static int
! target_xfer_memory_partial (CORE_ADDR memaddr, char *buf, int len,
int write_p, int *err)
{
int res;
--- 940,946 ----
/* Perform a partial memory transfer. */
static int
! target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
int write_p, int *err)
{
int res;
***************
*** 924,965 ****
return 0;
}
! /* The quick case is that the top target does it all. */
! res = current_target.to_xfer_memory (memaddr, buf, len, write_p, ¤t_target);
! if (res > 0)
{
! *err = 0;
! return res;
! }
!
! /* xfer memory doesn't always reliably set errno. */
! errno = 0;
! /* Try all levels of the target stack to see one can handle it. */
! for (item = target_stack; item; item = item->next)
! {
! t = item->target_ops;
! if (!t->to_has_memory)
! continue;
! res = t->to_xfer_memory (memaddr, buf, len, write_p, t);
! if (res > 0)
! {
! /* Handled all or part of xfer */
! *err = 0;
! return res;
! }
! if (t->to_has_all_memory)
! break;
}
! /* Total failure. Return error. */
! if (errno != 0)
! {
! *err = errno;
! return -1;
! }
! *err = EIO;
! return -1;
}
int
--- 956,974 ----
return 0;
}
! res = dcache_xfer_memory (target_dcache, memaddr, myaddr, len, write_p);
! if (res <= 0)
{
! if (errno != 0)
! *err = errno;
! else
! *err = EIO;
! return -1;
}
! *err = 0;
! return 0;
}
int
***************
*** 2916,2921 ****
--- 2925,2932 ----
add_com ("monitor", class_obscure, do_monitor_command,
"Send a command to the remote monitor (remote targets only).");
+
+ target_dcache = dcache_init();
if (!STREQ (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC"))
abort ();
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.7
diff -c -r1.7 target.h
*** target.h 2000/09/02 00:12:17 1.7
--- target.h 2000/10/02 21:04:46
***************
*** 43,48 ****
--- 43,49 ----
#include "bfd.h"
#include "symtab.h"
+ #include "dcache.h"
enum strata
{
***************
*** 487,494 ****
and (if successful) pushes a new target onto the stack.
Targets should supply this routine, if only to provide an error message. */
! #define target_open(name, from_tty) \
! (*current_target.to_open) (name, from_tty)
/* Does whatever cleanup is required for a target that we are no longer
going to be calling. Argument says whether we are quitting gdb and
--- 488,498 ----
and (if successful) pushes a new target onto the stack.
Targets should supply this routine, if only to provide an error message. */
! #define target_open(name, from_tty) \
! do { \
! dcache_invalidate (target_dcache); \
! (*current_target.to_open) (name, from_tty); \
! } while (0)
/* Does whatever cleanup is required for a target that we are no longer
going to be calling. Argument says whether we are quitting gdb and
***************
*** 560,567 ****
the target, or TARGET_SIGNAL_0 for no signal. The caller may not
pass TARGET_SIGNAL_DEFAULT. */
! #define target_resume(pid, step, siggnal) \
! (*current_target.to_resume) (pid, step, siggnal)
/* Wait for process pid to do something. Pid = -1 to wait for any pid
to do something. Return pid of child, or -1 in case of error;
--- 564,574 ----
the target, or TARGET_SIGNAL_0 for no signal. The caller may not
pass TARGET_SIGNAL_DEFAULT. */
! #define target_resume(pid, step, siggnal) \
! do { \
! dcache_invalidate(target_dcache); \
! (*current_target.to_resume) (pid, step, siggnal); \
! } while (0)
/* Wait for process pid to do something. Pid = -1 to wait for any pid
to do something. Return pid of child, or -1 in case of error;
***************
*** 608,618 ****
#define target_prepare_to_store() \
(*current_target.to_prepare_to_store) ()
extern int target_read_string (CORE_ADDR, char **, int, int *);
extern int target_read_memory (CORE_ADDR memaddr, char *myaddr, int len);
! extern int target_write_memory (CORE_ADDR, char *, int);
extern int xfer_memory (CORE_ADDR, char *, int, int, struct target_ops *);
--- 615,629 ----
#define target_prepare_to_store() \
(*current_target.to_prepare_to_store) ()
+ extern DCACHE *target_dcache;
+
+ extern int do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write);
+
extern int target_read_string (CORE_ADDR, char **, int, int *);
extern int target_read_memory (CORE_ADDR memaddr, char *myaddr, int len);
! extern int target_write_memory (CORE_ADDR memaddr, char *myaddr, int len);
extern int xfer_memory (CORE_ADDR, char *, int, int, struct target_ops *);
Index: wince.c
===================================================================
RCS file: /cvs/src/src/gdb/wince.c,v
retrieving revision 1.9
diff -c -r1.9 wince.c
*** wince.c 2000/08/18 22:52:23 1.9
--- wince.c 2000/10/02 21:04:47
***************
*** 54,60 ****
#include "gdbcmd.h"
#include <sys/param.h>
#include "wince-stub.h"
- #include "dcache.h"
#include <time.h>
/* The ui's event loop. */
--- 54,59 ----
***************
*** 89,96 ****
static int connection_initialized = 0; /* True if we've initialized a RAPI session. */
- static DCACHE *remote_dcache;
-
/* The directory where the stub and executable files are uploaded. */
static const char *remote_directory = "\\gdb";
--- 88,93 ----
***************
*** 1729,1738 ****
flags = DEBUG_PROCESS;
wince_initialize (); /* Make sure we've got a connection. */
- if (!remote_dcache)
- remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
- else
- dcache_invd (remote_dcache);
exec_file = upload_to_device (exec_file, exec_file);
--- 1726,1731 ----
***************
*** 1798,1804 ****
{
if (len <= 0)
return 0;
! return dcache_xfer_memory (remote_dcache, memaddr, our, len, write);
}
/* Terminate the process and wait for child to tell us it has completed. */
--- 1791,1803 ----
{
if (len <= 0)
return 0;
!
! if (write)
! res = remote_write_bytes (memaddr, our, len);
! else
! res = remote_read_bytes (memaddr, our, len);
!
! return res;
}
/* Terminate the process and wait for child to tell us it has completed. */
***************
*** 1841,1848 ****
CHECK (set_thread_context (th->h, &th->context));
th->context.ContextFlags = 0;
}
-
- dcache_invd (remote_dcache);
/* Allow continuing with the same signal that interrupted us.
Otherwise complain. */
--- 1840,1845 ----
--
J.T. Conklin
RedBack Networks
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: bug in tracepoint protocol implementation
2000-10-02 11:20 ` Michael Snyder
@ 2000-10-03 10:29 ` Josef Ezra
[not found] ` <004e01c039d8$774c1d50$6c219fa8@lss.emc.com>
1 sibling, 0 replies; 7+ messages in thread
From: Josef Ezra @ 2000-10-03 10:29 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1708 bytes --]
(Thanks Michael, I'll try to hit standards this time)
The attached fixes an unpleasant bug in trace mechanism. Creating a
tracepoint declaration string for remote host, and when more then one
memrange item was declared in a tracepoint, the debugger would have leave
gaps in the string's buffer, causing unexpected results.
Josef Ezra
----- Original Message -----
From: "Michael Snyder" <msnyder@redhat.com>
To: "Josef Ezra" <jezra@emc.com>
Cc: <gdb-patches@sources.redhat.com>; <shagam@emc.com>; <sgordon@emc.com>
Sent: Monday, October 02, 2000 2:19 PM
Subject: Re: bug in tracepoint protocol implementation
> Josef Ezra wrote:
> >
> > hi
> >
> > file: tracepoint.c
> > function: stringify_collection_list
> >
> > old:
> > count += strlen (end);
> > end += count ;
> >
> > new:
> > count += strlen (end);
> > end = temp_buf + count ;
> >
> > reasoning:
> > When saving more then one memrange parameter, the old code
> > leaves 'gaps' in the temp_buf string.
>
> Josef,
>
> Your change is correct (thank you). However, would you
> please re-submit it after consulting the file "CONTRIBUTING"
> in your gdb source directory? Or see:
> http://sources.redhat.com/gdb/#contribute
>
> Briefly, to streamline the process of accepting GDB
> contributions, we request the following format:
>
> * brief description of the problem being addressed
> * ChangeLog entry
> * Diff of the changes, such as will be acceptable
> as input to "patch" (eg. "cvs diff -c3p tracepoint.c")
>
> Hate to put you thru the exercise of resubmitting such a
> simple patch, but it will be good experience if you intend
> to make further GDB contributions (as I hope you will).
>
> Thanks,
> Michael Snyder
>
[-- Attachment #2: tracepoint.c.diff --]
[-- Type: text/plain, Size: 655 bytes --]
*tracepoint.c : bug fixed: string was created in bogus
offsets.
*** tracepoint.c.~1.1~ Tue Oct 3 12:55:06 2000
--- tracepoint.c.~1.1~~ Tue Oct 3 12:56:34 2000
*************** stringify_collection_list (list, string)
*** 1448,1454 ****
(long) (list->list[i].end - list->list[i].start));
count += strlen (end);
! end += count;
}
for (i = 0; i < list->next_aexpr_elt; i++)
--- 1448,1454 ----
(long) (list->list[i].end - list->list[i].start));
count += strlen (end);
! end = temp_buf + count;
}
for (i = 0; i < list->next_aexpr_elt; i++)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: tracepoints implementation: bug in byte code generating.
[not found] ` <004e01c039d8$774c1d50$6c219fa8@lss.emc.com>
@ 2000-10-19 10:32 ` Michael Snyder
[not found] ` <005b01c039f6$f46b1390$6c219fa8@lss.emc.com>
0 siblings, 1 reply; 7+ messages in thread
From: Michael Snyder @ 2000-10-19 10:32 UTC (permalink / raw)
To: Josef Ezra; +Cc: gdb-patches, ezra, josef, shagam, sgordon
Josef Ezra wrote:
>
> Generating code for remote traces, the case of "pointer1->pointer2->data"
> was not covered if pointer2's declaration involved a typedef. This simple
> fix should take care of that by checking the target type whenever the code
> is TYPE_CODE_TYPEDEF.
>
> Regards - Josef Ezra
Josef, your change is good, but let me make it better
and feed it back to you for YOUR approval. In the process,
I'll show you what we would like submissions to look like.
Your problem description is fine, but this is what a
change log entry looks like:
2000-10-19 Josef Ezra <jezra@emc.com>
* while generating data code, cases of "collect p1->p2->data"
where not covered if p2 is a 'typedefed' type. this simple
fix should forward the type pointer to the real type.
And there is already a gdb function called CHECK_TYPEDEF
for doing what you want to do:
*** ax-gdb.c 2000/07/30 01:48:24 1.6
--- ax-gdb.c 2000/10/19 17:31:08
*************** gen_struct_ref (struct agent_expr *ax, s
*** 1342,1348 ****
gen_usual_unary (ax, value);
gen_deref (ax, value);
}
! type = value->type;
/* This must yield a structure or a union. */
if (TYPE_CODE (type) != TYPE_CODE_STRUCT
--- 1342,1348 ----
gen_usual_unary (ax, value);
gen_deref (ax, value);
}
! type = CHECK_TYPEDEF (value->type);
/* This must yield a structure or a union. */
if (TYPE_CODE (type) != TYPE_CODE_STRUCT
OK for me to accept your change as modified?
Thanks,
Michael Snyder
From msnyder@redhat.com Thu Oct 19 10:35:00 2000
From: Michael Snyder <msnyder@redhat.com>
To: DJ Delorie <dj@delorie.com>
Cc: gdb-patches@sourceware.cygnus.com, jezra@emc.com
Subject: Re: tracepoints implementation: bug in byte code generating.
Date: Thu, 19 Oct 2000 10:35:00 -0000
Message-id: <39EF30ED.5E33@redhat.com>
References: <00c801c02c9a$fe671c90$6c219fa8@lss.emc.com> <39D8D1CE.3059@redhat.com> <004e01c039d8$774c1d50$6c219fa8@lss.emc.com> <39EF3020.3F6A@redhat.com> <200010191733.NAA03317@envy.delorie.com>
X-SW-Source: 2000-10/msg00119.html
Content-length: 469
DJ Delorie wrote:
>
> > Your problem description is fine, but this is what a
> > change log entry looks like:
> >
> > 2000-10-19 Josef Ezra <jezra@emc.com>
> >
> > * while generating data code, cases of "collect p1->p2->data"
> > where not covered if p2 is a 'typedefed' type. this simple
> > fix should forward the type pointer to the real type.
>
> Actually, it should be "* ax-gdb.c (gen_struct_ref): While
> generating..."
Oops. Right.
From jezra@emc.com Thu Oct 19 11:02:00 2000
From: "Josef Ezra" <jezra@emc.com>
To: "Michael Snyder" <msnyder@redhat.com>
Cc: <gdb-patches@sources.redhat.com>, "ezra, josef" <ezra_josef@emc.com>, <shagam@emc.com>, <sgordon@emc.com>
Subject: Re: tracepoints implementation: bug in byte code generating.
Date: Thu, 19 Oct 2000 11:02:00 -0000
Message-id: <005b01c039f6$f46b1390$6c219fa8@lss.emc.com>
References: <00c801c02c9a$fe671c90$6c219fa8@lss.emc.com> <39D8D1CE.3059@redhat.com> <004e01c039d8$774c1d50$6c219fa8@lss.emc.com> <39EF3020.3F6A@redhat.com>
X-SW-Source: 2000-10/msg00120.html
Content-length: 1925
> Josef Ezra wrote:
> >
> > Generating code for remote traces, the case of
"pointer1->pointer2->data"
> > was not covered if pointer2's declaration involved a typedef. This
simple
> > fix should take care of that by checking the target type whenever the
code
> > is TYPE_CODE_TYPEDEF.
> >
> > Regards - Josef Ezra
>
> Josef, your change is good, but let me make it better
> and feed it back to you for YOUR approval. In the process,
> I'll show you what we would like submissions to look like.
>
> Your problem description is fine, but this is what a
> change log entry looks like:
>
> 2000-10-19 Josef Ezra <jezra@emc.com>
>
> * while generating data code, cases of "collect p1->p2->data"
> where not covered if p2 is a 'typedefed' type. this simple
> fix should forward the type pointer to the real type.
>
> And there is already a gdb function called CHECK_TYPEDEF
> for doing what you want to do:
>
> *** ax-gdb.c 2000/07/30 01:48:24 1.6
> --- ax-gdb.c 2000/10/19 17:31:08
> *************** gen_struct_ref (struct agent_expr *ax, s
> *** 1342,1348 ****
> gen_usual_unary (ax, value);
> gen_deref (ax, value);
> }
> ! type = value->type;
>
> /* This must yield a structure or a union. */
> if (TYPE_CODE (type) != TYPE_CODE_STRUCT
> --- 1342,1348 ----
> gen_usual_unary (ax, value);
> gen_deref (ax, value);
> }
> ! type = CHECK_TYPEDEF (value->type);
>
> /* This must yield a structure or a union. */
> if (TYPE_CODE (type) != TYPE_CODE_STRUCT
>
> OK for me to accept your change as modified?
> Thanks,
> Michael Snyder
>
Michael
1. Your code is better. I can't resist this modification.
2. In the future, I will try to follow change-log-entry roles, sorry for
this one.
3. I would like to add commands to the remote protocol, is there a gnu
routine to standardizes some of those changed?
Thanks again
Josef Ezra
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: tracepoints implementation: bug in byte code generating.
[not found] ` <005b01c039f6$f46b1390$6c219fa8@lss.emc.com>
@ 2000-10-19 11:06 ` Michael Snyder
[not found] ` <006101c039f9$df09df60$6c219fa8@lss.emc.com>
0 siblings, 1 reply; 7+ messages in thread
From: Michael Snyder @ 2000-10-19 11:06 UTC (permalink / raw)
To: Josef Ezra; +Cc: gdb-patches, ezra, josef, shagam, sgordon
Josef Ezra wrote:
> Michael
>
> 1. Your code is better. I can't resist this modification.
Thanks, I'll check it in.
> 2. In the future, I will try to follow change-log-entry roles,
> sorry for this one.
Thanks, no need to appologize. It's a learning curve.
> 3. I would like to add commands to the remote protocol, is there a gnu
> routine to standardizes some of those changed?
Ah, you might be on thin ice.
Are your changes confined to the tracepoint protocol?
Those should be LESS controvercial than otherwise, since
they're in "Q" and 'q' packets (special purpose packets
that other stubs can ignore.
Any changes to the remote protocol can be discussed
on this mailing list.
Michael
From msnyder@redhat.com Thu Oct 19 11:15:00 2000
From: Michael Snyder <msnyder@redhat.com>
To: gdb-patches@sourceware.cygnus.com
Subject: Re: [RFA] addresses/pointers vs numbers and expression evaluation
Date: Thu, 19 Oct 2000 11:15:00 -0000
Message-id: <39EF36EF.10B5@redhat.com>
References: <200010121406.KAA21106@texas.cygnus.com>
X-SW-Source: 2000-10/msg00122.html
Content-length: 14519
David,
The breakpoint and tracepoint changes are approved.
Michael
David Taylor wrote:
>
> The following patch concerns bugs brought to light during a port of
> gdb to a target with separate instruction and data.
>
> The bugs will potentially impact any port which defines
> POINTER_TO_ADDRESS to have any value other than the default value.
>
> There are undoubtably additional bugs still lurking in the expression
> evaluation code.
>
> Several places in gdb it calls
>
> parse_and_eval_address
>
> when the expression is *NOT* an address, but rather is just a number!
> For example, it calls parse_and_eval_address when you type:
>
> set height 24
>
> For this processor, treating 24 as a pointer resulted in an address of
> 0x01000018 -- 16 meg plus 24! Similarly, it does this for the count
> given to the continue and step commands as well as a few other places.
>
> To fix this, I have create a new function called parse_and_eval_long
> and changed 17 of the calls to parse_and_eval_address.
>
> I have tested this on solaris native and on solaris x d10v (using the
> simulator). There were no regressions.
>
> Here's the ChangeLog entry and the patch:
>
> * parse.c (parse_and_eval_long): New function.
> (value.h): Declare it.
>
> * breakpoint.c (breakpoints_info, maintenance_info_breakpoints):
> Call parse_and_eval_long, not parse_and_eval_address.
> * command.c (do_setshow_command): Ditto.
> * infcmd.c (step_1, signal_command, continue_command): Ditto.
> * infrun.c (signals_info): Ditto.
> * stack.c (set_backtrace_limit_command, backtrace_command_1,
> up_silently_base, down_silently_base): Ditto.
> * tracepoints.c (tracepoints_info, trace_find_command,
> trace_find_tracepoint_command): Ditto.
> * valprint.c (set_radix): Ditto.
> * values (show_values): Ditto.
>
> Index: breakpoint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/breakpoint.c,v
> retrieving revision 1.17
> diff -c -r1.17 breakpoint.c
> *** breakpoint.c 2000/08/30 00:58:58 1.17
> --- breakpoint.c 2000/10/12 13:57:06
> ***************
> *** 3638,3644 ****
> int bnum = -1;
>
> if (bnum_exp)
> ! bnum = parse_and_eval_address (bnum_exp);
>
> breakpoint_1 (bnum, 0);
> }
> --- 3638,3644 ----
> int bnum = -1;
>
> if (bnum_exp)
> ! bnum = parse_and_eval_long (bnum_exp);
>
> breakpoint_1 (bnum, 0);
> }
> ***************
> *** 3650,3656 ****
> int bnum = -1;
>
> if (bnum_exp)
> ! bnum = parse_and_eval_address (bnum_exp);
>
> breakpoint_1 (bnum, 1);
> }
> --- 3650,3656 ----
> int bnum = -1;
>
> if (bnum_exp)
> ! bnum = parse_and_eval_long (bnum_exp);
>
> breakpoint_1 (bnum, 1);
> }
> Index: command.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/command.c,v
> retrieving revision 1.17
> diff -c -r1.17 command.c
> *** command.c 2000/08/08 00:17:39 1.17
> --- command.c 2000/10/12 13:57:08
> ***************
> *** 1622,1628 ****
> case var_uinteger:
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! *(unsigned int *) c->var = parse_and_eval_address (arg);
> if (*(unsigned int *) c->var == 0)
> *(unsigned int *) c->var = UINT_MAX;
> break;
> --- 1622,1628 ----
> case var_uinteger:
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! *(unsigned int *) c->var = parse_and_eval_long (arg);
> if (*(unsigned int *) c->var == 0)
> *(unsigned int *) c->var = UINT_MAX;
> break;
> ***************
> *** 1631,1637 ****
> unsigned int val;
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! val = parse_and_eval_address (arg);
> if (val == 0)
> *(int *) c->var = INT_MAX;
> else if (val >= INT_MAX)
> --- 1631,1637 ----
> unsigned int val;
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! val = parse_and_eval_long (arg);
> if (val == 0)
> *(int *) c->var = INT_MAX;
> else if (val >= INT_MAX)
> ***************
> *** 1643,1649 ****
> case var_zinteger:
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! *(int *) c->var = parse_and_eval_address (arg);
> break;
> case var_enum:
> {
> --- 1643,1649 ----
> case var_zinteger:
> if (arg == NULL)
> error_no_arg ("integer to set it to.");
> ! *(int *) c->var = parse_and_eval_long (arg);
> break;
> case var_enum:
> {
> Index: eval.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/eval.c,v
> retrieving revision 1.8
> diff -c -r1.8 eval.c
> *** eval.c 2000/09/01 23:50:17 1.8
> --- eval.c 2000/10/12 13:57:09
> ***************
> *** 103,108 ****
> --- 103,123 ----
> return addr;
> }
>
> + /* Like parse_and_eval_address, but treats the value of the expression
> + as an integer, not an address, returns a LONGEST, not a CORE_ADDR */
> + LONGEST
> + parse_and_eval_long (char *exp)
> + {
> + struct expression *expr = parse_expression (exp);
> + register LONGEST retval;
> + register struct cleanup *old_chain =
> + make_cleanup (free_current_contents, &expr);
> +
> + retval = value_as_long (evaluate_expression (expr));
> + do_cleanups (old_chain);
> + return (retval);
> + }
> +
> value_ptr
> parse_and_eval (char *exp)
> {
> Index: infcmd.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infcmd.c,v
> retrieving revision 1.11
> diff -c -r1.11 infcmd.c
> *** infcmd.c 2000/09/02 00:07:13 1.11
> --- infcmd.c 2000/10/12 13:57:11
> ***************
> *** 381,387 ****
> while (num != 0)
> {
> set_ignore_count (num,
> ! parse_and_eval_address (proc_count_exp) - 1,
> from_tty);
> /* set_ignore_count prints a message ending with a period.
> So print two spaces before "Continuing.". */
> --- 381,387 ----
> while (num != 0)
> {
> set_ignore_count (num,
> ! parse_and_eval_long (proc_count_exp) - 1,
> from_tty);
> /* set_ignore_count prints a message ending with a period.
> So print two spaces before "Continuing.". */
> ***************
> *** 465,471 ****
> async_disable_stdin ();
> }
>
> ! count = count_string ? parse_and_eval_address (count_string) : 1;
>
> if (!single_inst || skip_subroutines) /* leave si command alone */
> {
> --- 465,471 ----
> async_disable_stdin ();
> }
>
> ! count = count_string ? parse_and_eval_long (count_string) : 1;
>
> if (!single_inst || skip_subroutines) /* leave si command alone */
> {
> ***************
> *** 777,783 ****
> if (oursig == TARGET_SIGNAL_UNKNOWN)
> {
> /* No, try numeric. */
> ! int num = parse_and_eval_address (signum_exp);
>
> if (num == 0)
> oursig = TARGET_SIGNAL_0;
> --- 777,783 ----
> if (oursig == TARGET_SIGNAL_UNKNOWN)
> {
> /* No, try numeric. */
> ! int num = parse_and_eval_long (signum_exp);
>
> if (num == 0)
> oursig = TARGET_SIGNAL_0;
> Index: infrun.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infrun.c,v
> retrieving revision 1.18
> diff -c -r1.18 infrun.c
> *** infrun.c 2000/09/02 00:08:05 1.18
> --- infrun.c 2000/10/12 13:57:15
> ***************
> *** 3899,3905 ****
> {
> /* No, try numeric. */
> oursig =
> ! target_signal_from_command (parse_and_eval_address (signum_exp));
> }
> sig_print_info (oursig);
> return;
> --- 3899,3905 ----
> {
> /* No, try numeric. */
> oursig =
> ! target_signal_from_command (parse_and_eval_long (signum_exp));
> }
> sig_print_info (oursig);
> return;
> Index: stack.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/stack.c,v
> retrieving revision 1.7
> diff -c -r1.7 stack.c
> *** stack.c 2000/07/30 01:48:27 1.7
> --- stack.c 2000/10/12 13:57:17
> ***************
> *** 1038,1044 ****
> static void
> set_backtrace_limit_command (char *count_exp, int from_tty)
> {
> ! int count = parse_and_eval_address (count_exp);
>
> if (count < 0)
> error ("Negative argument not meaningful as backtrace limit.");
> --- 1038,1044 ----
> static void
> set_backtrace_limit_command (char *count_exp, int from_tty)
> {
> ! int count = parse_and_eval_long (count_exp);
>
> if (count < 0)
> error ("Negative argument not meaningful as backtrace limit.");
> ***************
> *** 1086,1092 ****
> trailing_level = 0;
> if (count_exp)
> {
> ! count = parse_and_eval_address (count_exp);
> if (count < 0)
> {
> struct frame_info *current;
> --- 1086,1092 ----
> trailing_level = 0;
> if (count_exp)
> {
> ! count = parse_and_eval_long (count_exp);
> if (count < 0)
> {
> struct frame_info *current;
> ***************
> *** 1740,1746 ****
> register struct frame_info *fi;
> int count = 1, count1;
> if (count_exp)
> ! count = parse_and_eval_address (count_exp);
> count1 = count;
>
> if (target_has_stack == 0 || selected_frame == 0)
> --- 1740,1746 ----
> register struct frame_info *fi;
> int count = 1, count1;
> if (count_exp)
> ! count = parse_and_eval_long (count_exp);
> count1 = count;
>
> if (target_has_stack == 0 || selected_frame == 0)
> ***************
> *** 1777,1783 ****
> register struct frame_info *frame;
> int count = -1, count1;
> if (count_exp)
> ! count = -parse_and_eval_address (count_exp);
> count1 = count;
>
> if (target_has_stack == 0 || selected_frame == 0)
> --- 1777,1783 ----
> register struct frame_info *frame;
> int count = -1, count1;
> if (count_exp)
> ! count = -parse_and_eval_long (count_exp);
> count1 = count;
>
> if (target_has_stack == 0 || selected_frame == 0)
> Index: tracepoint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/tracepoint.c,v
> retrieving revision 1.10
> diff -c -r1.10 tracepoint.c
> *** tracepoint.c 2000/09/01 00:12:10 1.10
> --- tracepoint.c 2000/10/12 13:57:19
> ***************
> *** 465,471 ****
> int tpnum = -1;
>
> if (tpnum_exp)
> ! tpnum = parse_and_eval_address (tpnum_exp);
>
> ALL_TRACEPOINTS (t)
> if (tpnum == -1 || tpnum == t->number)
> --- 465,471 ----
> int tpnum = -1;
>
> if (tpnum_exp)
> ! tpnum = parse_and_eval_long (tpnum_exp);
>
> ALL_TRACEPOINTS (t)
> if (tpnum == -1 || tpnum == t->number)
> ***************
> *** 1986,1992 ****
> frameno = traceframe_number - 1;
> }
> else
> ! frameno = parse_and_eval_address (args);
>
> if (frameno < -1)
> error ("invalid input (%d is less than zero)", frameno);
> --- 1986,1992 ----
> frameno = traceframe_number - 1;
> }
> else
> ! frameno = parse_and_eval_long (args);
>
> if (frameno < -1)
> error ("invalid input (%d is less than zero)", frameno);
> Index: valprint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/valprint.c,v
> retrieving revision 1.6
> diff -c -r1.6 valprint.c
> *** valprint.c 2000/07/30 01:48:27 1.6
> --- valprint.c 2000/10/12 13:57:20
> ***************
> *** 1416,1422 ****
> {
> unsigned radix;
>
> ! radix = (arg == NULL) ? 10 : parse_and_eval_address (arg);
> set_output_radix_1 (0, radix);
> set_input_radix_1 (0, radix);
> if (from_tty)
> --- 1416,1422 ----
> {
> unsigned radix;
>
> ! radix = (arg == NULL) ? 10 : parse_and_eval_long (arg);
> set_output_radix_1 (0, radix);
> set_input_radix_1 (0, radix);
> if (from_tty)
> Index: value.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/value.h,v
> retrieving revision 1.10
> diff -c -r1.10 value.h
> *** value.h 2000/09/04 08:29:25 1.10
> --- value.h 2000/10/12 13:57:21
> ***************
> *** 410,415 ****
> --- 410,417 ----
>
> extern CORE_ADDR parse_and_eval_address_1 (char **expptr);
>
> + extern LONGEST parse_and_eval_long (char *exp);
> +
> extern value_ptr access_value_history (int num);
>
> extern value_ptr value_of_internalvar (struct internalvar *var);
> Index: values.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/values.c,v
> retrieving revision 1.9
> diff -c -r1.9 values.c
> *** values.c 2000/07/30 01:48:27 1.9
> --- values.c 2000/10/12 13:57:22
> ***************
> *** 351,357 ****
> /* "info history +" should print from the stored position.
> "info history <exp>" should print around value number <exp>. */
> if (num_exp[0] != '+' || num_exp[1] != '\0')
> ! num = parse_and_eval_address (num_exp) - 5;
> }
> else
> {
> --- 351,357 ----
> /* "info history +" should print from the stored position.
> "info history <exp>" should print around value number <exp>. */
> if (num_exp[0] != '+' || num_exp[1] != '\0')
> ! num = parse_and_eval_long (num_exp) - 5;
> }
> else
> {
From jezra@emc.com Thu Oct 19 11:23:00 2000
From: "Josef Ezra" <jezra@emc.com>
To: "Michael Snyder" <msnyder@redhat.com>
Cc: <gdb-patches@sources.redhat.com>, "ezra, josef" <ezra_josef@emc.com>, <shagam@emc.com>, <sgordon@emc.com>
Subject: Re: tracepoints implementation: bug in byte code generating.
Date: Thu, 19 Oct 2000 11:23:00 -0000
Message-id: <006101c039f9$df09df60$6c219fa8@lss.emc.com>
References: <00c801c02c9a$fe671c90$6c219fa8@lss.emc.com> <39D8D1CE.3059@redhat.com> <004e01c039d8$774c1d50$6c219fa8@lss.emc.com> <39EF3020.3F6A@redhat.com> <005b01c039f6$f46b1390$6c219fa8@lss.emc.com> <39EF381C.7EE6@redhat.com>
X-SW-Source: 2000-10/msg00123.html
Content-length: 1077
> Josef Ezra wrote:
>
> > Michael
> >
> > 1. Your code is better. I can't resist this modification.
>
> Thanks, I'll check it in.
>
> > 2. In the future, I will try to follow change-log-entry roles,
> > sorry for this one.
>
> Thanks, no need to appologize. It's a learning curve.
>
> > 3. I would like to add commands to the remote protocol, is there a gnu
> > routine to standardizes some of those changed?
>
> Ah, you might be on thin ice.
> Are your changes confined to the tracepoint protocol?
> Those should be LESS controvercial than otherwise, since
> they're in "Q" and 'q' packets (special purpose packets
> that other stubs can ignore.
>
> Any changes to the remote protocol can be discussed
> on this mailing list.
>
> Michael
>
Actually I had in mind a 'show protocol version' command (for backward
compatibility) and a special read memory command (like "mxxxx,lll") which
can be used at target side for special reads (in my case, it will show
values in different memory scope).
If it will turn out to be very useful, I will suggest it in this forum.
Josef
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: tracepoints implementation: bug in byte code generating.
[not found] ` <009001c03adb$b46a7b60$6c219fa8@lss.emc.com>
@ 2000-10-20 14:54 ` Michael Snyder
[not found] ` <003d01c03b0e$42568040$961919ac@lss.emc.com>
0 siblings, 1 reply; 7+ messages in thread
From: Michael Snyder @ 2000-10-20 14:54 UTC (permalink / raw)
To: Josef Ezra; +Cc: jtc, gdb-patches, ezra, josef, shagam, sgordon
Since this discussion now involves only tracepoints,
after this reply I will continue it in private email
unies someone on the list pipes up and expresses an
interest in keeping it public. OK with you Josef?
Josef Ezra wrote:
>
> Let me try to list the features that I would like to have, if you think that
> other tracepoints clients may be interested, I will be more then happy to
> cooperate.
>
> -In actions:
> -- Trace/ref different memory ranges.
Not sure what you mean by the above.
> -- Stop all traces on condition.
That would be useful, sure.
> -- Save back trace functions chain. (I can't save all the stack,
> but I can save a limited array of function addresses)
Tracepoints can already do that. I do it regularly in demos.
All you need to do is define a memory range relative to the
stack pointer register. Capture all that memory, and you can
do backtraces, examine the local variables of your caller,
and pretty much everything else you would expect.
> -In output:
> --Show/set memory from different memory space - (already suggested by J.T.C)
Fine, but not related to traceipoints.
> --Display (if traced) the functions backtrace array.
Can already do that. See above.
> -I also need a user interface for conditional trace commands. The Stub
> specification has provisions for aop_goto but I could not find a way to
> access this through GDB.
If you mean something like:
if (a == b) then collect c
yes, we'd like to have that.
If you mean something like
if (a == b) then activate tracepoint N
then yes, we'd like to have that too.
> -As a reply to "QT_Frame" I would like to get the passcount with the frame
Hitcount, I assume you mean. Passcount is something different.
Yes, I'm sure we'd like that too.
With all of these, however, we would have to talk about
the syntax for the remote protocol. We would not want
new syntax to break old existing stubs or debuggers.
> and tracepoint numbers.
Mmmmm... do we need that? The frame info ALWAYS contains
the PC, and the PC would generally uniquely identify a
tracepoint.
> -In the future I will like to have a trace/ref of long address with
> base-offset parameters.
Have to explain to me what you mean.
> thanks for your comments - Josef Ezra
No problem. Happy that someone else is working on it.
Michael
From kevinb@cygnus.com Fri Oct 20 15:29:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: Josef Ezra <jezra@emc.com>, Michael Snyder <msnyder@redhat.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: tracepoints implementation: bug in byte code generating.
Date: Fri, 20 Oct 2000 15:29:00 -0000
Message-id: <1001020222850.ZM5877@ocotillo.lan>
References: <00c801c02c9a$fe671c90$6c219fa8@lss.emc.com> <39D8D1CE.3059@redhat.com> <004e01c039d8$774c1d50$6c219fa8@lss.emc.com> <39EF3020.3F6A@redhat.com> <005b01c039f6$f46b1390$6c219fa8@lss.emc.com> <39EF381C.7EE6@redhat.com> <006101c039f9$df09df60$6c219fa8@lss.emc.com> <5mvguo5spm.fsf@jtc.redback.com> <008501c03aad$46c9d700$6c219fa8@lss.emc.com> <39F090F3.2DDC@redhat.com> <009001c03adb$b46a7b60$6c219fa8@lss.emc.com> <39F0BF1B.74DD@redhat.com> <msnyder@redhat.com>
X-SW-Source: 2000-10/msg00141.html
Content-length: 496
On Oct 20, 2:54pm, Michael Snyder wrote:
> Since this discussion now involves only tracepoints,
> after this reply I will continue it in private email
> unies someone on the list pipes up and expresses an
> interest in keeping it public. OK with you Josef?
Personally, I think it'd be a good idea to keep it public. I probably
won't read the discussion now, but if I ever need to know about
tracepoints, I'll be happier knowing that I can find the discussion
in the public archives.
Kevin
From kevinb@cygnus.com Sun Oct 22 20:07:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH RFA] solib.c reorg
Date: Sun, 22 Oct 2000 20:07:00 -0000
Message-id: <1001023030642.ZM11545@ocotillo.lan>
X-SW-Source: 2000-10/msg00142.html
Content-length: 135063
I request approval for committing the patch below.
This patch reorganizes solib.c as follows:
- solib.c: Generic solib code is retained here. It is my hope that
this file will be usable by all targets which need shared library
support. As such, it does not contain any target specific ifdefs.
- solib-svr4.c: Support for SVR4 and SunOS shared libraries has been
moved to this file. In addition, the code has been reorganized
internally so that it does not depend upon the existence of link.h
quite so much. This is important so that we can use this code for
shared library support in cross debugging scenarios.
- solib-svr4.c: Contains the new struct link_map_offsets. A target
specific function called via SVR4_FETCH_LINK_MAP_OFFSETS returns a
pointer to one of these structs that contains the necessary offsets
and sizes describing the dynamic linker data structures.
It is my intent that SVR4_FETCH_LINK_MAP_OFFSETS be multiarched.
I haven't done it yet, but will submit a patch once the patch
below is approved.
- solist.h: Defines struct so_list which formerly resided in
solib.c. This file also contains a new struct called ``struct
target_so_ops'' which is a list of function pointers by which the
generic portions in solib.c call the target specific pieces
elsewhere (currently only in solib-svr4.c).
struct solist has been revised minimally. The lm, lm32, and lmaddr
fields have been replaced with a pointer to struct lm_info. It is
up to the target specific code to define struct lm_info as
appropriate. I had initially placed lm, lm32, and lmaddr in struct
lm_info. However, once I revised the code to use the
link_map_offsets machinery instead, these fields were eliminated in
favor of a single field which holds the inferior process's
link_map. Access to the components of the struct occur entirely
through the offsets (and sizes) returned by
SVR4_FETCH_LINK_MAP_OFFSETS.
There is one change that I'm willing to remove from consideration.
This is the change to sparc-tdep.c which fixed a compilation error
when building on SunOS. (It should be fixed anyway, however.)
Things that still need to be done include:
1) Multiarch SVR4_FETCH_LINK_MAP_OFFSETS and current_target_so_ops.
2) Remove the dependence on link.h from the SunOS branches of the
code in solib-svr4.c. (This is low priority.)
I have tested on the following hosts:
sparc-sun-solaris2.5.1
sparc-sun-sunos4.1.4
i686-pc-linux-gnu
I see no regressions on any of these platforms. On SunOS, the number
of FAILs actually decreased from 34 to 29 after applying the patch
below. (I don't know why this is, but it *is not* due to reverting
the 2000-08-29 SOLIB_EXTRACT_ADDRESS change. I reverted it for my
baseline tests also; without this reversion, there would've been very
few PASSes.)
ChangeLog entries and patches follow...
* solib-svr4.c: New file created out of much of solib.c...
* solib.c (_SYSCALL32, BKPT_AT_SYMBOL): Move these defines to
solib-svr4.c.
(sys/types.h, signal.h, sys/param.h, fcntl.h, a.out.h,
elf/external.h, link.h): Move these includes to solib-svr4.c.
(bkpt_names, debug_base_symbols, main_name_list,
solib_extract_address, SOLIB_EXTRACT_ADDRESS, dynamic_copy,
ld_2_copy, debug_addr, flag_addr, LM_ADDR, LM_NEXT, LM_NAME,
IGNORE_FIRST_LINK_MAP_ENTRY, breakpoint_addr,
allocate_rt_common_objfile, solib_add_common_symbols,
bfd_lookup_symbol, look_for_base, elf_locate_base, locate_base,
first_link_map_member, open_symbol_file_object, match_main,
current_sos, interp_text_sect_low, interp_text_sect_high,
interp_plt_sect_low, interp_plt_sect_high,
in_svr4_dynsym_resolve_code, disable_break, enable_break,
special_symbol_handling): Moved to solib-svr4.c.
(debug32_copy, shadow_contents, fdmatch)
Removed entirely.
(struct so_list): Moved to solist.h
(MAX_PATH_SIZE): Moved to solist.h and renamed to
SO_NAME_MAX_PATH_SIZE.
* solist.h: New file created from struct so_list in solib.c.
(struct lm_info): Add forward declaration.
(struct so_list): Remove fields lm, lm32, lmaddr. Replace with a
single field, lm_info, which will be a pointer to target specific
data.
(struct target_so_ops): New struct.
(free_so): Add extern declaration.
(current_target_so_ops): Declare new global variable.
(solib_map_sections):
(TARGET_SO_LM_ADDR, TARGET_SO_FREE_SO, TARGET_SO_CLEAR_SOLIB,
TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK,
TARGET_SO_SPECIAL_SYMBOL_HANDLING, TARGET_SO_CURRENT_SOS,
TARGET_SO_OPEN_SYMBOL_FILE_OBJECT): New macros.
* solib.c (solib_map_sections, free_so, symbol_add_stub,
update_solib_list, solib_add, info_shared_library_command,
solib_address, clear_solib, solib_create_inferior_hook): Use
new TARGET_SO_* macros to call function on target specific
side indirectly.
(current_target_so_ops): Define new global variable.
* solib-svr4.h: New file; defines struct link_map_offsets and
SVR4_FETCH_LINK_MAP_OFFSETS.
* solib-svr4.c (_initialize_svr4_solib, svr4_clear_solib,
svr4_free_so): New functions.
(special_symbol_handling, solib_create_inferior_function_hook,
current_sos): Rename by adding a svr4_ prefix.
(default_svr4_fetch_link_map_offsets): New function.
(LM_ADDR, LM_NEXT, LM_NAME, IGNORE_FIRST_LINK_MAP_ENTRY,
first_link_map_member, open_symbol_file_object, svr4_current_sos):
Remove dependence on existence of link.h by calling
SVR4_FETCH_LINK_MAP_OFFSETS to obtain the offsets of shared library
data. As a result, SVR4 and non-SVR4 versions of many of these
functions coalesce into a single function and HAVE_STRUCT_LINK_MAP32
ugliness is moved into default_svr4_fetch_link_map_offsets where it
is relatively contained.
(SOLIB_EXTRACT_ADDRESS): Revert (via #if 0) 2000-08-29 change in
which solib_extract_address() is called instead of extract_address().
* Makefile.in (solib.o): Add solist.h as a dependency.
(solib-svr4.o): Add dependencies.
* sparc-tdep.c (gregset.h): Don't include unless USE_PROC_FS is
defined.
* config/alpha/alpha-linux.mh, config/alpha/fbsd.mh,
config/arm/linux.mh, config/i386/fbsd.mh,
config/i386/i386dgux.mh, config/i386/i386gnu.mh,
config/i386/i386sco5.mh, config/i386/i386sol2.mt,
config/i386/i386v4.mh, config/i386/i386v42mp.mh,
config/i386/linux.mh, config/i386/nbsd.mh,
config/i386/nbsdelf.mh, config/i386/ncr3000.mt,
config/i386/ptx4.mh, config/i386/sun386.mt,
config/ia64/linux.mh, config/m68k/linux.mh,
config/m68k/m68kv4.mh, config/m68k/nbsd.mh,
config/m68k/sun2os4.mt, config/m68k/sun3os4.mt,
config/m88k/delta88v4.mh, config/mips/mipsv4.mh,
config/ns32k/nbsd.mh, config/powerpc/linux.mh,
config/powerpc/nbsd.mh, config/powerpc/solaris.mh,
config/rs6000/rs6000lynx.mt, config/sparc/linux.mt,
config/sparc/nbsd.mh, config/sparc/nbsdelf.mh,
config/sparc/sun4os4.mt, config/sparc/sun4sol2.mh
(NATDEPFILES): Add solib-svr4.o to list.
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.44
diff -u -p -r1.44 Makefile.in
--- Makefile.in 2000/10/08 22:31:22 1.44
+++ Makefile.in 2000/10/23 00:43:52
@@ -1840,7 +1840,11 @@ mon960-rom.o: mon960-rom.c monitor.h $(b
$(inferior_h) target.h serial.h terminal.h
solib.o: solib.c $(command_h) $(defs_h) $(gdbcore_h) $(inferior_h) \
- objfiles.h gnu-regex.h symfile.h target.h gdb_string.h
+ objfiles.h gnu-regex.h symfile.h target.h gdb_string.h solist.h
+
+solib-svr4.o: solib.c $(command_h) $(defs_h) $(gdbcore_h) $(inferior_h) \
+ objfiles.h gnu-regex.h symfile.h target.h gdb_string.h solist.h \
+ solib-svr4.h
source.o: source.c $(defs_h) $(expression_h) $(frame_h) $(gdbcmd_h) \
$(gdbcore_h) language.h objfiles.h gnu-regex.h symfile.h $(symtab_h) \
Index: solib-svr4.c
===================================================================
RCS file: solib-svr4.c
diff -N solib-svr4.c
--- /dev/null Tue May 5 13:32:27 1998
+++ solib-svr4.c Sun Oct 22 17:43:54 2000
@@ -0,0 +1,1608 @@
+/* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger.
+ Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999, 2000
+ 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. */
+
+#define _SYSCALL32 /* for Sparc64 cross Sparc32 */
+#include "defs.h"
+
+
+#include <sys/types.h>
+#include <signal.h>
+#include "gdb_string.h"
+#include <sys/param.h>
+#include <fcntl.h>
+
+#ifndef SVR4_SHARED_LIBS
+ /* SunOS shared libs need the nlist structure. */
+#include <a.out.h>
+#else
+#include "elf/external.h"
+#endif
+
+#ifdef HAVE_LINK_H
+#include <link.h>
+#endif
+
+#include "symtab.h"
+#include "bfd.h"
+#include "symfile.h"
+#include "objfiles.h"
+#include "gdbcore.h"
+#include "command.h"
+#include "target.h"
+#include "frame.h"
+#include "gdb_regex.h"
+#include "inferior.h"
+#include "environ.h"
+#include "language.h"
+#include "gdbcmd.h"
+
+#include "solist.h"
+#include "solib-svr4.h"
+
+/* Link map info to include in an allocated so_list entry */
+
+struct lm_info
+ {
+ /* Pointer to copy of link map from inferior. The type is char *
+ rather than void *, so that we may use byte offsets to find the
+ various fields without the need for a cast. */
+ char *lm;
+ };
+
+/* On SVR4 systems, a list of symbols in the dynamic linker where
+ GDB can try to place a breakpoint to monitor shared library
+ events.
+
+ If none of these symbols are found, or other errors occur, then
+ SVR4 systems will fall back to using a symbol as the "startup
+ mapping complete" breakpoint address. */
+
+#ifdef SVR4_SHARED_LIBS
+static char *solib_break_names[] =
+{
+ "r_debug_state",
+ "_r_debug_state",
+ "_dl_debug_state",
+ "rtld_db_dlactivity",
+ NULL
+};
+#endif
+
+#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. */
+#endif
+ "_start",
+ "main",
+ NULL
+};
+#endif
+
+/* Symbols which are used to locate the base of the link map structures. */
+
+#ifndef SVR4_SHARED_LIBS
+static char *debug_base_symbols[] =
+{
+ "_DYNAMIC",
+ "_DYNAMIC__MGC",
+ NULL
+};
+#endif
+
+static char *main_name_list[] =
+{
+ "main_$main",
+ NULL
+};
+
+
+/* Fetch (and possibly build) an appropriate link_map_offsets structure
+ for native targets using struct definitions from link.h. */
+
+struct link_map_offsets *
+default_svr4_fetch_link_map_offsets (void)
+{
+#ifdef HAVE_LINK_H
+ static struct link_map_offsets lmo;
+ static struct link_map_offsets *lmp = 0;
+#if defined (HAVE_STRUCT_LINK_MAP32)
+ static struct link_map_offsets lmo32;
+ static struct link_map_offsets *lmp32 = 0;
+#endif
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
+#endif
+#define fieldsize(TYPE, MEMBER) (sizeof (((TYPE *)0)->MEMBER))
+
+ if (lmp == 0)
+ {
+ lmp = &lmo;
+
+#ifdef SVR4_SHARED_LIBS
+ lmo.r_debug_size = sizeof (struct r_debug);
+
+ lmo.r_map_offset = offsetof (struct r_debug, r_map);
+ lmo.r_map_size = fieldsize (struct r_debug, r_map);
+
+ lmo.link_map_size = sizeof (struct link_map);
+
+ lmo.l_addr_offset = offsetof (struct link_map, l_addr);
+ lmo.l_addr_size = fieldsize (struct link_map, l_addr);
+
+ lmo.l_next_offset = offsetof (struct link_map, l_next);
+ lmo.l_next_size = fieldsize (struct link_map, l_next);
+
+ lmo.l_prev_offset = offsetof (struct link_map, l_prev);
+ lmo.l_prev_size = fieldsize (struct link_map, l_prev);
+
+ lmo.l_name_offset = offsetof (struct link_map, l_name);
+ lmo.l_name_size = fieldsize (struct link_map, l_name);
+#else /* !SVR4_SHARED_LIBS */
+ lmo.link_map_size = sizeof (struct link_map);
+
+ lmo.l_addr_offset = offsetof (struct link_map, lm_addr);
+ lmo.l_addr_size = fieldsize (struct link_map, lm_addr);
+
+ lmo.l_next_offset = offsetof (struct link_map, lm_next);
+ lmo.l_next_size = fieldsize (struct link_map, lm_next);
+
+ lmo.l_name_offset = offsetof (struct link_map, lm_name);
+ lmo.l_name_size = fieldsize (struct link_map, lm_name);
+#endif /* SVR4_SHARED_LIBS */
+ }
+
+#if defined (HAVE_STRUCT_LINK_MAP32)
+ if (lmp32 == 0)
+ {
+ lmp32 = &lmo32;
+
+ lmo32.r_debug_size = sizeof (struct r_debug32);
+
+ lmo32.r_map_offset = offsetof (struct r_debug32, r_map);
+ lmo32.r_map_size = fieldsize (struct r_debug32, r_map);
+
+ lmo32.link_map_size = sizeof (struct link_map32);
+
+ lmo32.l_addr_offset = offsetof (struct link_map32, l_addr);
+ lmo32.l_addr_size = fieldsize (struct link_map32, l_addr);
+
+ lmo32.l_next_offset = offsetof (struct link_map32, l_next);
+ lmo32.l_next_size = fieldsize (struct link_map32, l_next);
+
+ lmo32.l_prev_offset = offsetof (struct link_map32, l_prev);
+ lmo32.l_prev_size = fieldsize (struct link_map32, l_prev);
+
+ lmo32.l_name_offset = offsetof (struct link_map32, l_name);
+ lmo32.l_name_size = fieldsize (struct link_map32, l_name);
+ }
+#endif /* defined (HAVE_STRUCT_LINK_MAP32) */
+
+#if defined (HAVE_STRUCT_LINK_MAP32)
+ if (bfd_get_arch_size (exec_bfd) == 32)
+ return lmp32;
+ else
+#endif
+ return lmp;
+
+#else
+
+ internal_error ("default_svr4_fetch_link_map_offsets called without HAVE_LINK_H defined.");
+ return 0;
+
+#endif /* HAVE_LINK_H */
+}
+
+/* Function to extract an address from a solib structure.
+ When GDB is configured for some 32-bit targets (e.g. Solaris 2.7
+ sparc), BFD is configured to handle 64-bit targets, so CORE_ADDR is
+ 64 bits. We have to extract only the significant bits of addresses
+ to get the right address when accessing the core file BFD.
+
+ We'll use the BFD itself to determine the number of significant bits.
+ MVS, June 2000 */
+
+static CORE_ADDR
+solib_extract_address (void *memberp)
+{
+ return extract_address (memberp,
+ bfd_get_arch_size (exec_bfd) / 8);
+}
+
+#if 0
+#define SOLIB_EXTRACT_ADDRESS(MEMBER) \
+ solib_extract_address (&MEMBER)
+#else
+#define SOLIB_EXTRACT_ADDRESS(MEMBER) \
+ extract_address (&(MEMBER), sizeof (MEMBER))
+#endif
+
+/* local data declarations */
+
+#ifndef SVR4_SHARED_LIBS
+
+/* NOTE: converted the macros LM_ADDR, LM_NEXT, LM_NAME and
+ IGNORE_FIRST_LINK_MAP_ENTRY into functions (see below).
+ MVS, June 2000 */
+
+static struct link_dynamic dynamic_copy;
+static struct link_dynamic_2 ld_2_copy;
+static struct ld_debug debug_copy;
+static CORE_ADDR debug_addr;
+static CORE_ADDR flag_addr;
+
+#endif /* !SVR4_SHARED_LIBS */
+
+/* link map access functions */
+
+static CORE_ADDR
+LM_ADDR (struct so_list *so)
+{
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+
+ return extract_address (so->lm_info->lm + lmo->l_addr_offset, lmo->l_addr_size);
+}
+
+static CORE_ADDR
+LM_NEXT (struct so_list *so)
+{
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+
+ return extract_address (so->lm_info->lm + lmo->l_next_offset, lmo->l_next_size);
+}
+
+static CORE_ADDR
+LM_NAME (struct so_list *so)
+{
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+
+ return extract_address (so->lm_info->lm + lmo->l_name_offset, lmo->l_name_size);
+}
+
+#ifndef SVR4_SHARED_LIBS
+
+static int
+IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
+{
+ return 0;
+}
+
+#else /* SVR4_SHARED_LIBS */
+
+static int
+IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
+{
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+
+ /* FIXME (maybe?): A previous version of this code did
+
+ return (solib_extract_address (&(so) -> lm_info->lm.l_prev) == 0);
+
+ But I don't understand the reason for solib_extract_address in
+ this case, nor am I sure it's even right. - Kevin, Oct 2000 */
+
+ return extract_address (so->lm_info->lm + lmo->l_prev_offset, lmo->l_prev_size) == 0;
+}
+
+#endif /* !SVR4_SHARED_LIBS */
+
+
+static CORE_ADDR debug_base; /* Base of dynamic linker structures */
+static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
+
+/* Local function prototypes */
+
+static int match_main (char *);
+
+/* If non-zero, this is a prefix that will be added to the front of the name
+ shared libraries with an absolute filename for loading. */
+static char *solib_absolute_prefix = NULL;
+
+/* If non-empty, this is a search path for loading non-absolute shared library
+ symbol files. This takes precedence over the environment variables PATH
+ and LD_LIBRARY_PATH. */
+static char *solib_search_path = NULL;
+
+
+#ifndef SVR4_SHARED_LIBS
+
+/* Allocate the runtime common object file. */
+
+static void
+allocate_rt_common_objfile (void)
+{
+ struct objfile *objfile;
+ struct objfile *last_one;
+
+ objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
+ memset (objfile, 0, sizeof (struct objfile));
+ objfile->md = NULL;
+ obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0,
+ xmalloc, free);
+ obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc,
+ free);
+ obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc,
+ free);
+ obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
+ free);
+ objfile->name = mstrsave (objfile->md, "rt_common");
+
+ /* Add this file onto the tail of the linked list of other such files. */
+
+ objfile->next = NULL;
+ if (object_files == NULL)
+ object_files = objfile;
+ else
+ {
+ for (last_one = object_files;
+ last_one->next;
+ last_one = last_one->next);
+ last_one->next = objfile;
+ }
+
+ rt_common_objfile = objfile;
+}
+
+/* Read all dynamically loaded common symbol definitions from the inferior
+ and put them into the minimal symbol table for the runtime common
+ objfile. */
+
+static void
+solib_add_common_symbols (CORE_ADDR rtc_symp)
+{
+ struct rtc_symb inferior_rtc_symb;
+ struct nlist inferior_rtc_nlist;
+ int len;
+ char *name;
+
+ /* Remove any runtime common symbols from previous runs. */
+
+ if (rt_common_objfile != NULL && rt_common_objfile->minimal_symbol_count)
+ {
+ obstack_free (&rt_common_objfile->symbol_obstack, 0);
+ obstack_specify_allocation (&rt_common_objfile->symbol_obstack, 0, 0,
+ xmalloc, free);
+ rt_common_objfile->minimal_symbol_count = 0;
+ rt_common_objfile->msymbols = NULL;
+ }
+
+ init_minimal_symbol_collection ();
+ make_cleanup_discard_minimal_symbols ();
+
+ while (rtc_symp)
+ {
+ read_memory (rtc_symp,
+ (char *) &inferior_rtc_symb,
+ sizeof (inferior_rtc_symb));
+ read_memory (SOLIB_EXTRACT_ADDRESS (inferior_rtc_symb.rtc_sp),
+ (char *) &inferior_rtc_nlist,
+ sizeof (inferior_rtc_nlist));
+ if (inferior_rtc_nlist.n_type == N_COMM)
+ {
+ /* FIXME: The length of the symbol name is not available, but in the
+ current implementation the common symbol is allocated immediately
+ behind the name of the symbol. */
+ len = inferior_rtc_nlist.n_value - inferior_rtc_nlist.n_un.n_strx;
+
+ name = xmalloc (len);
+ read_memory (SOLIB_EXTRACT_ADDRESS (inferior_rtc_nlist.n_un.n_name),
+ name, len);
+
+ /* Allocate the runtime common objfile if necessary. */
+ if (rt_common_objfile == NULL)
+ allocate_rt_common_objfile ();
+
+ prim_record_minimal_symbol (name, inferior_rtc_nlist.n_value,
+ mst_bss, rt_common_objfile);
+ free (name);
+ }
+ rtc_symp = SOLIB_EXTRACT_ADDRESS (inferior_rtc_symb.rtc_next);
+ }
+
+ /* Install any minimal symbols that have been collected as the current
+ minimal symbols for the runtime common objfile. */
+
+ install_minimal_symbols (rt_common_objfile);
+}
+
+#endif /* SVR4_SHARED_LIBS */
+
+
+#ifdef SVR4_SHARED_LIBS
+
+static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
+
+/*
+
+ LOCAL FUNCTION
+
+ bfd_lookup_symbol -- lookup the value for a specific symbol
+
+ SYNOPSIS
+
+ CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname)
+
+ DESCRIPTION
+
+ An expensive way to lookup the value of a single symbol for
+ bfd's that are only temporary anyway. This is used by the
+ shared library support to find the address of the debugger
+ interface structures in the shared library.
+
+ Note that 0 is specifically allowed as an error return (no
+ such symbol).
+ */
+
+static CORE_ADDR
+bfd_lookup_symbol (bfd *abfd, char *symname)
+{
+ unsigned int storage_needed;
+ asymbol *sym;
+ asymbol **symbol_table;
+ unsigned int number_of_symbols;
+ unsigned int i;
+ struct cleanup *back_to;
+ CORE_ADDR symaddr = 0;
+
+ storage_needed = bfd_get_symtab_upper_bound (abfd);
+
+ if (storage_needed > 0)
+ {
+ symbol_table = (asymbol **) xmalloc (storage_needed);
+ back_to = make_cleanup (free, (PTR) symbol_table);
+ number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
+
+ for (i = 0; i < number_of_symbols; i++)
+ {
+ sym = *symbol_table++;
+ if (STREQ (sym->name, symname))
+ {
+ /* Bfd symbols are section relative. */
+ symaddr = sym->value + sym->section->vma;
+ break;
+ }
+ }
+ do_cleanups (back_to);
+ }
+
+ if (symaddr)
+ return symaddr;
+
+ /* On FreeBSD, the dynamic linker is stripped by default. So we'll
+ have to check the dynamic string table too. */
+
+ storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
+
+ if (storage_needed > 0)
+ {
+ symbol_table = (asymbol **) xmalloc (storage_needed);
+ back_to = make_cleanup (free, (PTR) symbol_table);
+ number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
+
+ for (i = 0; i < number_of_symbols; i++)
+ {
+ sym = *symbol_table++;
+ if (STREQ (sym->name, symname))
+ {
+ /* Bfd symbols are section relative. */
+ symaddr = sym->value + sym->section->vma;
+ break;
+ }
+ }
+ do_cleanups (back_to);
+ }
+
+ return symaddr;
+}
+
+#ifdef HANDLE_SVR4_EXEC_EMULATORS
+
+/*
+ Solaris BCP (the part of Solaris which allows it to run SunOS4
+ a.out files) throws in another wrinkle. Solaris does not fill
+ in the usual a.out link map structures when running BCP programs,
+ the only way to get at them is via groping around in the dynamic
+ linker.
+ The dynamic linker and it's structures are located in the shared
+ C library, which gets run as the executable's "interpreter" by
+ the kernel.
+
+ Note that we can assume nothing about the process state at the time
+ we need to find these structures. We may be stopped on the first
+ instruction of the interpreter (C shared library), the first
+ instruction of the executable itself, or somewhere else entirely
+ (if we attached to the process for example).
+ */
+
+static char *debug_base_symbols[] =
+{
+ "r_debug", /* Solaris 2.3 */
+ "_r_debug", /* Solaris 2.1, 2.2 */
+ NULL
+};
+
+static int look_for_base (int, CORE_ADDR);
+
+/*
+
+ LOCAL FUNCTION
+
+ look_for_base -- examine file for each mapped address segment
+
+ SYNOPSYS
+
+ static int look_for_base (int fd, CORE_ADDR baseaddr)
+
+ DESCRIPTION
+
+ This function is passed to proc_iterate_over_mappings, which
+ causes it to get called once for each mapped address space, with
+ an open file descriptor for the file mapped to that space, and the
+ base address of that mapped space.
+
+ Our job is to find the debug base symbol in the file that this
+ fd is open on, if it exists, and if so, initialize the dynamic
+ linker structure base address debug_base.
+
+ Note that this is a computationally expensive proposition, since
+ we basically have to open a bfd on every call, so we specifically
+ avoid opening the exec file.
+ */
+
+static int
+look_for_base (int fd, CORE_ADDR baseaddr)
+{
+ bfd *interp_bfd;
+ CORE_ADDR address = 0;
+ char **symbolp;
+
+ /* If the fd is -1, then there is no file that corresponds to this
+ mapped memory segment, so skip it. Also, if the fd corresponds
+ to the exec file, skip it as well. */
+
+ if (fd == -1
+ || (exec_bfd != NULL
+ && fdmatch (fileno ((FILE *) (exec_bfd->iostream)), fd)))
+ {
+ return (0);
+ }
+
+ /* Try to open whatever random file this fd corresponds to. Note that
+ 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", gnutarget, fd)) == NULL)
+ {
+ return (0);
+ }
+ if (!bfd_check_format (interp_bfd, bfd_object))
+ {
+ /* FIXME-leak: on failure, might not free all memory associated with
+ interp_bfd. */
+ bfd_close (interp_bfd);
+ return (0);
+ }
+
+ /* Now try to find our debug base symbol in this file, which we at
+ least know to be a valid ELF executable or shared library. */
+
+ for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
+ {
+ address = bfd_lookup_symbol (interp_bfd, *symbolp);
+ if (address != 0)
+ {
+ break;
+ }
+ }
+ if (address == 0)
+ {
+ /* FIXME-leak: on failure, might not free all memory associated with
+ interp_bfd. */
+ bfd_close (interp_bfd);
+ return (0);
+ }
+
+ /* Eureka! We found the symbol. But now we may need to relocate it
+ by the base address. If the symbol's value is less than the base
+ address of the shared library, then it hasn't yet been relocated
+ by the dynamic linker, and we have to do it ourself. FIXME: Note
+ that we make the assumption that the first segment that corresponds
+ to the shared library has the base address to which the library
+ was relocated. */
+
+ if (address < baseaddr)
+ {
+ address += baseaddr;
+ }
+ debug_base = address;
+ /* FIXME-leak: on failure, might not free all memory associated with
+ interp_bfd. */
+ bfd_close (interp_bfd);
+ return (1);
+}
+#endif /* HANDLE_SVR4_EXEC_EMULATORS */
+
+/*
+
+ LOCAL FUNCTION
+
+ elf_locate_base -- locate the base address of dynamic linker structs
+ for SVR4 elf targets.
+
+ SYNOPSIS
+
+ CORE_ADDR elf_locate_base (void)
+
+ DESCRIPTION
+
+ For SVR4 elf targets the address of the dynamic linker's runtime
+ structure is contained within the dynamic info section in the
+ executable file. The dynamic section is also mapped into the
+ inferior address space. Because the runtime loader fills in the
+ real address before starting the inferior, we have to read in the
+ dynamic info section from the inferior address space.
+ If there are any errors while trying to find the address, we
+ silently return 0, otherwise the found address is returned.
+
+ */
+
+static CORE_ADDR
+elf_locate_base (void)
+{
+ sec_ptr dyninfo_sect;
+ int dyninfo_sect_size;
+ CORE_ADDR dyninfo_addr;
+ char *buf;
+ char *bufend;
+ int arch_size;
+
+ /* Find the start address of the .dynamic section. */
+ dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic");
+ if (dyninfo_sect == NULL)
+ return 0;
+ dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect);
+
+ /* Read in .dynamic section, silently ignore errors. */
+ dyninfo_sect_size = bfd_section_size (exec_bfd, dyninfo_sect);
+ buf = alloca (dyninfo_sect_size);
+ if (target_read_memory (dyninfo_addr, buf, dyninfo_sect_size))
+ return 0;
+
+ /* Find the DT_DEBUG entry in the the .dynamic section.
+ For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
+ no DT_DEBUG entries. */
+
+ arch_size = bfd_get_arch_size (exec_bfd);
+ if (arch_size == -1) /* failure */
+ return 0;
+
+ if (arch_size == 32)
+ { /* 32-bit elf */
+ for (bufend = buf + dyninfo_sect_size;
+ buf < bufend;
+ buf += sizeof (Elf32_External_Dyn))
+ {
+ Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf;
+ long dyn_tag;
+ CORE_ADDR dyn_ptr;
+
+ dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
+ if (dyn_tag == DT_NULL)
+ break;
+ else if (dyn_tag == DT_DEBUG)
+ {
+ dyn_ptr = bfd_h_get_32 (exec_bfd,
+ (bfd_byte *) x_dynp->d_un.d_ptr);
+ return dyn_ptr;
+ }
+#ifdef DT_MIPS_RLD_MAP
+ else if (dyn_tag == DT_MIPS_RLD_MAP)
+ {
+ char *pbuf;
+
+ pbuf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
+ /* DT_MIPS_RLD_MAP contains a pointer to the address
+ of the dynamic link structure. */
+ dyn_ptr = bfd_h_get_32 (exec_bfd,
+ (bfd_byte *) x_dynp->d_un.d_ptr);
+ if (target_read_memory (dyn_ptr, pbuf, sizeof (pbuf)))
+ return 0;
+ return extract_unsigned_integer (pbuf, sizeof (pbuf));
+ }
+#endif
+ }
+ }
+ else /* 64-bit elf */
+ {
+ for (bufend = buf + dyninfo_sect_size;
+ buf < bufend;
+ buf += sizeof (Elf64_External_Dyn))
+ {
+ Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf;
+ long dyn_tag;
+ CORE_ADDR dyn_ptr;
+
+ dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
+ if (dyn_tag == DT_NULL)
+ break;
+ else if (dyn_tag == DT_DEBUG)
+ {
+ dyn_ptr = bfd_h_get_64 (exec_bfd,
+ (bfd_byte *) x_dynp->d_un.d_ptr);
+ return dyn_ptr;
+ }
+ }
+ }
+
+ /* DT_DEBUG entry not found. */
+ return 0;
+}
+
+#endif /* SVR4_SHARED_LIBS */
+
+/*
+
+ LOCAL FUNCTION
+
+ locate_base -- locate the base address of dynamic linker structs
+
+ SYNOPSIS
+
+ CORE_ADDR locate_base (void)
+
+ DESCRIPTION
+
+ For both the SunOS and SVR4 shared library implementations, if the
+ inferior executable has been linked dynamically, there is a single
+ address somewhere in the inferior's data space which is the key to
+ locating all of the dynamic linker's runtime structures. This
+ address is the value of the debug base symbol. The job of this
+ function is to find and return that address, or to return 0 if there
+ is no such address (the executable is statically linked for example).
+
+ For SunOS, the job is almost trivial, since the dynamic linker and
+ all of it's structures are statically linked to the executable at
+ link time. Thus the symbol for the address we are looking for has
+ already been added to the minimal symbol table for the executable's
+ objfile at the time the symbol file's symbols were read, and all we
+ have to do is look it up there. Note that we explicitly do NOT want
+ to find the copies in the shared library.
+
+ The SVR4 version is a bit more complicated because the address
+ is contained somewhere in the dynamic info section. We have to go
+ to a lot more work to discover the address of the debug base symbol.
+ Because of this complexity, we cache the value we find and return that
+ value on subsequent invocations. Note there is no copy in the
+ executable symbol tables.
+
+ */
+
+static CORE_ADDR
+locate_base (void)
+{
+
+#ifndef SVR4_SHARED_LIBS
+
+ struct minimal_symbol *msymbol;
+ CORE_ADDR address = 0;
+ char **symbolp;
+
+ /* For SunOS, we want to limit the search for the debug base symbol to the
+ executable being debugged, since there is a duplicate named symbol in the
+ shared library. We don't want the shared library versions. */
+
+ for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
+ {
+ msymbol = lookup_minimal_symbol (*symbolp, NULL, symfile_objfile);
+ if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+ {
+ address = SYMBOL_VALUE_ADDRESS (msymbol);
+ return (address);
+ }
+ }
+ return (0);
+
+#else /* SVR4_SHARED_LIBS */
+
+ /* Check to see if we have a currently valid address, and if so, avoid
+ doing all this work again and just return the cached address. If
+ we have no cached address, try to locate it in the dynamic info
+ section for ELF executables. */
+
+ if (debug_base == 0)
+ {
+ if (exec_bfd != NULL
+ && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
+ debug_base = elf_locate_base ();
+#ifdef HANDLE_SVR4_EXEC_EMULATORS
+ /* Try it the hard way for emulated executables. */
+ else if (inferior_pid != 0 && target_has_execution)
+ proc_iterate_over_mappings (look_for_base);
+#endif
+ }
+ return (debug_base);
+
+#endif /* !SVR4_SHARED_LIBS */
+
+}
+
+/*
+
+ LOCAL FUNCTION
+
+ first_link_map_member -- locate first member in dynamic linker's map
+
+ SYNOPSIS
+
+ static CORE_ADDR first_link_map_member (void)
+
+ DESCRIPTION
+
+ Find the first element in the inferior's dynamic link map, and
+ return its address in the inferior. This function doesn't copy the
+ link map entry itself into our address space; current_sos actually
+ does the reading. */
+
+static CORE_ADDR
+first_link_map_member (void)
+{
+ CORE_ADDR lm = 0;
+
+#ifndef SVR4_SHARED_LIBS
+
+ read_memory (debug_base, (char *) &dynamic_copy, sizeof (dynamic_copy));
+ if (dynamic_copy.ld_version >= 2)
+ {
+ /* It is a version that we can deal with, so read in the secondary
+ structure and find the address of the link map list from it. */
+ read_memory (SOLIB_EXTRACT_ADDRESS (dynamic_copy.ld_un.ld_2),
+ (char *) &ld_2_copy, sizeof (struct link_dynamic_2));
+ lm = SOLIB_EXTRACT_ADDRESS (ld_2_copy.ld_loaded);
+ }
+
+#else /* SVR4_SHARED_LIBS */
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+ char *r_map_buf = xmalloc (lmo->r_map_size);
+ struct cleanup *cleanups = make_cleanup (free, r_map_buf);
+
+ read_memory (debug_base + lmo->r_map_offset, r_map_buf, lmo->r_map_size);
+
+ /* FIXME (maybe?): A previous version of this code used
+ SOLIB_EXTRACT_ADDRESS here. */
+ lm = extract_address (r_map_buf, lmo->r_map_size);
+
+ /* FIXME: Perhaps we should validate the info somehow, perhaps by
+ checking r_version for a known version number, or r_state for
+ RT_CONSISTENT. */
+
+ do_cleanups (cleanups);
+
+#endif /* !SVR4_SHARED_LIBS */
+
+ return (lm);
+}
+
+#ifdef SVR4_SHARED_LIBS
+/*
+
+ LOCAL FUNCTION
+
+ open_symbol_file_object
+
+ SYNOPSIS
+
+ void open_symbol_file_object (int from_tty)
+
+ DESCRIPTION
+
+ If no open symbol file, attempt to locate and open the main symbol
+ file. On SVR4 systems, this is the first link map entry. If its
+ name is here, we can open it. Useful when attaching to a process
+ without first loading its symbol file.
+
+ If FROM_TTYP dereferences to a non-zero integer, allow messages to
+ be printed. This parameter is a pointer rather than an int because
+ open_symbol_file_object() is called via catch_errors() and
+ catch_errors() requires a pointer argument. */
+
+static int
+open_symbol_file_object (int *from_ttyp)
+{
+ CORE_ADDR lm, l_name;
+ char *filename;
+ int errcode;
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+ char *l_name_buf = xmalloc (lmo->l_name_size);
+ struct cleanup *cleanups = make_cleanup (free, l_name_buf);
+
+ if (symfile_objfile)
+ if (!query ("Attempt to reload symbols from process? "))
+ return 0;
+
+ if ((debug_base = locate_base ()) == 0)
+ return 0; /* failed somehow... */
+
+ /* First link map member should be the executable. */
+ if ((lm = first_link_map_member ()) == 0)
+ return 0; /* failed somehow... */
+
+ /* Read address of name from target memory to GDB. */
+ read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size);
+
+ /* Convert the address to host format. */
+ l_name = extract_address (l_name_buf, lmo->l_name_size);
+
+ /* Free l_name_buf. */
+ do_cleanups (cleanups);
+
+ if (l_name == 0)
+ return 0; /* No filename. */
+
+ /* Now fetch the filename from target memory. */
+ target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
+
+ if (errcode)
+ {
+ warning ("failed to read exec filename from attached file: %s",
+ safe_strerror (errcode));
+ return 0;
+ }
+
+ make_cleanup (free, filename);
+ /* Have a pathname: read the symbol file. */
+ symbol_file_command (filename, *from_ttyp);
+
+ return 1;
+}
+#else
+
+static int
+open_symbol_file_object (int *from_ttyp)
+{
+ return 1;
+}
+
+#endif /* SVR4_SHARED_LIBS */
+
+
+/* LOCAL FUNCTION
+
+ current_sos -- build a list of currently loaded shared objects
+
+ SYNOPSIS
+
+ struct so_list *current_sos ()
+
+ DESCRIPTION
+
+ Build a list of `struct so_list' objects describing the shared
+ objects currently loaded in the inferior. This list does not
+ include an entry for the main executable file.
+
+ Note that we only gather information directly available from the
+ inferior --- we don't examine any of the shared library files
+ themselves. The declaration of `struct so_list' says which fields
+ we provide values for. */
+
+static struct so_list *
+svr4_current_sos (void)
+{
+ CORE_ADDR lm;
+ struct so_list *head = 0;
+ struct so_list **link_ptr = &head;
+
+ /* Make sure we've looked up the inferior's dynamic linker's base
+ structure. */
+ if (! debug_base)
+ {
+ debug_base = locate_base ();
+
+ /* If we can't find the dynamic linker's base structure, this
+ must not be a dynamically linked executable. Hmm. */
+ if (! debug_base)
+ return 0;
+ }
+
+ /* Walk the inferior's link map list, and build our list of
+ `struct so_list' nodes. */
+ lm = first_link_map_member ();
+ while (lm)
+ {
+ struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
+ struct so_list *new
+ = (struct so_list *) xmalloc (sizeof (struct so_list));
+ struct cleanup *old_chain = make_cleanup (free, new);
+
+ memset (new, 0, sizeof (*new));
+
+ new->lm_info = xmalloc (sizeof (struct lm_info));
+ make_cleanup (free, new->lm_info);
+
+ new->lm_info->lm = xmalloc (lmo->link_map_size);
+ make_cleanup (free, new->lm_info->lm);
+ memset (new->lm_info->lm, 0, lmo->link_map_size);
+
+ read_memory (lm, new->lm_info->lm, lmo->link_map_size);
+
+ lm = LM_NEXT (new);
+
+ /* For SVR4 versions, the first entry in the link map is for the
+ inferior executable, so we must ignore it. For some versions of
+ SVR4, it has no name. For others (Solaris 2.3 for example), it
+ does have a name, so we can no longer use a missing name to
+ decide when to ignore it. */
+ if (IGNORE_FIRST_LINK_MAP_ENTRY (new))
+ free_so (new);
+ else
+ {
+ int errcode;
+ char *buffer;
+
+ /* Extract this shared object's name. */
+ target_read_string (LM_NAME (new), &buffer,
+ SO_NAME_MAX_PATH_SIZE - 1, &errcode);
+ if (errcode != 0)
+ {
+ warning ("current_sos: Can't read pathname for load map: %s\n",
+ safe_strerror (errcode));
+ }
+ else
+ {
+ strncpy (new->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
+ free (buffer);
+ strcpy (new->so_original_name, new->so_name);
+ }
+
+ /* If this entry has no name, or its name matches the name
+ for the main executable, don't include it in the list. */
+ if (! new->so_name[0]
+ || match_main (new->so_name))
+ free_so (new);
+ else
+ {
+ new->next = 0;
+ *link_ptr = new;
+ link_ptr = &new->next;
+ }
+ }
+
+ discard_cleanups (old_chain);
+ }
+
+ return head;
+}
+
+
+/* On some systems, the only way to recognize the link map entry for
+ the main executable file is by looking at its name. Return
+ non-zero iff SONAME matches one of the known main executable names. */
+
+static int
+match_main (char *soname)
+{
+ char **mainp;
+
+ for (mainp = main_name_list; *mainp != NULL; mainp++)
+ {
+ if (strcmp (soname, *mainp) == 0)
+ return (1);
+ }
+
+ return (0);
+}
+
+
+#ifdef SVR4_SHARED_LIBS
+
+/* Return 1 if PC lies in the dynamic symbol resolution code of the
+ SVR4 run time loader. */
+
+static CORE_ADDR interp_text_sect_low;
+static CORE_ADDR interp_text_sect_high;
+static CORE_ADDR interp_plt_sect_low;
+static CORE_ADDR interp_plt_sect_high;
+
+int
+in_svr4_dynsym_resolve_code (CORE_ADDR pc)
+{
+ return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
+ || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
+ || in_plt_section (pc, NULL));
+}
+#endif
+
+/*
+
+ LOCAL FUNCTION
+
+ disable_break -- remove the "mapping changed" breakpoint
+
+ SYNOPSIS
+
+ static int disable_break ()
+
+ DESCRIPTION
+
+ Removes the breakpoint that gets hit when the dynamic linker
+ completes a mapping change.
+
+ */
+
+#ifndef SVR4_SHARED_LIBS
+
+static int
+disable_break (void)
+{
+ int status = 1;
+
+ int in_debugger = 0;
+
+ /* Read the debugger structure from the inferior to retrieve the
+ address of the breakpoint and the original contents of the
+ breakpoint address. Remove the breakpoint by writing the original
+ contents back. */
+
+ read_memory (debug_addr, (char *) &debug_copy, sizeof (debug_copy));
+
+ /* Set `in_debugger' to zero now. */
+
+ write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
+
+ breakpoint_addr = SOLIB_EXTRACT_ADDRESS (debug_copy.ldd_bp_addr);
+ write_memory (breakpoint_addr, (char *) &debug_copy.ldd_bp_inst,
+ sizeof (debug_copy.ldd_bp_inst));
+
+ /* For the SVR4 version, we always know the breakpoint address. For the
+ SunOS version we don't know it until the above code is executed.
+ Grumble if we are stopped anywhere besides the breakpoint address. */
+
+ if (stop_pc != breakpoint_addr)
+ {
+ warning ("stopped at unknown breakpoint while handling shared libraries");
+ }
+
+ return (status);
+}
+
+#endif /* #ifdef SVR4_SHARED_LIBS */
+
+/*
+
+ LOCAL FUNCTION
+
+ enable_break -- arrange for dynamic linker to hit breakpoint
+
+ SYNOPSIS
+
+ int enable_break (void)
+
+ DESCRIPTION
+
+ Both the SunOS and the SVR4 dynamic linkers have, as part of their
+ debugger interface, support for arranging for the inferior to hit
+ a breakpoint after mapping in the shared libraries. This function
+ enables that breakpoint.
+
+ For SunOS, there is a special flag location (in_debugger) which we
+ set to 1. When the dynamic linker sees this flag set, it will set
+ a breakpoint at a location known only to itself, after saving the
+ original contents of that place and the breakpoint address itself,
+ in it's own internal structures. When we resume the inferior, it
+ will eventually take a SIGTRAP when it runs into the breakpoint.
+ We handle this (in a different place) by restoring the contents of
+ the breakpointed location (which is only known after it stops),
+ chasing around to locate the shared libraries that have been
+ loaded, then resuming.
+
+ For SVR4, the debugger interface structure contains a member (r_brk)
+ which is statically initialized at the time the shared library is
+ built, to the offset of a function (_r_debug_state) which is guaran-
+ teed to be called once before mapping in a library, and again when
+ the mapping is complete. At the time we are examining this member,
+ it contains only the unrelocated offset of the function, so we have
+ to do our own relocation. Later, when the dynamic linker actually
+ runs, it relocates r_brk to be the actual address of _r_debug_state().
+
+ The debugger interface structure also contains an enumeration which
+ is set to either RT_ADD or RT_DELETE prior to changing the mapping,
+ depending upon whether or not the library is being mapped or unmapped,
+ and then set to RT_CONSISTENT after the library is mapped/unmapped.
+ */
+
+static int
+enable_break (void)
+{
+ int success = 0;
+
+#ifndef SVR4_SHARED_LIBS
+
+ int j;
+ int in_debugger;
+
+ /* Get link_dynamic structure */
+
+ j = target_read_memory (debug_base, (char *) &dynamic_copy,
+ sizeof (dynamic_copy));
+ if (j)
+ {
+ /* unreadable */
+ return (0);
+ }
+
+ /* Calc address of debugger interface structure */
+
+ debug_addr = SOLIB_EXTRACT_ADDRESS (dynamic_copy.ldd);
+
+ /* Calc address of `in_debugger' member of debugger interface structure */
+
+ flag_addr = debug_addr + (CORE_ADDR) ((char *) &debug_copy.ldd_in_debugger -
+ (char *) &debug_copy);
+
+ /* Write a value of 1 to this member. */
+
+ in_debugger = 1;
+ write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
+ success = 1;
+
+#else /* SVR4_SHARED_LIBS */
+
+#ifdef BKPT_AT_SYMBOL
+
+ struct minimal_symbol *msymbol;
+ char **bkpt_namep;
+ asection *interp_sect;
+
+ /* First, remove all the solib event breakpoints. Their addresses
+ may have changed since the last time we ran the program. */
+ remove_solib_event_breakpoints ();
+
+#ifdef SVR4_SHARED_LIBS
+ interp_text_sect_low = interp_text_sect_high = 0;
+ interp_plt_sect_low = interp_plt_sect_high = 0;
+
+ /* Find the .interp section; if not found, warn the user and drop
+ into the old breakpoint at symbol code. */
+ interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
+ if (interp_sect)
+ {
+ unsigned int interp_sect_size;
+ char *buf;
+ CORE_ADDR load_addr;
+ bfd *tmp_bfd;
+ CORE_ADDR sym_addr = 0;
+
+ /* Read the contents of the .interp section into a local buffer;
+ the contents specify the dynamic linker this program uses. */
+ interp_sect_size = bfd_section_size (exec_bfd, interp_sect);
+ buf = alloca (interp_sect_size);
+ bfd_get_section_contents (exec_bfd, interp_sect,
+ buf, 0, interp_sect_size);
+
+ /* Now we need to figure out where the dynamic linker was
+ loaded so that we can load its symbols and place a breakpoint
+ in the dynamic linker itself.
+
+ This address is stored on the stack. However, I've been unable
+ to find any magic formula to find it for Solaris (appears to
+ be trivial on GNU/Linux). Therefore, we have to try an alternate
+ mechanism to find the dynamic linker's base address. */
+ tmp_bfd = bfd_openr (buf, gnutarget);
+ if (tmp_bfd == NULL)
+ goto bkpt_at_symbol;
+
+ /* Make sure the dynamic linker's really a useful object. */
+ if (!bfd_check_format (tmp_bfd, bfd_object))
+ {
+ warning ("Unable to grok dynamic linker %s as an object file", buf);
+ bfd_close (tmp_bfd);
+ goto bkpt_at_symbol;
+ }
+
+ /* We find the dynamic linker's base address by examining the
+ current pc (which point at the entry point for the dynamic
+ linker) and subtracting the offset of the entry point. */
+ load_addr = read_pc () - tmp_bfd->start_address;
+
+ /* Record the relocated start and end address of the dynamic linker
+ text and plt section for in_svr4_dynsym_resolve_code. */
+ interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
+ if (interp_sect)
+ {
+ interp_text_sect_low =
+ bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
+ interp_text_sect_high =
+ interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect);
+ }
+ interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
+ if (interp_sect)
+ {
+ interp_plt_sect_low =
+ bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
+ interp_plt_sect_high =
+ interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
+ }
+
+ /* Now try to set a breakpoint in the dynamic linker. */
+ for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
+ {
+ sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep);
+ if (sym_addr != 0)
+ break;
+ }
+
+ /* We're done with the temporary bfd. */
+ bfd_close (tmp_bfd);
+
+ if (sym_addr != 0)
+ {
+ create_solib_event_breakpoint (load_addr + sym_addr);
+ return 1;
+ }
+
+ /* For whatever reason we couldn't set a breakpoint in the dynamic
+ linker. Warn and drop into the old code. */
+ bkpt_at_symbol:
+ warning ("Unable to find dynamic linker breakpoint function.\nGDB will be unable to debug shared library initializers\nand track explicitly loaded dynamic code.");
+ }
+#endif
+
+ /* Scan through the list of symbols, trying to look up the symbol and
+ set a breakpoint there. Terminate loop when we/if we succeed. */
+
+ breakpoint_addr = 0;
+ for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
+ {
+ msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
+ if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+ {
+ create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
+ return 1;
+ }
+ }
+
+ /* Nothing good happened. */
+ success = 0;
+
+#endif /* BKPT_AT_SYMBOL */
+
+#endif /* !SVR4_SHARED_LIBS */
+
+ return (success);
+}
+
+/*
+
+ LOCAL FUNCTION
+
+ special_symbol_handling -- additional shared library symbol handling
+
+ SYNOPSIS
+
+ void special_symbol_handling ()
+
+ DESCRIPTION
+
+ Once the symbols from a shared object have been loaded in the usual
+ way, we are called to do any system specific symbol handling that
+ is needed.
+
+ For SunOS4, this consists of grunging around in the dynamic
+ linkers structures to find symbol definitions for "common" symbols
+ and adding them to the minimal symbol table for the runtime common
+ objfile.
+
+ */
+
+static void
+svr4_special_symbol_handling (void)
+{
+#ifndef SVR4_SHARED_LIBS
+ int j;
+
+ if (debug_addr == 0)
+ {
+ /* Get link_dynamic structure */
+
+ j = target_read_memory (debug_base, (char *) &dynamic_copy,
+ sizeof (dynamic_copy));
+ if (j)
+ {
+ /* unreadable */
+ return;
+ }
+
+ /* Calc address of debugger interface structure */
+ /* FIXME, this needs work for cross-debugging of core files
+ (byteorder, size, alignment, etc). */
+
+ debug_addr = SOLIB_EXTRACT_ADDRESS (dynamic_copy.ldd);
+ }
+
+ /* Read the debugger structure from the inferior, just to make sure
+ we have a current copy. */
+
+ j = target_read_memory (debug_addr, (char *) &debug_copy,
+ sizeof (debug_copy));
+ if (j)
+ return; /* unreadable */
+
+ /* Get common symbol definitions for the loaded object. */
+
+ if (debug_copy.ldd_cp)
+ {
+ solib_add_common_symbols (SOLIB_EXTRACT_ADDRESS (debug_copy.ldd_cp));
+ }
+
+#endif /* !SVR4_SHARED_LIBS */
+}
+
+/*
+
+ GLOBAL FUNCTION
+
+ svr4_solib_create_inferior_hook -- shared library startup support
+
+ SYNOPSIS
+
+ void svr4_solib_create_inferior_hook()
+
+ DESCRIPTION
+
+ When gdb starts up the inferior, it nurses it along (through the
+ shell) until it is ready to execute it's first instruction. At this
+ point, this function gets called via expansion of the macro
+ SOLIB_CREATE_INFERIOR_HOOK.
+
+ For SunOS executables, this first instruction is typically the
+ one at "_start", or a similar text label, regardless of whether
+ the executable is statically or dynamically linked. The runtime
+ startup code takes care of dynamically linking in any shared
+ libraries, once gdb allows the inferior to continue.
+
+ For SVR4 executables, this first instruction is either the first
+ instruction in the dynamic linker (for dynamically linked
+ executables) or the instruction at "start" for statically linked
+ executables. For dynamically linked executables, the system
+ first exec's /lib/libc.so.N, which contains the dynamic linker,
+ and starts it running. The dynamic linker maps in any needed
+ shared libraries, maps in the actual user executable, and then
+ jumps to "start" in the user executable.
+
+ For both SunOS shared libraries, and SVR4 shared libraries, we
+ can arrange to cooperate with the dynamic linker to discover the
+ names of shared libraries that are dynamically linked, and the
+ base addresses to which they are linked.
+
+ This function is responsible for discovering those names and
+ addresses, and saving sufficient information about them to allow
+ their symbols to be read at a later time.
+
+ FIXME
+
+ Between enable_break() and disable_break(), this code does not
+ properly handle hitting breakpoints which the user might have
+ set in the startup code or in the dynamic linker itself. Proper
+ handling will probably have to wait until the implementation is
+ changed to use the "breakpoint handler function" method.
+
+ Also, what if child has exit()ed? Must exit loop somehow.
+ */
+
+void
+svr4_solib_create_inferior_hook (void)
+{
+ /* If we are using the BKPT_AT_SYMBOL code, then we don't need the base
+ yet. In fact, in the case of a SunOS4 executable being run on
+ Solaris, we can't get it yet. current_sos will get it when it needs
+ it. */
+#if !(defined (SVR4_SHARED_LIBS) && defined (BKPT_AT_SYMBOL))
+ if ((debug_base = locate_base ()) == 0)
+ {
+ /* Can't find the symbol or the executable is statically linked. */
+ return;
+ }
+#endif
+
+ if (!enable_break ())
+ {
+ warning ("shared library handler failed to enable breakpoint");
+ return;
+ }
+
+#if !defined(SVR4_SHARED_LIBS) || defined(_SCO_DS)
+ /* SCO and SunOS need the loop below, other systems should be using the
+ special shared library breakpoints and the shared library breakpoint
+ service routine.
+
+ Now run the target. It will eventually hit the breakpoint, at
+ which point all of the libraries will have been mapped in and we
+ can go groveling around in the dynamic linker structures to find
+ out what we need to know about them. */
+
+ clear_proceed_status ();
+ stop_soon_quietly = 1;
+ stop_signal = TARGET_SIGNAL_0;
+ do
+ {
+ target_resume (-1, 0, stop_signal);
+ wait_for_inferior ();
+ }
+ while (stop_signal != TARGET_SIGNAL_TRAP);
+ stop_soon_quietly = 0;
+
+#if !defined(_SCO_DS)
+ /* We are now either at the "mapping complete" breakpoint (or somewhere
+ else, a condition we aren't prepared to deal with anyway), so adjust
+ the PC as necessary after a breakpoint, disable the breakpoint, and
+ add any shared libraries that were mapped in. */
+
+ if (DECR_PC_AFTER_BREAK)
+ {
+ stop_pc -= DECR_PC_AFTER_BREAK;
+ write_register (PC_REGNUM, stop_pc);
+ }
+
+ if (!disable_break ())
+ {
+ warning ("shared library handler failed to disable breakpoint");
+ }
+
+ if (auto_solib_add)
+ solib_add ((char *) 0, 0, (struct target_ops *) 0);
+#endif /* ! _SCO_DS */
+#endif
+}
+
+static void
+svr4_clear_solib (void)
+{
+ debug_base = 0;
+}
+
+static void
+svr4_free_so (struct so_list *so)
+{
+ free (so->lm_info->lm);
+ free (so->lm_info);
+}
+
+static struct target_so_ops svr4_so_ops;
+
+void
+_initialize_svr4_solib (void)
+{
+ svr4_so_ops.lm_addr = LM_ADDR;
+ svr4_so_ops.free_so = svr4_free_so;
+ svr4_so_ops.clear_solib = svr4_clear_solib;
+ svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
+ svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
+ svr4_so_ops.current_sos = svr4_current_sos;
+ svr4_so_ops.open_symbol_file_object = open_symbol_file_object;
+
+ /* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */
+ current_target_so_ops = &svr4_so_ops;
+}
+
Index: solib-svr4.h
===================================================================
RCS file: solib-svr4.h
diff -N solib-svr4.h
--- /dev/null Tue May 5 13:32:27 1998
+++ solib-svr4.h Sun Oct 22 17:43:54 2000
@@ -0,0 +1,70 @@
+/* Handle shared libraries for GDB, the GNU Debugger.
+ Copyright 2000
+ 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. */
+
+/* Critical offsets and sizes which describe struct r_debug and
+ struct link_map on SVR4-like targets. All offsets and sizes are
+ in bytes unless otherwise specified. */
+
+struct link_map_offsets
+ {
+ /* Size of struct r_debug (or equivalent), or at least enough of it to
+ be able to obtain the r_map field. */
+ int r_debug_size;
+
+ /* Offset to the r_map field in struct r_debug. */
+ int r_map_offset;
+
+ /* Size of the r_map field in struct r_debug. */
+ int r_map_size;
+
+ /* Size of struct link_map (or equivalent), or at least enough of it
+ to be able to obtain the fields below. */
+ int link_map_size;
+
+ /* Offset to l_addr field in struct link_map. */
+ int l_addr_offset;
+
+ /* Size of l_addr field in struct link_map. */
+ int l_addr_size;
+
+ /* Offset to l_next field in struct link_map. */
+ int l_next_offset;
+
+ /* Size of l_next field in struct link_map. */
+ int l_next_size;
+
+ /* Offset to l_prev field in struct link_map. */
+ int l_prev_offset;
+
+ /* Size of l_prev field in struct link_map. */
+ int l_prev_size;
+
+ /* Offset to l_name field in struct link_map. */
+ int l_name_offset;
+
+ /* Size of l_name field in struct link_map. */
+ int l_name_size;
+ };
+
+#ifndef SVR4_FETCH_LINK_MAP_OFFSETS
+extern struct link_map_offsets *default_svr4_fetch_link_map_offsets (void);
+#define SVR4_FETCH_LINK_MAP_OFFSETS() default_svr4_fetch_link_map_offsets ()
+#endif
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.22
diff -u -p -r1.22 solib.c
--- solib.c 2000/08/31 00:39:10 1.22
+++ solib.c 2000/10/23 00:43:55
@@ -1,4 +1,4 @@
-/* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger.
+/* Handle shared libraries for GDB, the GNU Debugger.
Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999, 2000
Free Software Foundation, Inc.
@@ -19,28 +19,11 @@
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#define _SYSCALL32 /* for Sparc64 cross Sparc32 */
#include "defs.h"
-/* This file is only compilable if link.h is available. */
-
-#ifdef HAVE_LINK_H
-
#include <sys/types.h>
-#include <signal.h>
-#include "gdb_string.h"
-#include <sys/param.h>
#include <fcntl.h>
-
-#ifndef SVR4_SHARED_LIBS
- /* SunOS shared libs need the nlist structure. */
-#include <a.out.h>
-#else
-#include "elf/external.h"
-#endif
-
-#include <link.h>
-
+#include "gdb_string.h"
#include "symtab.h"
#include "bfd.h"
#include "symfile.h"
@@ -54,291 +37,24 @@
#include "environ.h"
#include "language.h"
#include "gdbcmd.h"
-
-#define MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */
-
-/* On SVR4 systems, a list of symbols in the dynamic linker where
- GDB can try to place a breakpoint to monitor shared library
- events.
-
- If none of these symbols are found, or other errors occur, then
- SVR4 systems will fall back to using a symbol as the "startup
- mapping complete" breakpoint address. */
-
-#ifdef SVR4_SHARED_LIBS
-static char *solib_break_names[] =
-{
- "r_debug_state",
- "_r_debug_state",
- "_dl_debug_state",
- "rtld_db_dlactivity",
- NULL
-};
-#endif
-#define BKPT_AT_SYMBOL 1
+#include "solist.h"
-#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. */
-#endif
- "_start",
- "main",
- NULL
-};
-#endif
-
-/* Symbols which are used to locate the base of the link map structures. */
-
-#ifndef SVR4_SHARED_LIBS
-static char *debug_base_symbols[] =
-{
- "_DYNAMIC",
- "_DYNAMIC__MGC",
- NULL
-};
-#endif
-
-static char *main_name_list[] =
-{
- "main_$main",
- NULL
-};
-
-/* Function to extract an address from a solib structure.
- When GDB is configured for some 32-bit targets (e.g. Solaris 2.7
- sparc), BFD is configured to handle 64-bit targets, so CORE_ADDR is
- 64 bits. We have to extract only the significant bits of addresses
- to get the right address when accessing the core file BFD.
-
- We'll use the BFD itself to determine the number of significant bits.
- MVS, June 2000 */
-
-static CORE_ADDR
-solib_extract_address (void *memberp)
-{
- return extract_address (memberp,
- bfd_get_arch_size (exec_bfd) / 8);
-}
+/* external data declarations */
-#define SOLIB_EXTRACT_ADDRESS(MEMBER) \
- solib_extract_address (&MEMBER)
+/* FIXME: gdbarch needs to control this variable */
+struct target_so_ops *current_target_so_ops;
/* local data declarations */
-#ifndef SVR4_SHARED_LIBS
-
-/* NOTE: converted the macros LM_ADDR, LM_NEXT, LM_NAME and
- IGNORE_FIRST_LINK_MAP_ENTRY into functions (see below).
- MVS, June 2000 */
-
-static struct link_dynamic dynamic_copy;
-static struct link_dynamic_2 ld_2_copy;
-static struct ld_debug debug_copy;
-static CORE_ADDR debug_addr;
-static CORE_ADDR flag_addr;
-
-#else /* SVR4_SHARED_LIBS */
-
-static struct r_debug debug_copy;
-#if defined (HAVE_STRUCT_LINK_MAP32)
-static struct r_debug32 debug32_copy; /* Sparc64 cross Sparc32 */
-#endif
-
-char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
-
-#endif /* !SVR4_SHARED_LIBS */
-
-struct so_list
- {
- /* The following fields of the structure come directly from the
- dynamic linker's tables in the inferior, and are initialized by
- current_sos. */
-
- struct so_list *next; /* next structure in linked list */
- struct link_map lm; /* copy of link map from inferior */
-#if defined (HAVE_STRUCT_LINK_MAP32)
- struct link_map32 lm32; /* copy of link map from 32-bit inferior */
-#endif
- CORE_ADDR lmaddr; /* addr in inferior lm was read from */
-
- /* Shared object file name, exactly as it appears in the
- inferior's link map. This may be a relative path, or something
- which needs to be looked up in LD_LIBRARY_PATH, etc. We use it
- to tell which entries in the inferior's dynamic linker's link
- map we've already loaded. */
- char so_original_name[MAX_PATH_SIZE];
-
- /* shared object file name, expanded to something GDB can open */
- char so_name[MAX_PATH_SIZE];
-
- /* The following fields of the structure are built from
- information gathered from the shared object file itself, and
- are initialized when we actually add it to our symbol tables. */
-
- bfd *abfd;
- CORE_ADDR lmend; /* upper addr bound of mapped object */
- char symbols_loaded; /* flag: symbols read in yet? */
- char from_tty; /* flag: print msgs? */
- struct objfile *objfile; /* objfile for loaded lib */
- struct section_table *sections;
- struct section_table *sections_end;
- struct section_table *textsection;
- };
-
static struct so_list *so_list_head; /* List of known shared objects */
-/* link map access functions */
-
-#ifndef SVR4_SHARED_LIBS
-
-static CORE_ADDR
-LM_ADDR (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.lm_addr, sizeof (so->lm32.lm_addr));
- else
-#endif
- return extract_address (&so->lm.lm_addr, sizeof (so->lm.lm_addr));
-}
-
-static CORE_ADDR
-LM_NEXT (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.lm_next, sizeof (so->lm32.lm_next));
- else
-#endif
- return extract_address (&so->lm.lm_next, sizeof (so->lm.lm_next));
-}
-
-static CORE_ADDR
-LM_NAME (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.lm_name, sizeof (so->lm32.lm_name));
- else
-#endif
- return extract_address (&so->lm.lm_name, sizeof (so->lm.lm_name));
-}
-
-static int
-IGNORE_FIRST_LINK_MAP_ENTRY (so)
- struct so_list *so;
-{
- return 0;
-}
-
-#else /* SVR4_SHARED_LIBS */
-
-static CORE_ADDR
-LM_ADDR (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.l_addr, sizeof (so->lm32.l_addr));
- else
-#endif
- return extract_address (&so->lm.l_addr, sizeof (so->lm.l_addr));
-}
-
-static CORE_ADDR
-LM_NEXT (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.l_next, sizeof (so->lm32.l_next));
- else
-#endif
- return extract_address (&so->lm.l_next, sizeof (so->lm.l_next));
-}
-
-static CORE_ADDR
-LM_NAME (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return extract_address (&so->lm32.l_name, sizeof (so->lm32.l_name));
- else
-#endif
- return extract_address (&so->lm.l_name, sizeof (so->lm.l_name));
-}
-
-static int
-IGNORE_FIRST_LINK_MAP_ENTRY (so)
- struct so_list *so;
-{
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- return (solib_extract_address (&(so) -> lm32.l_prev) == 0);
- else
-#endif
- return (solib_extract_address (&(so) -> lm.l_prev) == 0);
-}
-
-#endif /* !SVR4_SHARED_LIBS */
-
-
-static CORE_ADDR debug_base; /* Base of dynamic linker structures */
-static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
-
static int solib_cleanup_queued = 0; /* make_run_cleanup called */
-extern int fdmatch (int, int); /* In libiberty */
-
/* Local function prototypes */
static void do_clear_solib (PTR);
-static int match_main (char *);
-
-static void special_symbol_handling (void);
-
-static void sharedlibrary_command (char *, int);
-
-static int enable_break (void);
-
-static void info_sharedlibrary_command (char *, int);
-
-static int symbol_add_stub (PTR);
-
-static CORE_ADDR first_link_map_member (void);
-
-static CORE_ADDR locate_base (void);
-
-static int solib_map_sections (PTR);
-
-#ifdef SVR4_SHARED_LIBS
-
-static CORE_ADDR elf_locate_base (void);
-
-#else
-
-static struct so_list *current_sos (void);
-static void free_so (struct so_list *node);
-
-static int disable_break (void);
-
-static void allocate_rt_common_objfile (void);
-
-static void
-solib_add_common_symbols (CORE_ADDR);
-
-#endif
-
-void _initialize_solib (void);
-
/* If non-zero, this is a prefix that will be added to the front of the name
shared libraries with an absolute filename for loading. */
static char *solib_absolute_prefix = NULL;
@@ -432,717 +148,53 @@ solib_map_sections (PTR arg)
/* Leave scratch_pathname allocated. abfd->name will point to it. */
abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
- if (!abfd)
- {
- close (scratch_chan);
- error ("Could not open `%s' as an executable file: %s",
- scratch_pathname, bfd_errmsg (bfd_get_error ()));
- }
- /* Leave bfd open, core_xfer_memory and "info files" need it. */
- so->abfd = abfd;
- abfd->cacheable = true;
-
- /* copy full path name into so_name, so that later symbol_file_add can find
- it */
- if (strlen (scratch_pathname) >= MAX_PATH_SIZE)
- error ("Full path name length of shared library exceeds MAX_PATH_SIZE in so_list structure.");
- strcpy (so->so_name, scratch_pathname);
-
- if (!bfd_check_format (abfd, bfd_object))
- {
- error ("\"%s\": not in executable format: %s.",
- scratch_pathname, bfd_errmsg (bfd_get_error ()));
- }
- if (build_section_table (abfd, &so->sections, &so->sections_end))
- {
- error ("Can't find the file sections in `%s': %s",
- bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
- }
-
- for (p = so->sections; p < so->sections_end; p++)
- {
- /* Relocate the section binding addresses as recorded in the shared
- object's file by the base address to which the object was actually
- mapped. */
- p->addr += LM_ADDR (so);
- p->endaddr += LM_ADDR (so);
- so->lmend = max (p->endaddr, so->lmend);
- if (STREQ (p->the_bfd_section->name, ".text"))
- {
- so->textsection = p;
- }
- }
-
- /* Free the file names, close the file now. */
- do_cleanups (old_chain);
-
- return (1);
-}
-
-#ifndef SVR4_SHARED_LIBS
-
-/* Allocate the runtime common object file. */
-
-static void
-allocate_rt_common_objfile (void)
-{
- struct objfile *objfile;
- struct objfile *last_one;
-
- objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
- memset (objfile, 0, sizeof (struct objfile));
- objfile->md = NULL;
- obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0,
- xmalloc, free);
- obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc,
- free);
- obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc,
- free);
- obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
- free);
- objfile->name = mstrsave (objfile->md, "rt_common");
-
- /* Add this file onto the tail of the linked list of other such files. */
-
- objfile->next = NULL;
- if (object_files == NULL)
- object_files = objfile;
- else
- {
- for (last_one = object_files;
- last_one->next;
- last_one = last_one->next);
- last_one->next = objfile;
- }
-
- rt_common_objfile = objfile;
-}
-
-/* Read all dynamically loaded common symbol definitions from the inferior
- and put them into the minimal symbol table for the runtime common
- objfile. */
-
-static void
-solib_add_common_symbols (CORE_ADDR rtc_symp)
-{
- struct rtc_symb inferior_rtc_symb;
- struct nlist inferior_rtc_nlist;
- int len;
- char *name;
-
- /* Remove any runtime common symbols from previous runs. */
-
- if (rt_common_objfile != NULL && rt_common_objfile->minimal_symbol_count)
- {
- obstack_free (&rt_common_objfile->symbol_obstack, 0);
- obstack_specify_allocation (&rt_common_objfile->symbol_obstack, 0, 0,
- xmalloc, free);
- rt_common_objfile->minimal_symbol_count = 0;
- rt_common_objfile->msymbols = NULL;
- }
-
- init_minimal_symbol_collection ();
- make_cleanup_discard_minimal_symbols ();
-
- while (rtc_symp)
- {
- read_memory (rtc_symp,
- (char *) &inferior_rtc_symb,
- sizeof (inferior_rtc_symb));
- read_memory (SOLIB_EXTRACT_ADDRESS (inferior_rtc_symb.rtc_sp),
- (char *) &inferior_rtc_nlist,
- sizeof (inferior_rtc_nlist));
- if (inferior_rtc_nlist.n_type == N_COMM)
- {
- /* FIXME: The length of the symbol name is not available, but in the
- current implementation the common symbol is allocated immediately
- behind the name of the symbol. */
- len = inferior_rtc_nlist.n_value - inferior_rtc_nlist.n_un.n_strx;
-
- name = xmalloc (len);
- read_memory (SOLIB_EXTRACT_ADDRESS (inferior_rtc_nlist.n_un.n_name),
- name, len);
-
- /* Allocate the runtime common objfile if necessary. */
- if (rt_common_objfile == NULL)
- allocate_rt_common_objfile ();
-
- prim_record_minimal_symbol (name, inferior_rtc_nlist.n_value,
- mst_bss, rt_common_objfile);
- free (name);
- }
- rtc_symp = SOLIB_EXTRACT_ADDRESS (inferior_rtc_symb.rtc_next);
- }
-
- /* Install any minimal symbols that have been collected as the current
- minimal symbols for the runtime common objfile. */
-
- install_minimal_symbols (rt_common_objfile);
-}
-
-#endif /* SVR4_SHARED_LIBS */
-
-
-#ifdef SVR4_SHARED_LIBS
-
-static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
-
-/*
-
- LOCAL FUNCTION
-
- bfd_lookup_symbol -- lookup the value for a specific symbol
-
- SYNOPSIS
-
- CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname)
-
- DESCRIPTION
-
- An expensive way to lookup the value of a single symbol for
- bfd's that are only temporary anyway. This is used by the
- shared library support to find the address of the debugger
- interface structures in the shared library.
-
- Note that 0 is specifically allowed as an error return (no
- such symbol).
- */
-
-static CORE_ADDR
-bfd_lookup_symbol (bfd *abfd, char *symname)
-{
- unsigned int storage_needed;
- asymbol *sym;
- asymbol **symbol_table;
- unsigned int number_of_symbols;
- unsigned int i;
- struct cleanup *back_to;
- CORE_ADDR symaddr = 0;
-
- storage_needed = bfd_get_symtab_upper_bound (abfd);
-
- if (storage_needed > 0)
- {
- symbol_table = (asymbol **) xmalloc (storage_needed);
- back_to = make_cleanup (free, (PTR) symbol_table);
- number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
-
- for (i = 0; i < number_of_symbols; i++)
- {
- sym = *symbol_table++;
- if (STREQ (sym->name, symname))
- {
- /* Bfd symbols are section relative. */
- symaddr = sym->value + sym->section->vma;
- break;
- }
- }
- do_cleanups (back_to);
- }
-
- if (symaddr)
- return symaddr;
-
- /* On FreeBSD, the dynamic linker is stripped by default. So we'll
- have to check the dynamic string table too. */
-
- storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
-
- if (storage_needed > 0)
- {
- symbol_table = (asymbol **) xmalloc (storage_needed);
- back_to = make_cleanup (free, (PTR) symbol_table);
- number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
-
- for (i = 0; i < number_of_symbols; i++)
- {
- sym = *symbol_table++;
- if (STREQ (sym->name, symname))
- {
- /* Bfd symbols are section relative. */
- symaddr = sym->value + sym->section->vma;
- break;
- }
- }
- do_cleanups (back_to);
- }
-
- return symaddr;
-}
-
-#ifdef HANDLE_SVR4_EXEC_EMULATORS
-
-/*
- Solaris BCP (the part of Solaris which allows it to run SunOS4
- a.out files) throws in another wrinkle. Solaris does not fill
- in the usual a.out link map structures when running BCP programs,
- the only way to get at them is via groping around in the dynamic
- linker.
- The dynamic linker and it's structures are located in the shared
- C library, which gets run as the executable's "interpreter" by
- the kernel.
-
- Note that we can assume nothing about the process state at the time
- we need to find these structures. We may be stopped on the first
- instruction of the interpreter (C shared library), the first
- instruction of the executable itself, or somewhere else entirely
- (if we attached to the process for example).
- */
-
-static char *debug_base_symbols[] =
-{
- "r_debug", /* Solaris 2.3 */
- "_r_debug", /* Solaris 2.1, 2.2 */
- NULL
-};
-
-static int look_for_base (int, CORE_ADDR);
-
-/*
-
- LOCAL FUNCTION
-
- look_for_base -- examine file for each mapped address segment
-
- SYNOPSYS
-
- static int look_for_base (int fd, CORE_ADDR baseaddr)
-
- DESCRIPTION
-
- This function is passed to proc_iterate_over_mappings, which
- causes it to get called once for each mapped address space, with
- an open file descriptor for the file mapped to that space, and the
- base address of that mapped space.
-
- Our job is to find the debug base symbol in the file that this
- fd is open on, if it exists, and if so, initialize the dynamic
- linker structure base address debug_base.
-
- Note that this is a computationally expensive proposition, since
- we basically have to open a bfd on every call, so we specifically
- avoid opening the exec file.
- */
-
-static int
-look_for_base (int fd, CORE_ADDR baseaddr)
-{
- bfd *interp_bfd;
- CORE_ADDR address = 0;
- char **symbolp;
-
- /* If the fd is -1, then there is no file that corresponds to this
- mapped memory segment, so skip it. Also, if the fd corresponds
- to the exec file, skip it as well. */
-
- if (fd == -1
- || (exec_bfd != NULL
- && fdmatch (fileno ((FILE *) (exec_bfd->iostream)), fd)))
- {
- return (0);
- }
-
- /* Try to open whatever random file this fd corresponds to. Note that
- 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", gnutarget, fd)) == NULL)
- {
- return (0);
- }
- if (!bfd_check_format (interp_bfd, bfd_object))
- {
- /* FIXME-leak: on failure, might not free all memory associated with
- interp_bfd. */
- bfd_close (interp_bfd);
- return (0);
- }
-
- /* Now try to find our debug base symbol in this file, which we at
- least know to be a valid ELF executable or shared library. */
-
- for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
- {
- address = bfd_lookup_symbol (interp_bfd, *symbolp);
- if (address != 0)
- {
- break;
- }
- }
- if (address == 0)
- {
- /* FIXME-leak: on failure, might not free all memory associated with
- interp_bfd. */
- bfd_close (interp_bfd);
- return (0);
- }
-
- /* Eureka! We found the symbol. But now we may need to relocate it
- by the base address. If the symbol's value is less than the base
- address of the shared library, then it hasn't yet been relocated
- by the dynamic linker, and we have to do it ourself. FIXME: Note
- that we make the assumption that the first segment that corresponds
- to the shared library has the base address to which the library
- was relocated. */
-
- if (address < baseaddr)
- {
- address += baseaddr;
- }
- debug_base = address;
- /* FIXME-leak: on failure, might not free all memory associated with
- interp_bfd. */
- bfd_close (interp_bfd);
- return (1);
-}
-#endif /* HANDLE_SVR4_EXEC_EMULATORS */
-
-/*
-
- LOCAL FUNCTION
-
- elf_locate_base -- locate the base address of dynamic linker structs
- for SVR4 elf targets.
-
- SYNOPSIS
-
- CORE_ADDR elf_locate_base (void)
-
- DESCRIPTION
-
- For SVR4 elf targets the address of the dynamic linker's runtime
- structure is contained within the dynamic info section in the
- executable file. The dynamic section is also mapped into the
- inferior address space. Because the runtime loader fills in the
- real address before starting the inferior, we have to read in the
- dynamic info section from the inferior address space.
- If there are any errors while trying to find the address, we
- silently return 0, otherwise the found address is returned.
-
- */
-
-static CORE_ADDR
-elf_locate_base (void)
-{
- sec_ptr dyninfo_sect;
- int dyninfo_sect_size;
- CORE_ADDR dyninfo_addr;
- char *buf;
- char *bufend;
- int arch_size;
-
- /* Find the start address of the .dynamic section. */
- dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic");
- if (dyninfo_sect == NULL)
- return 0;
- dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect);
-
- /* Read in .dynamic section, silently ignore errors. */
- dyninfo_sect_size = bfd_section_size (exec_bfd, dyninfo_sect);
- buf = alloca (dyninfo_sect_size);
- if (target_read_memory (dyninfo_addr, buf, dyninfo_sect_size))
- return 0;
-
- /* Find the DT_DEBUG entry in the the .dynamic section.
- For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
- no DT_DEBUG entries. */
-
- arch_size = bfd_get_arch_size (exec_bfd);
- if (arch_size == -1) /* failure */
- return 0;
-
- if (arch_size == 32)
- { /* 32-bit elf */
- for (bufend = buf + dyninfo_sect_size;
- buf < bufend;
- buf += sizeof (Elf32_External_Dyn))
- {
- Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf;
- long dyn_tag;
- CORE_ADDR dyn_ptr;
-
- dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
- if (dyn_tag == DT_NULL)
- break;
- else if (dyn_tag == DT_DEBUG)
- {
- dyn_ptr = bfd_h_get_32 (exec_bfd,
- (bfd_byte *) x_dynp->d_un.d_ptr);
- return dyn_ptr;
- }
-#ifdef DT_MIPS_RLD_MAP
- else if (dyn_tag == DT_MIPS_RLD_MAP)
- {
- char *pbuf;
-
- pbuf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
- /* DT_MIPS_RLD_MAP contains a pointer to the address
- of the dynamic link structure. */
- dyn_ptr = bfd_h_get_32 (exec_bfd,
- (bfd_byte *) x_dynp->d_un.d_ptr);
- if (target_read_memory (dyn_ptr, pbuf, sizeof (pbuf)))
- return 0;
- return extract_unsigned_integer (pbuf, sizeof (pbuf));
- }
-#endif
- }
- }
- else /* 64-bit elf */
- {
- for (bufend = buf + dyninfo_sect_size;
- buf < bufend;
- buf += sizeof (Elf64_External_Dyn))
- {
- Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf;
- long dyn_tag;
- CORE_ADDR dyn_ptr;
-
- dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
- if (dyn_tag == DT_NULL)
- break;
- else if (dyn_tag == DT_DEBUG)
- {
- dyn_ptr = bfd_h_get_64 (exec_bfd,
- (bfd_byte *) x_dynp->d_un.d_ptr);
- return dyn_ptr;
- }
- }
- }
-
- /* DT_DEBUG entry not found. */
- return 0;
-}
-
-#endif /* SVR4_SHARED_LIBS */
-
-/*
-
- LOCAL FUNCTION
-
- locate_base -- locate the base address of dynamic linker structs
-
- SYNOPSIS
-
- CORE_ADDR locate_base (void)
-
- DESCRIPTION
-
- For both the SunOS and SVR4 shared library implementations, if the
- inferior executable has been linked dynamically, there is a single
- address somewhere in the inferior's data space which is the key to
- locating all of the dynamic linker's runtime structures. This
- address is the value of the debug base symbol. The job of this
- function is to find and return that address, or to return 0 if there
- is no such address (the executable is statically linked for example).
-
- For SunOS, the job is almost trivial, since the dynamic linker and
- all of it's structures are statically linked to the executable at
- link time. Thus the symbol for the address we are looking for has
- already been added to the minimal symbol table for the executable's
- objfile at the time the symbol file's symbols were read, and all we
- have to do is look it up there. Note that we explicitly do NOT want
- to find the copies in the shared library.
-
- The SVR4 version is a bit more complicated because the address
- is contained somewhere in the dynamic info section. We have to go
- to a lot more work to discover the address of the debug base symbol.
- Because of this complexity, we cache the value we find and return that
- value on subsequent invocations. Note there is no copy in the
- executable symbol tables.
-
- */
-
-static CORE_ADDR
-locate_base (void)
-{
-
-#ifndef SVR4_SHARED_LIBS
-
- struct minimal_symbol *msymbol;
- CORE_ADDR address = 0;
- char **symbolp;
-
- /* For SunOS, we want to limit the search for the debug base symbol to the
- executable being debugged, since there is a duplicate named symbol in the
- shared library. We don't want the shared library versions. */
-
- for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
- {
- msymbol = lookup_minimal_symbol (*symbolp, NULL, symfile_objfile);
- if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
- {
- address = SYMBOL_VALUE_ADDRESS (msymbol);
- return (address);
- }
- }
- return (0);
-
-#else /* SVR4_SHARED_LIBS */
-
- /* Check to see if we have a currently valid address, and if so, avoid
- doing all this work again and just return the cached address. If
- we have no cached address, try to locate it in the dynamic info
- section for ELF executables. */
-
- if (debug_base == 0)
- {
- if (exec_bfd != NULL
- && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
- debug_base = elf_locate_base ();
-#ifdef HANDLE_SVR4_EXEC_EMULATORS
- /* Try it the hard way for emulated executables. */
- else if (inferior_pid != 0 && target_has_execution)
- proc_iterate_over_mappings (look_for_base);
-#endif
- }
- return (debug_base);
-
-#endif /* !SVR4_SHARED_LIBS */
-
-}
-
-/*
-
- LOCAL FUNCTION
-
- first_link_map_member -- locate first member in dynamic linker's map
-
- SYNOPSIS
-
- static CORE_ADDR first_link_map_member (void)
-
- DESCRIPTION
-
- Find the first element in the inferior's dynamic link map, and
- return its address in the inferior. This function doesn't copy the
- link map entry itself into our address space; current_sos actually
- does the reading. */
-
-static CORE_ADDR
-first_link_map_member (void)
-{
- CORE_ADDR lm = 0;
-
-#ifndef SVR4_SHARED_LIBS
-
- read_memory (debug_base, (char *) &dynamic_copy, sizeof (dynamic_copy));
- if (dynamic_copy.ld_version >= 2)
- {
- /* It is a version that we can deal with, so read in the secondary
- structure and find the address of the link map list from it. */
- read_memory (SOLIB_EXTRACT_ADDRESS (dynamic_copy.ld_un.ld_2),
- (char *) &ld_2_copy, sizeof (struct link_dynamic_2));
- lm = SOLIB_EXTRACT_ADDRESS (ld_2_copy.ld_loaded);
- }
-
-#else /* SVR4_SHARED_LIBS */
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- {
- read_memory (debug_base, (char *) &debug32_copy,
- sizeof (struct r_debug32));
- lm = SOLIB_EXTRACT_ADDRESS (debug32_copy.r_map);
- }
- else
-#endif
- {
- read_memory (debug_base, (char *) &debug_copy,
- sizeof (struct r_debug));
- lm = SOLIB_EXTRACT_ADDRESS (debug_copy.r_map);
- }
- /* FIXME: Perhaps we should validate the info somehow, perhaps by
- checking r_version for a known version number, or r_state for
- RT_CONSISTENT. */
-
-#endif /* !SVR4_SHARED_LIBS */
-
- return (lm);
-}
-
-#ifdef SVR4_SHARED_LIBS
-/*
-
- LOCAL FUNCTION
-
- open_symbol_file_object
-
- SYNOPSIS
-
- void open_symbol_file_object (int from_tty)
-
- DESCRIPTION
-
- If no open symbol file, attempt to locate and open the main symbol
- file. On SVR4 systems, this is the first link map entry. If its
- name is here, we can open it. Useful when attaching to a process
- without first loading its symbol file.
-
- */
-
-static int
-open_symbol_file_object (from_ttyp)
- int *from_ttyp; /* sneak past catch_errors */
-{
- CORE_ADDR lm;
- char *filename;
- int errcode;
-
- if (symfile_objfile)
- if (!query ("Attempt to reload symbols from process? "))
- return 0;
-
- if ((debug_base = locate_base ()) == 0)
- return 0; /* failed somehow... */
-
- /* First link map member should be the executable. */
- if ((lm = first_link_map_member ()) == 0)
- return 0; /* failed somehow... */
-
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
+ if (!abfd)
{
- struct link_map32 lmcopy;
- /* Read from target memory to GDB. */
- read_memory (lm, (void *) &lmcopy, sizeof (lmcopy));
+ close (scratch_chan);
+ error ("Could not open `%s' as an executable file: %s",
+ scratch_pathname, bfd_errmsg (bfd_get_error ()));
+ }
+ /* Leave bfd open, core_xfer_memory and "info files" need it. */
+ so->abfd = abfd;
+ abfd->cacheable = true;
- if (lmcopy.l_name == 0)
- return 0; /* no filename. */
+ /* copy full path name into so_name, so that later symbol_file_add can find
+ it */
+ if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE)
+ error ("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure.");
+ strcpy (so->so_name, scratch_pathname);
- /* Now fetch the filename from target memory. */
- target_read_string (SOLIB_EXTRACT_ADDRESS (lmcopy.l_name),
- &filename, MAX_PATH_SIZE - 1, &errcode);
+ if (!bfd_check_format (abfd, bfd_object))
+ {
+ error ("\"%s\": not in executable format: %s.",
+ scratch_pathname, bfd_errmsg (bfd_get_error ()));
}
- else
-#endif /* HAVE_STRUCT_LINK_MAP32 */
+ if (build_section_table (abfd, &so->sections, &so->sections_end))
{
- struct link_map lmcopy;
- /* Read from target memory to GDB. */
- read_memory (lm, (void *) &lmcopy, sizeof (lmcopy));
-
- if (lmcopy.l_name == 0)
- return 0; /* no filename. */
-
- /* Now fetch the filename from target memory. */
- target_read_string (SOLIB_EXTRACT_ADDRESS (lmcopy.l_name), &filename,
- MAX_PATH_SIZE - 1, &errcode);
+ error ("Can't find the file sections in `%s': %s",
+ bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
}
- if (errcode)
+ for (p = so->sections; p < so->sections_end; p++)
{
- warning ("failed to read exec filename from attached file: %s",
- safe_strerror (errcode));
- return 0;
+ /* Relocate the section binding addresses as recorded in the shared
+ object's file by the base address to which the object was actually
+ mapped. */
+ p->addr += TARGET_SO_LM_ADDR (so);
+ p->endaddr += TARGET_SO_LM_ADDR (so);
+ so->lmend = max (p->endaddr, so->lmend);
+ if (STREQ (p->the_bfd_section->name, ".text"))
+ {
+ so->textsection = p;
+ }
}
- make_cleanup (free, filename);
- /* Have a pathname: read the symbol file. */
- symbol_file_command (filename, *from_ttyp);
+ /* Free the file names, close the file now. */
+ do_cleanups (old_chain);
- return 1;
+ return (1);
}
-#endif /* SVR4_SHARED_LIBS */
-
/* LOCAL FUNCTION
free_so --- free a `struct so_list' object
@@ -1164,7 +216,7 @@ open_symbol_file_object (from_ttyp)
objfile associated with SO that needs to be removed, the caller is
responsible for taking care of that. */
-static void
+void
free_so (struct so_list *so)
{
char *bfd_filename = 0;
@@ -1182,134 +234,10 @@ free_so (struct so_list *so)
if (bfd_filename)
free (bfd_filename);
-
- free (so);
-}
-
-
-/* On some systems, the only way to recognize the link map entry for
- the main executable file is by looking at its name. Return
- non-zero iff SONAME matches one of the known main executable names. */
-
-static int
-match_main (char *soname)
-{
- char **mainp;
-
- for (mainp = main_name_list; *mainp != NULL; mainp++)
- {
- if (strcmp (soname, *mainp) == 0)
- return (1);
- }
-
- return (0);
-}
-
-
-/* LOCAL FUNCTION
-
- current_sos -- build a list of currently loaded shared objects
-
- SYNOPSIS
-
- struct so_list *current_sos ()
-
- DESCRIPTION
-
- Build a list of `struct so_list' objects describing the shared
- objects currently loaded in the inferior. This list does not
- include an entry for the main executable file.
-
- Note that we only gather information directly available from the
- inferior --- we don't examine any of the shared library files
- themselves. The declaration of `struct so_list' says which fields
- we provide values for. */
-
-static struct so_list *
-current_sos (void)
-{
- CORE_ADDR lm;
- struct so_list *head = 0;
- struct so_list **link_ptr = &head;
-
- /* Make sure we've looked up the inferior's dynamic linker's base
- structure. */
- if (! debug_base)
- {
- debug_base = locate_base ();
-
- /* If we can't find the dynamic linker's base structure, this
- must not be a dynamically linked executable. Hmm. */
- if (! debug_base)
- return 0;
- }
-
- /* Walk the inferior's link map list, and build our list of
- `struct so_list' nodes. */
- lm = first_link_map_member ();
- while (lm)
- {
- struct so_list *new
- = (struct so_list *) xmalloc (sizeof (struct so_list));
- struct cleanup *old_chain = make_cleanup (free, new);
- memset (new, 0, sizeof (*new));
-
- new->lmaddr = lm;
-
-#if defined (HAVE_STRUCT_LINK_MAP32)
- if (bfd_get_arch_size (exec_bfd) == 32)
- read_memory (lm, (char *) &(new->lm32), sizeof (struct link_map32));
- else
-#endif
- read_memory (lm, (char *) &(new->lm), sizeof (struct link_map));
-
- lm = LM_NEXT (new);
-
- /* For SVR4 versions, the first entry in the link map is for the
- inferior executable, so we must ignore it. For some versions of
- SVR4, it has no name. For others (Solaris 2.3 for example), it
- does have a name, so we can no longer use a missing name to
- decide when to ignore it. */
- if (IGNORE_FIRST_LINK_MAP_ENTRY (new))
- free_so (new);
- else
- {
- int errcode;
- char *buffer;
-
- /* Extract this shared object's name. */
- target_read_string (LM_NAME (new), &buffer,
- MAX_PATH_SIZE - 1, &errcode);
- if (errcode != 0)
- {
- warning ("current_sos: Can't read pathname for load map: %s\n",
- safe_strerror (errcode));
- }
- else
- {
- strncpy (new->so_name, buffer, MAX_PATH_SIZE - 1);
- new->so_name[MAX_PATH_SIZE - 1] = '\0';
- free (buffer);
- strcpy (new->so_original_name, new->so_name);
- }
- /* If this entry has no name, or its name matches the name
- for the main executable, don't include it in the list. */
- if (! new->so_name[0]
- || match_main (new->so_name))
- free_so (new);
- else
- {
- new->next = 0;
- *link_ptr = new;
- link_ptr = &new->next;
- }
- }
+ TARGET_SO_FREE_SO (so);
- discard_cleanups (old_chain);
- }
-
- return head;
+ free (so);
}
@@ -1350,7 +278,7 @@ symbol_add_stub (PTR arg)
if (lowest_sect)
{
lowest_addr = bfd_section_vma (so->abfd, lowest_sect)
- + LM_ADDR (so);
+ + TARGET_SO_LM_ADDR (so);
lowest_index = lowest_sect->index;
}
}
@@ -1400,21 +328,18 @@ symbol_add_stub (PTR arg)
void
update_solib_list (int from_tty, struct target_ops *target)
{
- struct so_list *inferior = current_sos ();
+ struct so_list *inferior = TARGET_SO_CURRENT_SOS ();
struct so_list *gdb, **gdb_link;
-#ifdef SVR4_SHARED_LIBS
/* If we are attaching to a running process for which we
have not opened a symbol file, we may be able to get its
symbols now! */
if (attach_flag &&
symfile_objfile == NULL)
- catch_errors (open_symbol_file_object, (PTR) &from_tty,
+ catch_errors (TARGET_SO_OPEN_SYMBOL_FILE_OBJECT, (PTR) &from_tty,
"Error reading attached process's symbol file.\n",
RETURN_MASK_ALL);
-#endif SVR4_SHARED_LIBS
-
/* Since this function might actually add some elements to the
so_list_head list, arrange for it to be cleaned up when
appropriate. */
@@ -1620,7 +545,7 @@ solib_add (char *pattern, int from_tty,
frameless. */
reinit_frame_cache ();
- special_symbol_handling ();
+ TARGET_SO_SPECIAL_SYMBOL_HANDLING ();
}
}
}
@@ -1685,8 +610,9 @@ info_sharedlibrary_command (char *ignore
}
printf_unfiltered ("%-*s", addr_width,
- local_hex_string_custom ((unsigned long) LM_ADDR (so),
- addr_fmt));
+ local_hex_string_custom (
+ (unsigned long) TARGET_SO_LM_ADDR (so),
+ addr_fmt));
printf_unfiltered ("%-*s", addr_width,
local_hex_string_custom ((unsigned long) so->lmend,
addr_fmt));
@@ -1731,7 +657,7 @@ solib_address (CORE_ADDR address)
for (so = so_list_head; so; so = so->next)
{
- if (LM_ADDR (so) <= address && address < so->lmend)
+ if (TARGET_SO_LM_ADDR (so) <= address && address < so->lmend)
return (so->so_name);
}
@@ -1774,7 +700,7 @@ clear_solib (void)
free_so (so);
}
- debug_base = 0;
+ TARGET_SO_CLEAR_SOLIB ();
}
static void
@@ -1783,302 +709,8 @@ do_clear_solib (PTR dummy)
solib_cleanup_queued = 0;
clear_solib ();
}
-
-#ifdef SVR4_SHARED_LIBS
-
-/* Return 1 if PC lies in the dynamic symbol resolution code of the
- SVR4 run time loader. */
-
-static CORE_ADDR interp_text_sect_low;
-static CORE_ADDR interp_text_sect_high;
-static CORE_ADDR interp_plt_sect_low;
-static CORE_ADDR interp_plt_sect_high;
-
-int
-in_svr4_dynsym_resolve_code (CORE_ADDR pc)
-{
- return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
- || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
- || in_plt_section (pc, NULL));
-}
-#endif
-
-/*
-
- LOCAL FUNCTION
-
- disable_break -- remove the "mapping changed" breakpoint
-
- SYNOPSIS
-
- static int disable_break ()
-
- DESCRIPTION
-
- Removes the breakpoint that gets hit when the dynamic linker
- completes a mapping change.
-
- */
-
-#ifndef SVR4_SHARED_LIBS
-
-static int
-disable_break (void)
-{
- int status = 1;
-
-#ifndef SVR4_SHARED_LIBS
-
- int in_debugger = 0;
-
- /* Read the debugger structure from the inferior to retrieve the
- address of the breakpoint and the original contents of the
- breakpoint address. Remove the breakpoint by writing the original
- contents back. */
-
- read_memory (debug_addr, (char *) &debug_copy, sizeof (debug_copy));
-
- /* Set `in_debugger' to zero now. */
-
- write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
-
- breakpoint_addr = SOLIB_EXTRACT_ADDRESS (debug_copy.ldd_bp_addr);
- write_memory (breakpoint_addr, (char *) &debug_copy.ldd_bp_inst,
- sizeof (debug_copy.ldd_bp_inst));
-
-#else /* SVR4_SHARED_LIBS */
-
- /* Note that breakpoint address and original contents are in our address
- space, so we just need to write the original contents back. */
-
- if (memory_remove_breakpoint (breakpoint_addr, shadow_contents) != 0)
- {
- status = 0;
- }
-
-#endif /* !SVR4_SHARED_LIBS */
-
- /* For the SVR4 version, we always know the breakpoint address. For the
- SunOS version we don't know it until the above code is executed.
- Grumble if we are stopped anywhere besides the breakpoint address. */
-
- if (stop_pc != breakpoint_addr)
- {
- warning ("stopped at unknown breakpoint while handling shared libraries");
- }
-
- return (status);
-}
-
-#endif /* #ifdef SVR4_SHARED_LIBS */
-
-/*
-
- LOCAL FUNCTION
-
- enable_break -- arrange for dynamic linker to hit breakpoint
-
- SYNOPSIS
-
- int enable_break (void)
-
- DESCRIPTION
-
- Both the SunOS and the SVR4 dynamic linkers have, as part of their
- debugger interface, support for arranging for the inferior to hit
- a breakpoint after mapping in the shared libraries. This function
- enables that breakpoint.
-
- For SunOS, there is a special flag location (in_debugger) which we
- set to 1. When the dynamic linker sees this flag set, it will set
- a breakpoint at a location known only to itself, after saving the
- original contents of that place and the breakpoint address itself,
- in it's own internal structures. When we resume the inferior, it
- will eventually take a SIGTRAP when it runs into the breakpoint.
- We handle this (in a different place) by restoring the contents of
- the breakpointed location (which is only known after it stops),
- chasing around to locate the shared libraries that have been
- loaded, then resuming.
-
- For SVR4, the debugger interface structure contains a member (r_brk)
- which is statically initialized at the time the shared library is
- built, to the offset of a function (_r_debug_state) which is guaran-
- teed to be called once before mapping in a library, and again when
- the mapping is complete. At the time we are examining this member,
- it contains only the unrelocated offset of the function, so we have
- to do our own relocation. Later, when the dynamic linker actually
- runs, it relocates r_brk to be the actual address of _r_debug_state().
-
- The debugger interface structure also contains an enumeration which
- is set to either RT_ADD or RT_DELETE prior to changing the mapping,
- depending upon whether or not the library is being mapped or unmapped,
- and then set to RT_CONSISTENT after the library is mapped/unmapped.
- */
-
-static int
-enable_break (void)
-{
- int success = 0;
-
-#ifndef SVR4_SHARED_LIBS
-
- int j;
- int in_debugger;
-
- /* Get link_dynamic structure */
-
- j = target_read_memory (debug_base, (char *) &dynamic_copy,
- sizeof (dynamic_copy));
- if (j)
- {
- /* unreadable */
- return (0);
- }
-
- /* Calc address of debugger interface structure */
-
- debug_addr = SOLIB_EXTRACT_ADDRESS (dynamic_copy.ldd);
-
- /* Calc address of `in_debugger' member of debugger interface structure */
-
- flag_addr = debug_addr + (CORE_ADDR) ((char *) &debug_copy.ldd_in_debugger -
- (char *) &debug_copy);
-
- /* Write a value of 1 to this member. */
-
- in_debugger = 1;
- write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
- success = 1;
-
-#else /* SVR4_SHARED_LIBS */
-
-#ifdef BKPT_AT_SYMBOL
-
- struct minimal_symbol *msymbol;
- char **bkpt_namep;
- asection *interp_sect;
-
- /* First, remove all the solib event breakpoints. Their addresses
- may have changed since the last time we ran the program. */
- remove_solib_event_breakpoints ();
-
-#ifdef SVR4_SHARED_LIBS
- interp_text_sect_low = interp_text_sect_high = 0;
- interp_plt_sect_low = interp_plt_sect_high = 0;
-
- /* Find the .interp section; if not found, warn the user and drop
- into the old breakpoint at symbol code. */
- interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
- if (interp_sect)
- {
- unsigned int interp_sect_size;
- char *buf;
- CORE_ADDR load_addr;
- bfd *tmp_bfd;
- CORE_ADDR sym_addr = 0;
-
- /* Read the contents of the .interp section into a local buffer;
- the contents specify the dynamic linker this program uses. */
- interp_sect_size = bfd_section_size (exec_bfd, interp_sect);
- buf = alloca (interp_sect_size);
- bfd_get_section_contents (exec_bfd, interp_sect,
- buf, 0, interp_sect_size);
-
- /* Now we need to figure out where the dynamic linker was
- loaded so that we can load its symbols and place a breakpoint
- in the dynamic linker itself.
-
- This address is stored on the stack. However, I've been unable
- to find any magic formula to find it for Solaris (appears to
- be trivial on GNU/Linux). Therefore, we have to try an alternate
- mechanism to find the dynamic linker's base address. */
- tmp_bfd = bfd_openr (buf, gnutarget);
- if (tmp_bfd == NULL)
- goto bkpt_at_symbol;
-
- /* Make sure the dynamic linker's really a useful object. */
- if (!bfd_check_format (tmp_bfd, bfd_object))
- {
- warning ("Unable to grok dynamic linker %s as an object file", buf);
- bfd_close (tmp_bfd);
- goto bkpt_at_symbol;
- }
-
- /* We find the dynamic linker's base address by examining the
- current pc (which point at the entry point for the dynamic
- linker) and subtracting the offset of the entry point. */
- load_addr = read_pc () - tmp_bfd->start_address;
-
- /* Record the relocated start and end address of the dynamic linker
- text and plt section for in_svr4_dynsym_resolve_code. */
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
- if (interp_sect)
- {
- interp_text_sect_low =
- bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
- interp_text_sect_high =
- interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect);
- }
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
- if (interp_sect)
- {
- interp_plt_sect_low =
- bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
- interp_plt_sect_high =
- interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
- }
-
- /* Now try to set a breakpoint in the dynamic linker. */
- for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
- {
- sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep);
- if (sym_addr != 0)
- break;
- }
-
- /* We're done with the temporary bfd. */
- bfd_close (tmp_bfd);
-
- if (sym_addr != 0)
- {
- create_solib_event_breakpoint (load_addr + sym_addr);
- return 1;
- }
-
- /* For whatever reason we couldn't set a breakpoint in the dynamic
- linker. Warn and drop into the old code. */
- bkpt_at_symbol:
- warning ("Unable to find dynamic linker breakpoint function.\nGDB will be unable to debug shared library initializers\nand track explicitly loaded dynamic code.");
- }
-#endif
-
- /* Scan through the list of symbols, trying to look up the symbol and
- set a breakpoint there. Terminate loop when we/if we succeed. */
-
- breakpoint_addr = 0;
- for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
- {
- msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
- if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
- {
- create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
- return 1;
- }
- }
-
- /* Nothing good happened. */
- success = 0;
-
-#endif /* BKPT_AT_SYMBOL */
-
-#endif /* !SVR4_SHARED_LIBS */
-
- return (success);
-}
-
-/*
- GLOBAL FUNCTION
+/* GLOBAL FUNCTION
solib_create_inferior_hook -- shared library startup support
@@ -2091,172 +723,12 @@ enable_break (void)
When gdb starts up the inferior, it nurses it along (through the
shell) until it is ready to execute it's first instruction. At this
point, this function gets called via expansion of the macro
- SOLIB_CREATE_INFERIOR_HOOK.
-
- For SunOS executables, this first instruction is typically the
- one at "_start", or a similar text label, regardless of whether
- the executable is statically or dynamically linked. The runtime
- startup code takes care of dynamically linking in any shared
- libraries, once gdb allows the inferior to continue.
-
- For SVR4 executables, this first instruction is either the first
- instruction in the dynamic linker (for dynamically linked
- executables) or the instruction at "start" for statically linked
- executables. For dynamically linked executables, the system
- first exec's /lib/libc.so.N, which contains the dynamic linker,
- and starts it running. The dynamic linker maps in any needed
- shared libraries, maps in the actual user executable, and then
- jumps to "start" in the user executable.
-
- For both SunOS shared libraries, and SVR4 shared libraries, we
- can arrange to cooperate with the dynamic linker to discover the
- names of shared libraries that are dynamically linked, and the
- base addresses to which they are linked.
-
- This function is responsible for discovering those names and
- addresses, and saving sufficient information about them to allow
- their symbols to be read at a later time.
-
- FIXME
-
- Between enable_break() and disable_break(), this code does not
- properly handle hitting breakpoints which the user might have
- set in the startup code or in the dynamic linker itself. Proper
- handling will probably have to wait until the implementation is
- changed to use the "breakpoint handler function" method.
-
- Also, what if child has exit()ed? Must exit loop somehow.
- */
+ SOLIB_CREATE_INFERIOR_HOOK. */
void
solib_create_inferior_hook (void)
-{
- /* If we are using the BKPT_AT_SYMBOL code, then we don't need the base
- yet. In fact, in the case of a SunOS4 executable being run on
- Solaris, we can't get it yet. current_sos will get it when it needs
- it. */
-#if !(defined (SVR4_SHARED_LIBS) && defined (BKPT_AT_SYMBOL))
- if ((debug_base = locate_base ()) == 0)
- {
- /* Can't find the symbol or the executable is statically linked. */
- return;
- }
-#endif
-
- if (!enable_break ())
- {
- warning ("shared library handler failed to enable breakpoint");
- return;
- }
-
-#if !defined(SVR4_SHARED_LIBS) || defined(_SCO_DS)
- /* SCO and SunOS need the loop below, other systems should be using the
- special shared library breakpoints and the shared library breakpoint
- service routine.
-
- Now run the target. It will eventually hit the breakpoint, at
- which point all of the libraries will have been mapped in and we
- can go groveling around in the dynamic linker structures to find
- out what we need to know about them. */
-
- clear_proceed_status ();
- stop_soon_quietly = 1;
- stop_signal = TARGET_SIGNAL_0;
- do
- {
- target_resume (-1, 0, stop_signal);
- wait_for_inferior ();
- }
- while (stop_signal != TARGET_SIGNAL_TRAP);
- stop_soon_quietly = 0;
-
-#if !defined(_SCO_DS)
- /* We are now either at the "mapping complete" breakpoint (or somewhere
- else, a condition we aren't prepared to deal with anyway), so adjust
- the PC as necessary after a breakpoint, disable the breakpoint, and
- add any shared libraries that were mapped in. */
-
- if (DECR_PC_AFTER_BREAK)
- {
- stop_pc -= DECR_PC_AFTER_BREAK;
- write_register (PC_REGNUM, stop_pc);
- }
-
- if (!disable_break ())
- {
- warning ("shared library handler failed to disable breakpoint");
- }
-
- if (auto_solib_add)
- solib_add ((char *) 0, 0, (struct target_ops *) 0);
-#endif /* ! _SCO_DS */
-#endif
-}
-
-/*
-
- LOCAL FUNCTION
-
- special_symbol_handling -- additional shared library symbol handling
-
- SYNOPSIS
-
- void special_symbol_handling ()
-
- DESCRIPTION
-
- Once the symbols from a shared object have been loaded in the usual
- way, we are called to do any system specific symbol handling that
- is needed.
-
- For SunOS4, this consists of grunging around in the dynamic
- linkers structures to find symbol definitions for "common" symbols
- and adding them to the minimal symbol table for the runtime common
- objfile.
-
- */
-
-static void
-special_symbol_handling (void)
{
-#ifndef SVR4_SHARED_LIBS
- int j;
-
- if (debug_addr == 0)
- {
- /* Get link_dynamic structure */
-
- j = target_read_memory (debug_base, (char *) &dynamic_copy,
- sizeof (dynamic_copy));
- if (j)
- {
- /* unreadable */
- return;
- }
-
- /* Calc address of debugger interface structure */
- /* FIXME, this needs work for cross-debugging of core files
- (byteorder, size, alignment, etc). */
-
- debug_addr = SOLIB_EXTRACT_ADDRESS (dynamic_copy.ldd);
- }
-
- /* Read the debugger structure from the inferior, just to make sure
- we have a current copy. */
-
- j = target_read_memory (debug_addr, (char *) &debug_copy,
- sizeof (debug_copy));
- if (j)
- return; /* unreadable */
-
- /* Get common symbol definitions for the loaded object. */
-
- if (debug_copy.ldd_cp)
- {
- solib_add_common_symbols (SOLIB_EXTRACT_ADDRESS (debug_copy.ldd_cp));
- }
-
-#endif /* !SVR4_SHARED_LIBS */
+ TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK ();
}
@@ -2281,7 +753,6 @@ sharedlibrary_command (char *args, int f
solib_add (args, from_tty, (struct target_ops *) 0);
}
-#endif /* HAVE_LINK_H */
void
_initialize_solib (void)
Index: solist.h
===================================================================
RCS file: solist.h
diff -N solist.h
--- /dev/null Tue May 5 13:32:27 1998
+++ solist.h Sun Oct 22 17:43:55 2000
@@ -0,0 +1,91 @@
+/* Shared library declarations for GDB, the GNU Debugger.
+ Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999, 2000
+ 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. */
+
+#define SO_NAME_MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */
+
+/* Forward declaration for target specific link map information. This
+ struct is opaque to all but the target specific file. */
+struct lm_info;
+
+struct so_list
+ {
+ /* The following fields of the structure come directly from the
+ dynamic linker's tables in the inferior, and are initialized by
+ current_sos. */
+
+ struct so_list *next; /* next structure in linked list */
+
+ /* A pointer to target specific link map information. Often this
+ will be a copy of struct link_map from the user process, but
+ it need not be; it can be any collection of data needed to
+ traverse the dynamic linker's data structures. */
+ struct lm_info *lm_info;
+
+ /* Shared object file name, exactly as it appears in the
+ inferior's link map. This may be a relative path, or something
+ which needs to be looked up in LD_LIBRARY_PATH, etc. We use it
+ to tell which entries in the inferior's dynamic linker's link
+ map we've already loaded. */
+ char so_original_name[SO_NAME_MAX_PATH_SIZE];
+
+ /* shared object file name, expanded to something GDB can open */
+ char so_name[SO_NAME_MAX_PATH_SIZE];
+
+ /* The following fields of the structure are built from
+ information gathered from the shared object file itself, and
+ are initialized when we actually add it to our symbol tables. */
+
+ bfd *abfd;
+ CORE_ADDR lmend; /* upper addr bound of mapped object */
+ char symbols_loaded; /* flag: symbols read in yet? */
+ char from_tty; /* flag: print msgs? */
+ struct objfile *objfile; /* objfile for loaded lib */
+ struct section_table *sections;
+ struct section_table *sections_end;
+ struct section_table *textsection;
+ };
+
+struct target_so_ops
+ {
+ CORE_ADDR (*lm_addr) (struct so_list *so);
+ void (*free_so) (struct so_list *so);
+ void (*clear_solib) (void);
+ void (*solib_create_inferior_hook) (void);
+ void (*special_symbol_handling) (void);
+ struct so_list *(*current_sos) (void);
+ int (*open_symbol_file_object) (int *from_ttyp);
+ };
+
+void free_so (struct so_list *so);
+
+/* FIXME: gdbarch needs to control this variable */
+extern struct target_so_ops *current_target_so_ops;
+
+#define TARGET_SO_LM_ADDR (current_target_so_ops->lm_addr)
+#define TARGET_SO_FREE_SO (current_target_so_ops->free_so)
+#define TARGET_SO_CLEAR_SOLIB (current_target_so_ops->clear_solib)
+#define TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK \
+ (current_target_so_ops->solib_create_inferior_hook)
+#define TARGET_SO_SPECIAL_SYMBOL_HANDLING \
+ (current_target_so_ops->special_symbol_handling)
+#define TARGET_SO_CURRENT_SOS (current_target_so_ops->current_sos)
+#define TARGET_SO_OPEN_SYMBOL_FILE_OBJECT \
+ (current_target_so_ops->open_symbol_file_object)
Index: sparc-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sparc-tdep.c,v
retrieving revision 1.8
diff -u -p -r1.8 sparc-tdep.c
--- sparc-tdep.c 2000/10/16 17:19:47 1.8
+++ sparc-tdep.c 2000/10/23 00:43:59
@@ -33,14 +33,13 @@
#ifdef USE_PROC_FS
#include <sys/procfs.h>
+/* Prototypes for supply_gregset etc. */
+#include "gregset.h"
#endif
#include "gdbcore.h"
#include "symfile.h" /* for 'entry_point_address' */
-
-/* Prototypes for supply_gregset etc. */
-#include "gregset.h"
/*
* Some local macros that have multi-arch and non-multi-arch versions:
Index: config/alpha/alpha-linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/alpha/alpha-linux.mh,v
retrieving revision 1.3
diff -u -p -r1.3 alpha-linux.mh
--- alpha-linux.mh 2000/06/12 06:09:04 1.3
+++ alpha-linux.mh 2000/10/23 00:43:59
@@ -3,7 +3,7 @@ XDEPFILES=
XM_FILE= xm-alphalinux.h
NAT_FILE= nm-linux.h
NATDEPFILES= infptrace.o inftarg.o corelow.o alpha-nat.o \
- fork-child.o solib.o linux-thread.o lin-thread.o
+ fork-child.o solib.o solib-svr4.o linux-thread.o lin-thread.o
LOADLIBES = -ldl -rdynamic
Index: config/alpha/fbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/alpha/fbsd.mh,v
retrieving revision 1.2
diff -u -p -r1.2 fbsd.mh
--- fbsd.mh 2000/06/12 06:09:04 1.2
+++ fbsd.mh 2000/10/23 00:43:59
@@ -1,6 +1,6 @@
# Host: FreeBSD/Alpha
XDEPFILES=
-NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o \
+NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o \
corelow.o core-regset.o alphabsd-nat.o
XM_FILE= xm-fbsd.h
NAT_FILE= nm-fbsd.h
Index: config/arm/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/linux.mh,v
retrieving revision 1.4
diff -u -p -r1.4 linux.mh
--- linux.mh 2000/06/12 06:09:05 1.4
+++ linux.mh 2000/10/23 00:44:00
@@ -4,7 +4,7 @@ XM_FILE= xm-linux.h
XDEPFILES=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o corelow.o \
+NATDEPFILES= infptrace.o solib.o solib-svr4.o inftarg.o fork-child.o corelow.o \
core-regset.o arm-linux-nat.o linux-thread.o lin-thread.o
LOADLIBES= -ldl -rdynamic
Index: config/i386/fbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/fbsd.mh,v
retrieving revision 1.4
diff -u -p -r1.4 fbsd.mh
--- fbsd.mh 2000/07/05 11:11:58 1.4
+++ fbsd.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: Intel 386 running FreeBSD
XDEPFILES=
# NOTE: Do not spread NATDEPFILES over several lines - it hurts BSD make.
-NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o corelow.o core-aout.o core-regset.o i387-nat.o i386bsd-nat.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o corelow.o core-aout.o core-regset.o i387-nat.o i386bsd-nat.o
XM_FILE= xm-fbsd.h
NAT_FILE= nm-fbsd.h
Index: config/i386/i386dgux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386dgux.mh,v
retrieving revision 1.2
diff -u -p -r1.2 i386dgux.mh
--- i386dgux.mh 2000/06/12 06:09:05 1.2
+++ i386dgux.mh 2000/10/23 00:44:00
@@ -6,5 +6,5 @@ XDEPFILES=
XM_CLIBS= -lsocket -lnsl
NAT_FILE= nm-i386v4.h
-NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o i386v4-nat.o \
+NATDEPFILES= corelow.o core-regset.o solib.o solib-svr4.o fork-child.o i386v4-nat.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
Index: config/i386/i386gnu.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386gnu.mh,v
retrieving revision 1.2
diff -u -p -r1.2 i386gnu.mh
--- i386gnu.mh 2000/02/26 13:46:56 1.2
+++ i386gnu.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: Intel 386 running the GNU Hurd
XDEPFILES= i387-tdep.o
-NATDEPFILES= i386gnu-nat.o gnu-nat.o fork-child.o solib.o corelow.o notify_S.o process_reply_S.o msg_reply_S.o msg_U.o exc_request_U.o exc_request_S.o
+NATDEPFILES= i386gnu-nat.o gnu-nat.o fork-child.o solib.o solib-svr4.o corelow.o notify_S.o process_reply_S.o msg_reply_S.o msg_U.o exc_request_U.o exc_request_S.o
XM_FILE= xm-i386gnu.h
NAT_FILE= nm-gnu.h
MH_CFLAGS = -D_GNU_SOURCE
Index: config/i386/i386sco5.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386sco5.mh,v
retrieving revision 1.2
diff -u -p -r1.2 i386sco5.mh
--- i386sco5.mh 2000/06/12 06:09:05 1.2
+++ i386sco5.mh 2000/10/23 00:44:00
@@ -13,5 +13,5 @@ XM_CLIBS= -lPW -lsocket
NAT_FILE= nm-i386sco5.h
NATDEPFILES= infptrace.o inftarg.o fork-child.o corefile.o core-aout.o \
- corelow.o i386v-nat.o solib.o
+ corelow.o i386v-nat.o solib.o solib-svr4.o
Index: config/i386/i386sol2.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386sol2.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 i386sol2.mt
--- i386sol2.mt 1999/04/16 01:34:19 1.1.1.1
+++ i386sol2.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Intel 386 running SVR4
-TDEPFILES= i386-tdep.o i387-tdep.o solib.o
+TDEPFILES= i386-tdep.o i387-tdep.o solib.o solib-svr4.o
TM_FILE= tm-i386sol2.h
Index: config/i386/i386v4.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386v4.mh,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 i386v4.mh
--- i386v4.mh 2000/02/01 03:19:14 1.1.1.3
+++ i386v4.mh 2000/10/23 00:44:00
@@ -6,5 +6,5 @@ XDEPFILES=
XM_CLIBS= -lsocket -lnsl
NAT_FILE= nm-i386v4.h
-NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o i386v4-nat.o \
+NATDEPFILES= corelow.o core-regset.o solib.o solib-svr4.o fork-child.o i386v4-nat.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
Index: config/i386/i386v42mp.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386v42mp.mh,v
retrieving revision 1.1.1.4
diff -u -p -r1.1.1.4 i386v42mp.mh
--- i386v42mp.mh 2000/02/01 03:19:14 1.1.1.4
+++ i386v42mp.mh 2000/10/23 00:44:00
@@ -8,6 +8,6 @@ XM_CLIBS= -lsocket -lnsl
# we don't want nm-i386v4.h since that defines LOSING_POLL which isn't
# appropriate for i386v42mp
NAT_FILE= nm-i386v42mp.h
-NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o i386v4-nat.o \
+NATDEPFILES= corelow.o core-regset.o solib.o solib-svr4.o fork-child.o i386v4-nat.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o uw-thread.o
Index: config/i386/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/linux.mh,v
retrieving revision 1.4
diff -u -p -r1.4 linux.mh
--- linux.mh 2000/09/03 18:41:28 1.4
+++ linux.mh 2000/10/23 00:44:00
@@ -4,7 +4,7 @@ XM_FILE= xm-linux.h
XDEPFILES=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o corelow.o \
+NATDEPFILES= infptrace.o solib.o solib-svr4.o inftarg.o fork-child.o corelow.o \
core-aout.o i386v-nat.o i386-linux-nat.o i387-nat.o \
proc-service.o thread-db.o lin-lwp.o
Index: config/i386/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsd.mh,v
retrieving revision 1.4
diff -u -p -r1.4 nbsd.mh
--- nbsd.mh 2000/06/12 06:09:05 1.4
+++ nbsd.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: Intel 386 running NetBSD
XDEPFILES=
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o \
- i386nbsd-nat.o solib.o
+ i386nbsd-nat.o solib.o solib-svr4.o
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsd.h
Index: config/i386/nbsdelf.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nbsdelf.mh,v
retrieving revision 1.2
diff -u -p -r1.2 nbsdelf.mh
--- nbsdelf.mh 2000/06/12 06:09:05 1.2
+++ nbsdelf.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: Intel 386 running NetBSD
XDEPFILES=
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o \
- i386nbsd-nat.o solib.o
+ i386nbsd-nat.o solib.o solib-svr4.o
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsdelf.h
Index: config/i386/ncr3000.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/ncr3000.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 ncr3000.mt
--- ncr3000.mt 1999/04/16 01:34:19 1.1.1.1
+++ ncr3000.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Intel 386 running SVR4
-TDEPFILES= i386-tdep.o i387-tdep.o solib.o
+TDEPFILES= i386-tdep.o i387-tdep.o solib.o solib-svr4.o
TM_FILE= tm-i386v4.h
Index: config/i386/ptx4.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/ptx4.mh,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 ptx4.mh
--- ptx4.mh 1999/04/16 01:34:19 1.1.1.1
+++ ptx4.mh 2000/10/23 00:44:00
@@ -1,7 +1,7 @@
# Host: Sequent Symmetry running ptx 1.3, with Weitek 1167 or i387
XM_FILE= xm-ptx4.h
-XDEPFILES= inftarg.o fork-child.o symm-nat.o corelow.o core-aout.o solib.o core-regset.o
+XDEPFILES= inftarg.o fork-child.o symm-nat.o corelow.o core-aout.o solib.o solib-svr4.o core-regset.o
XM_CLIBS= -lseq
NAT_FILE= nm-ptx4.h
Index: config/i386/sun386.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/sun386.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 sun386.mt
--- sun386.mt 1999/04/16 01:34:19 1.1.1.1
+++ sun386.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Sun 386i target configuration file.
-TDEPFILES= i386-tdep.o solib.o
+TDEPFILES= i386-tdep.o solib.o solib-svr4.o
TM_FILE= tm-sun386.h
Index: config/ia64/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/ia64/linux.mh,v
retrieving revision 1.3
diff -u -p -r1.3 linux.mh
--- linux.mh 2000/06/12 06:34:32 1.3
+++ linux.mh 2000/10/23 00:44:00
@@ -4,7 +4,7 @@ XM_FILE= xm-linux.h
XDEPFILES=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o corelow.o \
+NATDEPFILES= infptrace.o solib.o solib-svr4.o inftarg.o fork-child.o corelow.o \
core-aout.o core-regset.o ia64-linux-nat.o linux-thread.o lin-thread.o
LOADLIBES = -ldl -rdynamic
Index: config/m68k/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/linux.mh,v
retrieving revision 1.2
diff -u -p -r1.2 linux.mh
--- linux.mh 2000/06/12 06:09:05 1.2
+++ linux.mh 2000/10/23 00:44:00
@@ -4,7 +4,7 @@ XM_FILE= xm-linux.h
XDEPFILES=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o \
+NATDEPFILES= infptrace.o solib.o solib-svr4.o inftarg.o fork-child.o \
corelow.o core-aout.o core-regset.o m68klinux-nat.o linux-thread.o
GDBSERVER_DEPFILES= low-linux.o
Index: config/m68k/m68kv4.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/m68kv4.mh,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 m68kv4.mh
--- m68kv4.mh 2000/02/01 03:19:15 1.1.1.3
+++ m68kv4.mh 2000/10/23 00:44:00
@@ -4,5 +4,5 @@ XM_FILE= xm-m68kv4.h
XDEPFILES=
NAT_FILE= nm-sysv4.h
-NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o procfs.o \
+NATDEPFILES= corelow.o core-regset.o solib.o solib-svr4.o fork-child.o procfs.o \
proc-api.o proc-events.o proc-flags.o proc-why.o
Index: config/m68k/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/nbsd.mh,v
retrieving revision 1.3
diff -u -p -r1.3 nbsd.mh
--- nbsd.mh 2000/06/12 06:09:05 1.3
+++ nbsd.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: Motorola m68k running NetBSD
XDEPFILES=
NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \
- m68knbsd-nat.o solib.o
+ m68knbsd-nat.o solib.o solib-svr4.o
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsd.h
Index: config/m68k/sun2os4.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/sun2os4.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 sun2os4.mt
--- sun2os4.mt 1999/04/16 01:34:22 1.1.1.1
+++ sun2os4.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Sun 2, running SunOS 4
-TDEPFILES= solib.o m68k-tdep.o
+TDEPFILES= solib.o solib-svr4.o m68k-tdep.o
TM_FILE= tm-sun2os4.h
Index: config/m68k/sun3os4.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/sun3os4.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 sun3os4.mt
--- sun3os4.mt 1999/04/16 01:34:22 1.1.1.1
+++ sun3os4.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Sun 3, running SunOS 4, as a target system
-TDEPFILES= solib.o m68k-tdep.o
+TDEPFILES= solib.o solib-svr4.o m68k-tdep.o
TM_FILE= tm-sun3os4.h
Index: config/m88k/delta88v4.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/m88k/delta88v4.mh,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 delta88v4.mh
--- delta88v4.mh 2000/02/01 03:19:16 1.1.1.3
+++ delta88v4.mh 2000/10/23 00:44:00
@@ -4,5 +4,5 @@ XM_FILE= xm-delta88v4.h
XDEPFILES=
NAT_FILE= nm-delta88v4.h
-NATDEPFILES= fork-child.o m88k-nat.o corelow.o core-regset.o solib.o \
+NATDEPFILES= fork-child.o m88k-nat.o corelow.o core-regset.o solib.o solib-svr4.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
Index: config/mips/mipsv4.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/mips/mipsv4.mh,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 mipsv4.mh
--- mipsv4.mh 2000/02/01 03:19:17 1.1.1.3
+++ mipsv4.mh 2000/10/23 00:44:00
@@ -1,5 +1,5 @@
# Host: Mips running SVR4
XM_FILE= xm-mipsv4.h
NAT_FILE= ../nm-sysv4.h
-NATDEPFILES= fork-child.o mipsv4-nat.o corelow.o core-regset.o solib.o \
+NATDEPFILES= fork-child.o mipsv4-nat.o corelow.o core-regset.o solib.o solib-svr4.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
Index: config/ns32k/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/ns32k/nbsd.mh,v
retrieving revision 1.3
diff -u -p -r1.3 nbsd.mh
--- nbsd.mh 2000/06/12 06:09:05 1.3
+++ nbsd.mh 2000/10/23 00:44:00
@@ -1,6 +1,6 @@
# Host: PC532 running NetBSD
XDEPFILES=
NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o \
- ns32knbsd-nat.o solib.o
+ ns32knbsd-nat.o solib.o solib-svr4.o
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsd.h
Index: config/powerpc/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/powerpc/linux.mh,v
retrieving revision 1.4
diff -u -p -r1.4 linux.mh
--- linux.mh 2000/09/18 01:08:24 1.4
+++ linux.mh 2000/10/23 00:44:00
@@ -5,7 +5,7 @@ XDEPFILES=
XM_CLIBS=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o corelow.o \
+NATDEPFILES= infptrace.o solib.o solib-svr4.o inftarg.o fork-child.o corelow.o \
core-aout.o core-regset.o ppc-linux-nat.o proc-service.o thread-db.o lin-lwp.o
LOADLIBES = -ldl -rdynamic
Index: config/powerpc/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/powerpc/nbsd.mh,v
retrieving revision 1.2
diff -u -p -r1.2 nbsd.mh
--- nbsd.mh 2000/06/12 06:09:05 1.2
+++ nbsd.mh 2000/10/23 00:44:00
@@ -1,5 +1,5 @@
# Host: PowerPC, running NetBSD
XDEPFILES=
-NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o solib.o ppcnbsd-nat.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o solib.o solib-svr4.o ppcnbsd-nat.o
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsd.h
Index: config/powerpc/solaris.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/powerpc/solaris.mh,v
retrieving revision 1.2
diff -u -p -r1.2 solaris.mh
--- solaris.mh 2000/06/12 06:09:05 1.2
+++ solaris.mh 2000/10/23 00:44:00
@@ -5,7 +5,7 @@ XDEPFILES=
XM_CLIBS= -lsocket -lnsl
NAT_FILE= nm-solaris.h
-NATDEPFILES= corelow.o core-sol2.o solib.o fork-child.o procfs.o \
+NATDEPFILES= corelow.o core-sol2.o solib.o solib-svr4.o fork-child.o procfs.o \
proc-api.o proc-events.o proc-flags.o proc-why.o
# If you are compiling with Sun's compiler, add the -xs option to CC
Index: config/rs6000/rs6000lynx.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/rs6000/rs6000lynx.mt,v
retrieving revision 1.2
diff -u -p -r1.2 rs6000lynx.mt
--- rs6000lynx.mt 2000/07/31 20:56:44 1.2
+++ rs6000lynx.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: IBM RS6000 running LynxOS
-TDEPFILES= coff-solib.o rs6000-tdep.o ppc-linux-tdep.o
+TDEPFILES= coff-solib.o solib-svr4.o rs6000-tdep.o ppc-linux-tdep.o
TM_FILE= tm-rs6000ly.h
Index: config/sparc/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/linux.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 linux.mt
--- linux.mt 1999/04/16 01:34:25 1.1.1.1
+++ linux.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Sparcstation, running Linux
-TDEPFILES= sparc-tdep.o solib.o
+TDEPFILES= sparc-tdep.o solib.o solib-svr4.o
TM_FILE= tm-linux.h
Index: config/sparc/nbsd.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/nbsd.mh,v
retrieving revision 1.2
diff -u -p -r1.2 nbsd.mh
--- nbsd.mh 2000/06/12 06:09:05 1.2
+++ nbsd.mh 2000/10/23 00:44:00
@@ -2,5 +2,5 @@
XDEPFILES=
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsd.h
-NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o solib-svr4.o
HOST_IPC=-DBSD_IPC
Index: config/sparc/nbsdelf.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/nbsdelf.mh,v
retrieving revision 1.2
diff -u -p -r1.2 nbsdelf.mh
--- nbsdelf.mh 2000/06/12 06:09:05 1.2
+++ nbsdelf.mh 2000/10/23 00:44:00
@@ -2,5 +2,5 @@
XDEPFILES=
XM_FILE= xm-nbsd.h
NAT_FILE= nm-nbsdelf.h
-NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o solib-svr4.o
HOST_IPC=-DBSD_IPC
Index: config/sparc/sun4os4.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/sun4os4.mt,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 sun4os4.mt
--- sun4os4.mt 1999/04/16 01:34:26 1.1.1.1
+++ sun4os4.mt 2000/10/23 00:44:00
@@ -1,3 +1,3 @@
# Target: Sun 4 or Sparcstation, running SunOS 4
-TDEPFILES= sparc-tdep.o solib.o
+TDEPFILES= sparc-tdep.o solib.o solib-svr4.o
TM_FILE= tm-sun4os4.h
Index: config/sparc/sun4sol2.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/sparc/sun4sol2.mh,v
retrieving revision 1.2
diff -u -p -r1.2 sun4sol2.mh
--- sun4sol2.mh 2000/06/12 06:09:06 1.2
+++ sun4sol2.mh 2000/10/23 00:44:00
@@ -5,7 +5,7 @@ XDEPFILES=
XM_CLIBS= -lsocket -lnsl
NAT_FILE= nm-sun4sol2.h
-NATDEPFILES= corelow.o core-sol2.o solib.o fork-child.o procfs.o \
+NATDEPFILES= corelow.o core-sol2.o solib.o solib-svr4.o fork-child.o procfs.o \
proc-api.o proc-events.o proc-flags.o proc-why.o
# If you are compiling with Sun's compiler, add the -xs option to CC
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: tracepoints implementation: bug in byte code generating.
[not found] ` <004001c03d2c$14209970$6c219fa8@lss.emc.com>
@ 2000-10-23 13:18 ` Michael Snyder
0 siblings, 0 replies; 7+ messages in thread
From: Michael Snyder @ 2000-10-23 13:18 UTC (permalink / raw)
To: Josef Ezra; +Cc: gdb-patches, shagam, sgordon
Josef Ezra wrote:
>
> > > > > -In actions:
> > > > > -- Trace/ref different memory ranges.
> > > >
> > > > Not sure what you mean by the above.
> > >
> > > As I mentioned before, our target is working with two memory spaces:
> regular
> > > and shared. It is very common to have a pointer in regular memory that
> > > points to a structure in shared memory which one of it's field is a
> pointer
> > > to different structure in shared memory which I would like to trace.
> > > Something like:
> > > - Special-trace (from other memory space) X bytes in offset Y from:
> > > - Special-trace-ref (size is pointer size) in offset Z from:
> > > - My-regular-memory-pointer
> >
> > If we add support for separate memory spaces to GDB,
> > then I would favor adding it to the traceing syntax
> > as well. Otherwise not. I don't want to start throwing
> > a bunch of stuff into trace that would only be supported
> > on this target or that one. And if GDB can't support
> > multi-address-spaces, then you wouldn't have a standard
> > way to display your results.
> >
> > The whole strength of the tracing implementation,
> > in my opinion, is that it uses the same expression
> > syntax as the rest of GDB. Therefore whatever data
> > you collect can be used by the rest of GDB without
> > modification.
> >
>
> What is the appropriate generic interface to trace and show other memory
> spaces? I can use a good advice here.
Well, first we would need a generic interface to DEBUG
other memory spaces. That was my point. Once we had that,
then we would know how to incorporate it into trace.
But gdb is the dog and trace is the tail -- we should
not have the tail wagging the dog.
Michael
From dberlin@redhat.com Mon Oct 23 13:38:00 2000
From: Daniel Berlin <dberlin@redhat.com>
To: Kevin Buettner <kevinb@cygnus.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: That dwarf2read patch i just submitted
Date: Mon, 23 Oct 2000 13:38:00 -0000
Message-id: <m3d7grpa35.fsf@dan2.cygnus.com>
References: <m3zojvmz9j.fsf@dan2.cygnus.com> <1001023165317.ZM12542@ocotillo.lan> <m3aebvqyxy.fsf@dan2.cygnus.com> <1001023173236.ZM12624@ocotillo.lan>
X-SW-Source: 2000-10/msg00155.html
Content-length: 3534
Kevin Buettner <kevinb@cygnus.com> writes:
> On Oct 23, 12:55pm, Daniel Berlin wrote:
>
> > Kevin Buettner <kevinb@cygnus.com> writes:
> >
> > > On Oct 23, 10:02am, Daniel Berlin wrote:
> > >
> > > > So no one feels slighted, that last dwarf2 patch I submitted (to add
> > > > support for .debug_loc) is based on a patch I found on gdb-patches
> > > > that is a few years old, submitted originally by one of the ADA guys.
> > > > I cleaned it up so that it works with dwarf2read of today, but if you
> > > > want credit, email me, and i'll put your name in the ChangeLog
> > > > instead.
> > >
> > > Dan,
> > >
> > > You should definitely give credit to the original submitter of the
> > > patch (whether they step forward or not). Also, you should make sure
> > > that we have a copyright assignment on file for whomever submitted
> > > that patch.
> >
> > The problem is I can't seem to find it in the archives anymore using
> > the search engine, or else I would have. I really don't want to go
> > back month by month, trying to find the patch again.
>
> It looks to me like it was
>
> http://sources.redhat.com/ml/gdb-patches/1999-q2/msg00054.html
>
> The author of this patch is Brian Nettleton.
Thanks, let me hunt him down.
>
> > The patch is actually <30 lines of code, and thus, shouldn't require
> > copyright assignment.
>
> I'm not sure what the metric is for requiring a copyright assignment,
> but I thought it was lower than 30. (Perhaps Andrew could let us
> know?)
I thought it was a couple hundred lines.
>
> Anyway, you're off by an order of magnitude. If I'm looking at the
> right patch, it's actually 322 lines long.
That's with context and everything, what matters is the amount of code
modified.
> The number of lines
> affected by this patch is also greater than 30. The locblock function
> and corresponding comment alone are 39 lines.
>
> > I also modified every line of the patch, literally.
>
> It is true that you modified many of the lines, but you didn't touch
> *all* of them.
I was almost positive I did.
I could add support for multiple block location lists, which should
mean touching every line.
>
> E.g, with the exception of the comment (which you split to be on two
> lines),
This was probably emacs, filling it.
> the following section from Brian's patch appears to be identical
> to what you submitted:
>
> + {
> + char *loc_ptr;
> + struct dwarf_block *result;
> +
> + switch (attr->form)
> + {
> + case DW_FORM_block:
> + case DW_FORM_block1:
> + case DW_FORM_block2:
> + case DW_FORM_block4:
> + return DW_BLOCK(attr);
> + case DW_FORM_ref_addr:
> + case DW_FORM_ref_udata:
> + /* return the first block in the location list for now */
> + loc_ptr = dwarf_loc_buffer + dwarf2_get_ref_die_offset(attr);
>
> Even if you had modified every line from Brian's patch, he should
> still be credited for the changes.
Oh, thus I know, i'm trying to avoid having to get him to sign
copyright assignment if he hasn't already.
> It's a maintainer's job to adapt a
> patch so that it works with current sources.
> Adapting a patch that is
> several years old may well require substantial modification, but the
> original submitter should still be given credit. (And if he's to be
> given credit, we must then observe the FSF's mandates regarding
> copyright assignments.)
Sigh.
I'll redo the work then.
Is there any way i can give him credit, without having to get a
copyright assignment from him?
>
> Kevin
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2000-10-23 13:18 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-10-02 11:04 bug in tracepoint protocol implementation Josef Ezra
2000-10-02 11:20 ` Michael Snyder
2000-10-03 10:29 ` Josef Ezra
[not found] ` <004e01c039d8$774c1d50$6c219fa8@lss.emc.com>
2000-10-19 10:32 ` tracepoints implementation: bug in byte code generating Michael Snyder
[not found] ` <005b01c039f6$f46b1390$6c219fa8@lss.emc.com>
2000-10-19 11:06 ` Michael Snyder
[not found] ` <006101c039f9$df09df60$6c219fa8@lss.emc.com>
[not found] ` <5mvguo5spm.fsf@jtc.redback.com>
[not found] ` <008501c03aad$46c9d700$6c219fa8@lss.emc.com>
[not found] ` <39F090F3.2DDC@redhat.com>
[not found] ` <009001c03adb$b46a7b60$6c219fa8@lss.emc.com>
2000-10-20 14:54 ` Michael Snyder
[not found] ` <003d01c03b0e$42568040$961919ac@lss.emc.com>
[not found] ` <39F47D62.2B5B@redhat.com>
[not found] ` <004001c03d2c$14209970$6c219fa8@lss.emc.com>
2000-10-23 13:18 ` Michael Snyder
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox