/* Work with executable files, for GDB.
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
- 1998, 1999, 2000, 2001, 2002, 2003, 2007 Free Software Foundation, Inc.
+ 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008
+ Free Software Foundation, Inc.
This file is part of GDB.
#include "value.h"
#include "exec.h"
#include "observer.h"
+#include "arch-utils.h"
#include <fcntl.h>
#include "readline/readline.h"
/* The Binary File Descriptor handle for the executable file. */
bfd *exec_bfd = NULL;
+long exec_bfd_mtime = 0;
/* Whether to open exec and core files read-only or read-write. */
name, bfd_errmsg (bfd_get_error ()));
xfree (name);
exec_bfd = NULL;
+ exec_bfd_mtime = 0;
}
if (exec_ops.to_sections)
scratch_pathname, bfd_errmsg (bfd_get_error ()));
}
+ exec_bfd_mtime = bfd_get_mtime (exec_bfd);
+
validate_files ();
set_gdbarch_from_file (exec_bfd);
(*deprecated_exec_file_display_hook) (filename);
}
bfd_cache_close_all ();
- observer_notify_executable_changed (NULL);
+ observer_notify_executable_changed ();
}
/* Process the first arg in ARGS as the new exec file.
{
struct section_table *p;
/* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64. */
- int wid = gdbarch_addr_bit (current_gdbarch) <= 32 ? 8 : 16;
+ int wid = gdbarch_addr_bit (gdbarch_from_bfd (abfd)) <= 32 ? 8 : 16;
printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
wrap_here (" ");
printf_filtered (_("file type %s.\n"), bfd_get_target (abfd));
if (abfd == exec_bfd)
- {
- printf_filtered (_("\tEntry point: "));
- deprecated_print_address_numeric (bfd_get_start_address (abfd), 1, gdb_stdout);
- printf_filtered ("\n");
- }
+ printf_filtered (_("\tEntry point: %s\n"),
+ paddress (bfd_get_start_address (abfd)));
for (p = t->to_sections; p < t->to_sections_end; p++)
{
printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
}
}
-/* msnyder 5/21/99:
- exec_set_section_offsets sets the offsets of all the sections
- in the exec objfile. */
-
-void
-exec_set_section_offsets (bfd_signed_vma text_off, bfd_signed_vma data_off,
- bfd_signed_vma bss_off)
-{
- struct section_table *sect;
-
- for (sect = exec_ops.to_sections;
- sect < exec_ops.to_sections_end;
- sect++)
- {
- flagword flags;
-
- flags = bfd_get_section_flags (exec_bfd, sect->the_bfd_section);
-
- if (flags & SEC_CODE)
- {
- sect->addr += text_off;
- sect->endaddr += text_off;
- }
- else if (flags & (SEC_DATA | SEC_LOAD))
- {
- sect->addr += data_off;
- sect->endaddr += data_off;
- }
- else if (flags & SEC_ALLOC)
- {
- sect->addr += bss_off;
- sect->endaddr += bss_off;
- }
- }
-}
-
static void
set_section_command (char *args, int from_tty)
{
error (_("Section %s not found"), secprint);
}
-/* If we can find a section in FILENAME with BFD index INDEX, and the
- user has not assigned an address to it yet (via "set section"), adjust it
- to ADDRESS. */
+/* If we can find a section in FILENAME with BFD index INDEX, adjust
+ it to ADDRESS. */
void
exec_set_section_address (const char *filename, int index, CORE_ADDR address)
for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
{
if (strcmp (filename, p->bfd->filename) == 0
- && index == p->the_bfd_section->index
- && p->addr == 0)
+ && index == p->the_bfd_section->index)
{
+ p->endaddr += address - p->addr;
p->addr = address;
- p->endaddr += address;
}
}
}