From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20939 invoked by alias); 2 Feb 2004 04:47:47 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20914 invoked from network); 2 Feb 2004 04:47:45 -0000 Received: from unknown (HELO gateway.sf.frob.com) (64.81.54.130) by sources.redhat.com with SMTP; 2 Feb 2004 04:47:45 -0000 Received: from magilla.sf.frob.com (magilla.sf.frob.com [198.49.250.228]) by gateway.sf.frob.com (Postfix) with ESMTP id 16195357B; Sun, 1 Feb 2004 20:47:44 -0800 (PST) Received: from magilla.sf.frob.com (localhost.localdomain [127.0.0.1]) by magilla.sf.frob.com (8.12.9/8.12.9) with ESMTP id i124lgOi023813; Sun, 1 Feb 2004 20:47:42 -0800 Received: (from roland@localhost) by magilla.sf.frob.com (8.12.9/8.12.9/Submit) id i124lfMl023809; Sun, 1 Feb 2004 20:47:41 -0800 Date: Mon, 02 Feb 2004 04:47:00 -0000 Message-Id: <200402020447.i124lfMl023809@magilla.sf.frob.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit From: Roland McGrath To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com Subject: Re: [PATCH] add-symbol-file-from-memory command In-Reply-To: Daniel Jacobowitz's message of Sunday, 1 February 2004 23:06:41 -0500 <20040202040641.GA9495@nevyn.them.org> X-Antipastobozoticataclysm: When George Bush projectile vomits antipasto on the Japanese. X-SW-Source: 2004-02/txt/msg00016.txt.bz2 > I can't approve this patch, but I have some comments anyway. Much appreciated. > There also was a segfault when the objfile is released. To reproduce, > I could just say "file\n" after loading one. GDB will try to > xfree(""). I see that this is fixed in the patch below, so > if the bits were unchanged from your last post then I must have come up > with the wrong copy. I won't testify to not having noticed and fixed (and since forgotten) some small bug like this between the last time I posted and today. Probably I did. > I can tell you one problem with this patch, based on my backport of it: > there's an annoying/incorrect message when a program is re-run, saying: > "" has disappeared; keeping its symbols > > This is merely an annoyance, the message is harmless but should be > fixed. I don't see this. AFAICT it just loses the symbols, like it should. What exactly is the recipe for seeing this? This may be something else I forgot I changed. It sets the OBJF_SHARED flag, which means the objfile is dropped by objfile_purge_solibs for "run". > Mind doing this in some way that isn't gratuitously quadratic? Sure. I only used bfd_map_over_sections since it was said to be preferred. > Please remove the check and the !from_tty branch. An error is fine in > either case, and internal errors are not appropriate for user input. > Further down you have different error behavior on !from_tty also. Is > there a particular inspiration for this? My thinking was that when there are later internal calls to this function from target code, it would be an indication of a bug in the target code if it ever got called for a non-ELF target, and those would be the called with from_tty==0, hence the gdb_assert. The other errors indicate that the thing was reasonable to attempt, but failed. I think I copied the from_tty conditional for those errors from some other code I found similar, but I may be misremembering. I am more than happy to have you tell me a clear policy on what from_tty should or shouldn't affect. > > + reinit_frame_cache (); /* ??? */ > > Yes, this is necessary if the current cached backtrace would pass > through the newly loaded object. I appreciate the explanation. I've added a comment. I'm appending my current version of the symfile.c part of the patch. Thanks, Roland Index: symfile.c =================================================================== RCS file: /cvs/src/src/gdb/symfile.c,v retrieving revision 1.117 diff -u -b -p -r1.117 symfile.c --- symfile.c 23 Jan 2004 17:56:46 -0000 1.117 +++ symfile.c 2 Feb 2004 04:41:50 -0000 @@ -799,6 +799,10 @@ new_symfile_objfile (struct objfile *obj NAME is the file name (which will be tilde-expanded and made absolute herein) (but we don't free or modify NAME itself). + If ABFD is not null, it's already open and should be used instead of + opening the file by name. This BFD will be closed on error, and + is always consumed by this function. + FROM_TTY says how verbose to be. MAINLINE specifies whether this is the main symbol file, or whether @@ -811,7 +815,7 @@ new_symfile_objfile (struct objfile *obj Upon success, returns a pointer to the objfile that was added. Upon failure, jumps back to command level (never returns). */ static struct objfile * -symbol_file_add_with_addrs_or_offsets (char *name, int from_tty, +symbol_file_add_with_addrs_or_offsets (char *name, bfd *abfd, int from_tty, struct section_addr_info *addrs, struct section_offsets *offsets, int num_offsets, @@ -820,15 +824,17 @@ symbol_file_add_with_addrs_or_offsets (c struct objfile *objfile; struct partial_symtab *psymtab; char *debugfile; - bfd *abfd; struct section_addr_info *orig_addrs; struct cleanup *my_cleanups; /* Open a bfd for the file, and give user a chance to burp if we'd be interactively wiping out any existing symbols. */ + if (abfd == NULL) abfd = symfile_bfd_open (name); + my_cleanups = make_cleanup_bfd_close (abfd); + if ((have_full_symbols () || have_partial_symbols ()) && mainline && from_tty @@ -836,6 +842,7 @@ symbol_file_add_with_addrs_or_offsets (c error ("Not confirmed."); objfile = allocate_objfile (abfd, flags); + discard_cleanups (my_cleanups); orig_addrs = alloc_section_addr_info (bfd_count_sections (abfd)); my_cleanups = make_cleanup (xfree, orig_addrs); @@ -952,7 +959,8 @@ struct objfile * symbol_file_add (char *name, int from_tty, struct section_addr_info *addrs, int mainline, int flags) { - return symbol_file_add_with_addrs_or_offsets (name, from_tty, addrs, 0, 0, + return symbol_file_add_with_addrs_or_offsets (name, NULL, from_tty, + addrs, 0, 0, mainline, flags); } @@ -1802,6 +1810,90 @@ add_shared_symbol_files_command (char *a #endif } +/* Read inferior memory at ADDR to find the header of a loaded object file + and read its in-core symbols out of inferior memory. TEMPL is a bfd + representing the target's format. */ +struct objfile * +symbol_file_add_from_memory (bfd *templ, CORE_ADDR addr, int from_tty) +{ + struct objfile *objf; + bfd *nbfd; + asection *sec; + bfd_vma loadbase; + struct section_addr_info *sai; + unsigned int i; + + if (bfd_get_flavour (templ) != bfd_target_elf_flavour) + error ("add-symbol-file-from-memory not supported for this target"); + + nbfd = bfd_elf_bfd_from_remote_memory (templ, addr, &loadbase, + target_read_memory); + if (nbfd == NULL) + { + if (from_tty) + error ("Failed to read a valid object file image from memory."); + return NULL; + } + + nbfd->filename = xstrdup ("shared object read from target memory"); + + if (!bfd_check_format (nbfd, bfd_object)) + { + /* FIXME: should be checking for errors from bfd_close (for one thing, + on error it does not free all the storage associated with the + bfd). */ + bfd_close (nbfd); + if (from_tty) + error ("Got object file from memory but can't read symbols: %s.", + bfd_errmsg (bfd_get_error ())); + return NULL; + } + + sai = alloc_section_addr_info (bfd_count_sections (nbfd)); + make_cleanup (xfree, sai); + i = 0; + for (sec = nbfd->sections; sec != NULL; sec = sec->next) + if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0) + { + sai->other[i].addr = bfd_get_section_vma (nbfd, sec) + loadbase; + sai->other[i].name = (char *) bfd_get_section_name (nbfd, sec); + sai->other[i].sectindex = sec->index; + ++i; + } + + objf = symbol_file_add_with_addrs_or_offsets ((char *) nbfd->filename, nbfd, + from_tty, sai, NULL, 0, 0, + OBJF_SHARED); + + /* This might change our ideas about frames already looked at. */ + reinit_frame_cache (); + + return objf; +} + +static void +add_symbol_file_from_memory_command (char *args, int from_tty) +{ + CORE_ADDR addr; + bfd *templ; + + if (args == NULL) + error ("add-symbol-file-from-memory requires an expression argument"); + + addr = parse_and_eval_address (args); + + /* We need some representative bfd to know the target we are looking at. */ + if (symfile_objfile != NULL) + templ = symfile_objfile->obfd; + else + templ = exec_bfd; + if (templ == NULL) + error ("\ +Must use symbol-file or exec-file before add-symbol-file-from-memory."); + + (void) symbol_file_add_from_memory (templ, addr, from_tty); +} + /* Re-read symbols if a symbol-file has changed. */ void reread_symbols (void) @@ -2063,7 +2155,7 @@ reread_separate_symbols (struct objfile Preserve the flags from objfile that make sense. */ objfile->separate_debug_objfile = (symbol_file_add_with_addrs_or_offsets - (debug_file, + (debug_file, NULL, info_verbose, /* from_tty: Don't override the default. */ 0, /* No addr table. */ objfile->section_offsets, objfile->num_sections, @@ -3566,6 +3658,13 @@ with the text. SECT is a section name t &cmdlist); set_cmd_completer (c, filename_completer); + c = add_cmd ("add-symbol-file-from-memory", class_files, + add_symbol_file_from_memory_command, + "Usage: add-symbol-file-from-memory ADDR\n\ +Load the symbols out of memory from a dynamically loaded object file.\n\ +ADDR is the starting address of the file's shared object file header.", + &cmdlist); + c = add_cmd ("add-shared-symbol-files", class_files, add_shared_symbol_files_command, "Load the symbols from shared objects in the dynamic linker's link map.",