Make writing to files work properly. (Fixes to BFD are also needed.)

* core.c (core_open):  Open file ourselves, read or r/w, depending on
write_files.  Use bfd_fdopenr.
* gdbcore.h (write_files):  New variable.
* exec.c (write_files):  Define variable, add set&show for it.
(exec_file_command):  Use write_files to open for read or r/write.

Make shared library reading happen automatically.  These changes
are mostly from Peter Schauer <pes@regent.e-technik.tu-muenchen.de>.

* inferior.h (stop_soon_quietly):  Add to exported variables.
* infrun.c (child_create_inferior):  call solib hook, if defined.
(child_attach):  call solib hook, if defined.
* solib.c:  Include inferior.h.  Add from_tty to so_list as kludge.
(find_solib):  Use lookup_misc_func rather than hand-rolled.
(symbol_add_stub):  New stub for catch_errors.
(solib_add):  Avoid output if !from_tty.  Catch errors rather
than just calling symbol_file_add and bombing.
(solib_create_inferior_hook):  Interface with the target process
to let it read and alloc shared libs, then figure out what it did.

* core.c (validate_files):  Fix typo, soften warning.
(Fix from Hiroto Kagotani <kagotani@cs.titech.ac.jp>.)

* utils.c (fputs_demangled):  Avoid duplicate printing if
demangling is off.  (Fix from J.T. Conklin <jtc@cayenne.com>.)

* infrun.c (proceed):  Cast -1 to (CORE_ADDR) before comparing.
(Fix from pierre@la.tce.com (Pierre Willard).)

* main.c (catch_errors):  Change argument to a char * from an int,
since a char * can point to a struct full of glop, but an int
is not guaranteed to be able to hold a pointer.
* breakpoint.c (breakpoint_cond_eval, bpstat_stop_status,
breakpoint_re_set_one, breakpoint_re_set):  Adapt.
* core.c (core_open, solib_add_stub):  Adapt.
* remote-vx.c (symbol_stub, add_symbol_stub, callers):  Adapt.
This commit is contained in:
John Gilmore
1991-09-04 07:43:50 +00:00
parent 7c589d2562
commit bdbd5f5086
11 changed files with 454 additions and 271 deletions

View File

@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include "defs.h"
#include "param.h"
#include "frame.h" /* required by inferior.h */
@@ -79,9 +80,9 @@ core_close (quitting)
int
solib_add_stub (from_tty)
int from_tty;
char *from_tty;
{
SOLIB_ADD (NULL, from_tty, &core_ops);
SOLIB_ADD (NULL, (int)from_tty, &core_ops);
return 0;
}
#endif /* SOLIB_ADD */
@@ -99,6 +100,7 @@ core_open (filename, from_tty)
char *temp;
bfd *temp_bfd;
int ontop;
int scratch_chan;
target_preopen (from_tty);
if (!filename)
@@ -116,7 +118,12 @@ core_open (filename, from_tty)
}
old_chain = make_cleanup (free, filename);
temp_bfd = bfd_openr (filename, NULL);
scratch_chan = open (filename, write_files? O_RDWR: O_RDONLY, 0);
if (scratch_chan < 0)
perror_with_name (filename);
temp_bfd = bfd_fdopenr (filename, NULL, scratch_chan);
if (temp_bfd == NULL)
{
perror_with_name (filename);
@@ -161,7 +168,7 @@ core_open (filename, from_tty)
/* Add symbols and section mappings for any shared libraries */
#ifdef SOLIB_ADD
(void) catch_errors (solib_add_stub, from_tty, (char *)0);
(void) catch_errors (solib_add_stub, (char *)from_tty, (char *)0);
#endif
/* Now, set up the frame cache, and print the top of stack */
set_current_frame ( create_new_frame (read_register (FP_REGNUM),
@@ -242,8 +249,8 @@ validate_files ()
{
if (exec_bfd && core_bfd)
{
if (core_file_matches_executable_p (core_bfd, exec_bfd))
printf ("Warning: core file does not match specified executable file.\n");
if (!core_file_matches_executable_p (core_bfd, exec_bfd))
printf ("Warning: core file may not match specified executable file.\n");
else if (bfd_get_mtime(exec_bfd) > bfd_get_mtime(core_bfd))
printf ("Warning: exec file is newer than core file.\n");
}