X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fexec.c;h=e0652fbaec15a5bf10f77767dccc5beff5296804;hb=524b06e02c295d755d4272c6ba5c97f6bcfb95a8;hp=edb730802d649d778c3f2fd7e30cd99c4e71b11b;hpb=020cc13c3a0782029f408a8164a13a1e5af6d538;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/exec.c b/gdb/exec.c index edb730802d..e0652fbaec 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -1,7 +1,8 @@ /* Work with executable files, for GDB. - Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, - 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + + Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, + 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, + Inc. This file is part of GDB. @@ -30,12 +31,14 @@ #include "objfiles.h" #include "completer.h" #include "value.h" +#include "exec.h" #ifdef USG #include #endif #include +#include "readline/readline.h" #include "gdb_string.h" #include "gdbcore.h" @@ -50,12 +53,10 @@ struct vmap *map_vmap (bfd *, bfd *); -void (*file_changed_hook) (char *); +void (*deprecated_file_changed_hook) (char *); /* Prototypes for local functions */ -static void add_to_section_table (bfd *, sec_ptr, PTR); - static void exec_close (int); static void file_command (char *, int); @@ -64,8 +65,6 @@ static void set_section_command (char *, int); static void exec_files_info (struct target_ops *); -static void bfdsec_to_vmap (bfd *, sec_ptr, PTR); - static int ignore (CORE_ADDR, char *); static void init_exec_ops (void); @@ -84,14 +83,6 @@ bfd *exec_bfd = NULL; int write_files = 0; -/* Text start and end addresses (KLUDGE) if needed */ - -#ifndef NEED_TEXT_START_END -#define NEED_TEXT_START_END (0) -#endif -CORE_ADDR text_start = 0; -CORE_ADDR text_end = 0; - struct vmap *vmap; void @@ -101,7 +92,6 @@ exec_open (char *args, int from_tty) exec_file_attach (args, from_tty); } -/* ARGSUSED */ static void exec_close (int quitting) { @@ -204,7 +194,7 @@ exec_file_attach (char *filename, int from_tty) char *scratch_pathname; int scratch_chan; - scratch_chan = openp (getenv ("PATH"), 1, filename, + scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename, write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, &scratch_pathname); #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__) @@ -212,8 +202,9 @@ exec_file_attach (char *filename, int from_tty) { char *exename = alloca (strlen (filename) + 5); strcat (strcpy (exename, filename), ".exe"); - scratch_chan = openp (getenv ("PATH"), 1, exename, write_files ? - O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, &scratch_pathname); + scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename, + write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, + &scratch_pathname); } #endif if (scratch_chan < 0) @@ -242,7 +233,7 @@ exec_file_attach (char *filename, int from_tty) /* FIXME - This should only be run for RS6000, but the ifdef is a poor way to accomplish. */ -#ifdef IBM6000_TARGET +#ifdef DEPRECATED_IBM6000_TARGET /* Setup initial vmap. */ map_vmap (exec_bfd, 0); @@ -254,7 +245,7 @@ exec_file_attach (char *filename, int from_tty) error ("\"%s\": can't find the file sections: %s", scratch_pathname, bfd_errmsg (bfd_get_error ())); } -#endif /* IBM6000_TARGET */ +#endif /* DEPRECATED_IBM6000_TARGET */ if (build_section_table (exec_bfd, &exec_ops.to_sections, &exec_ops.to_sections_end)) @@ -266,30 +257,9 @@ exec_file_attach (char *filename, int from_tty) scratch_pathname, bfd_errmsg (bfd_get_error ())); } - /* text_end is sometimes used for where to put call dummies. A - few ports use these for other purposes too. */ - if (NEED_TEXT_START_END) - { - struct section_table *p; - - /* Set text_start to the lowest address of the start of any - readonly code section and set text_end to the highest - address of the end of any readonly code section. */ - /* FIXME: The comment above does not match the code. The - code checks for sections with are either code *or* - readonly. */ - text_start = ~(CORE_ADDR) 0; - text_end = (CORE_ADDR) 0; - for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) - if (bfd_get_section_flags (p->bfd, p->the_bfd_section) - & (SEC_CODE | SEC_READONLY)) - { - if (text_start > p->addr) - text_start = p->addr; - if (text_end < p->endaddr) - text_end = p->endaddr; - } - } +#ifdef DEPRECATED_HPUX_TEXT_END + DEPRECATED_HPUX_TEXT_END (&exec_ops); +#endif validate_files (); @@ -298,9 +268,10 @@ exec_file_attach (char *filename, int from_tty) push_target (&exec_ops); /* Tell display code (if any) about the changed file name. */ - if (exec_file_display_hook) - (*exec_file_display_hook) (filename); + if (deprecated_exec_file_display_hook) + (*deprecated_exec_file_display_hook) (filename); } + bfd_cache_close_all (); } /* Process the first arg in ARGS as the new exec file. @@ -355,8 +326,8 @@ file_command (char *arg, int from_tty) the exec file, but that's rough. */ exec_file_command (arg, from_tty); symbol_file_command (arg, from_tty); - if (file_changed_hook) - file_changed_hook (arg); + if (deprecated_file_changed_hook) + deprecated_file_changed_hook (arg); } @@ -365,7 +336,8 @@ file_command (char *arg, int from_tty) we cast it back to its proper type. */ static void -add_to_section_table (bfd *abfd, sec_ptr asect, PTR table_pp_char) +add_to_section_table (bfd *abfd, struct bfd_section *asect, + void *table_pp_char) { struct section_table **table_pp = (struct section_table **) table_pp_char; flagword aflag; @@ -386,7 +358,7 @@ add_to_section_table (bfd *abfd, sec_ptr asect, PTR table_pp_char) Returns 0 if OK, 1 on error. */ int -build_section_table (bfd *some_bfd, struct section_table **start, +build_section_table (struct bfd *some_bfd, struct section_table **start, struct section_table **end) { unsigned count; @@ -404,7 +376,7 @@ build_section_table (bfd *some_bfd, struct section_table **start, } static void -bfdsec_to_vmap (bfd *abfd, sec_ptr sect, PTR arg3) +bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3) { struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3; struct vmap *vp; @@ -414,14 +386,14 @@ bfdsec_to_vmap (bfd *abfd, sec_ptr sect, PTR arg3) if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0) return; - if (STREQ (bfd_section_name (abfd, sect), ".text")) + if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".text")) { vp->tstart = bfd_section_vma (abfd, sect); vp->tend = vp->tstart + bfd_section_size (abfd, sect); vp->tvma = bfd_section_vma (abfd, sect); vp->toffs = sect->filepos; } - else if (STREQ (bfd_section_name (abfd, sect), ".data")) + else if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".data")) { vp->dstart = bfd_section_vma (abfd, sect); vp->dend = vp->dstart + bfd_section_size (abfd, sect); @@ -484,7 +456,6 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, int res; struct section_table *p; CORE_ADDR nextsectaddr, memend; - int (*xfer_fn) (bfd *, sec_ptr, PTR, file_ptr, bfd_size_type); asection *section = NULL; if (len <= 0) @@ -498,7 +469,6 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, } memend = memaddr + len; - xfer_fn = write ? bfd_set_section_contents : bfd_get_section_contents; nextsectaddr = memend; for (p = target->to_sections; p < target->to_sections_end; p++) @@ -511,8 +481,14 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, if (memend <= p->endaddr) { /* Entire transfer is within this section. */ - res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, - memaddr - p->addr, len); + if (write) + res = bfd_set_section_contents (p->bfd, p->the_bfd_section, + myaddr, memaddr - p->addr, + len); + else + res = bfd_get_section_contents (p->bfd, p->the_bfd_section, + myaddr, memaddr - p->addr, + len); return (res != 0) ? len : 0; } else if (memaddr >= p->endaddr) @@ -524,8 +500,14 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, { /* This section overlaps the transfer. Just do half. */ len = p->endaddr - memaddr; - res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, - memaddr - p->addr, len); + if (write) + res = bfd_set_section_contents (p->bfd, p->the_bfd_section, + myaddr, memaddr - p->addr, + len); + else + res = bfd_get_section_contents (p->bfd, p->the_bfd_section, + myaddr, memaddr - p->addr, + len); return (res != 0) ? len : 0; } } @@ -544,6 +526,8 @@ void print_section_info (struct target_ops *t, bfd *abfd) { struct section_table *p; + /* FIXME: "016l" is not wide enough when TARGET_ADDR_BIT > 64. */ + char *fmt = TARGET_ADDR_BIT <= 32 ? "08l" : "016l"; printf_filtered ("\t`%s', ", bfd_get_filename (abfd)); wrap_here (" "); @@ -556,12 +540,17 @@ print_section_info (struct target_ops *t, bfd *abfd) } for (p = t->to_sections; p < t->to_sections_end; p++) { - /* FIXME-32x64 need a print_address_numeric with field width */ - printf_filtered ("\t%s", local_hex_string_custom ((unsigned long) p->addr, "08l")); - printf_filtered (" - %s", local_hex_string_custom ((unsigned long) p->endaddr, "08l")); + printf_filtered ("\t%s", local_hex_string_custom (p->addr, fmt)); + printf_filtered (" - %s", local_hex_string_custom (p->endaddr, fmt)); + + /* FIXME: A format of "08l" is not wide enough for file offsets + larger than 4GB. OTOH, making it "016l" isn't desirable either + since most output will then be much wider than necessary. It + may make sense to test the size of the file and choose the + format string accordingly. */ if (info_verbose) printf_filtered (" @ %s", - local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l")); + local_hex_string_custom (p->the_bfd_section->filepos, "08l")); printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section)); if (p->bfd != abfd) { @@ -714,8 +703,6 @@ Specify the filename of the executable file."; exec_ops.to_open = exec_open; exec_ops.to_close = exec_close; exec_ops.to_attach = find_default_attach; - exec_ops.to_require_attach = find_default_require_attach; - exec_ops.to_require_detach = find_default_require_detach; exec_ops.to_xfer_memory = xfer_memory; exec_ops.to_files_info = exec_files_info; exec_ops.to_insert_breakpoint = ignore; @@ -760,7 +747,7 @@ This can be used if the exec file does not contain section addresses,\n\ file itself are wrong. Each section must be changed separately. The\n\ ``info files'' command lists all the sections and their addresses."); - add_show_from_set + deprecated_add_show_from_set (add_set_cmd ("write", class_support, var_boolean, (char *) &write_files, "Set writing into executable and core files.", &setlist),