From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21905 invoked by alias); 21 Oct 2002 18:43:16 -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 21895 invoked from network); 21 Oct 2002 18:43:15 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 21 Oct 2002 18:43:15 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id g9LIM1w24276 for ; Mon, 21 Oct 2002 14:22:01 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id g9LIhEf23138 for ; Mon, 21 Oct 2002 14:43:14 -0400 Received: from localhost.redhat.com (IDENT:YH/XZ4B7eD89en6mGkE1cjd0nPLxHwba@tooth.toronto.redhat.com [172.16.14.29]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id g9LIhBU03040 for ; Mon, 21 Oct 2002 14:43:12 -0400 Received: by localhost.redhat.com (Postfix, from userid 469) id 67F2CFF79; Mon, 21 Oct 2002 14:40:27 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15796.18970.995786.527092@localhost.redhat.com> Date: Mon, 21 Oct 2002 11:43:00 -0000 To: gdb-patches@sources.redhat.com Cc: Subject: Re: [RFA] solib-svr4.c fetch link map address In-Reply-To: <15770.22961.366656.980373@localhost.redhat.com> References: <15770.22961.366656.980373@localhost.redhat.com> X-SW-Source: 2002-10/txt/msg00335.txt.bz2 Elena Zannoni writes: > > This function is used by thread_db.c. Gdb needs to pass the address of > the link map to glibc. Glibc will compute the address of a thread > local variable, given such address and the offset within the thread > local storage at which the variable is stored (gdb gets the offset out > of the debug info). > > The interface for the glibc function is like this: > > extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th, > void *__map_address, size_t __offset, > void **__address); > > The function loops through the link maps, and returns the address of > the one corresponding to the given objfile. Note that this function > takes into account that objfile can be the main executable, not just a > shared library. The main executable has always an empty name field in > the linkmap. > > Elena > > 2002-10-01 Elena Zannoni > > * solib-svr4.c (svr4_fetch_objfile_link_map): New function. > * solib-svr4.h (svr4_fetch_objfile_link_map): Export. > I committed the following. Elena Index: solib-svr4.c =================================================================== RCS file: /cvs/src/src/gdb/solib-svr4.c,v retrieving revision 1.26 diff -u -p -r1.26 solib-svr4.c --- solib-svr4.c 9 Jun 2002 16:39:00 -0000 1.26 +++ solib-svr4.c 21 Oct 2002 14:55:53 -0000 @@ -762,6 +762,77 @@ svr4_current_sos (void) return head; } +/* Get the address of the link_map for a given OBJFILE. Loop through + the link maps, and return the address of the one corresponding to + the given objfile. Note that this function takes into account that + objfile can be the main executable, not just a shared library. The + main executable has always an empty name field in the linkmap. */ + +CORE_ADDR +svr4_fetch_objfile_link_map (struct objfile *objfile) +{ + CORE_ADDR lm; + + if ((debug_base = locate_base ()) == 0) + return 0; /* failed somehow... */ + + /* Position ourselves on the first link map. */ + lm = first_link_map_member (); + while (lm) + { + /* Get info on the layout of the r_debug and link_map structures. */ + struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + int errcode; + char *buffer; + struct lm_info objfile_lm_info; + struct cleanup *old_chain; + CORE_ADDR name_address; + char *l_name_buf = xmalloc (lmo->l_name_size); + old_chain = make_cleanup (xfree, l_name_buf); + + /* Set up the buffer to contain the portion of the link_map + structure that gdb cares about. Note that this is not the + whole link_map structure. */ + objfile_lm_info.lm = xmalloc (lmo->link_map_size); + make_cleanup (xfree, objfile_lm_info.lm); + memset (objfile_lm_info.lm, 0, lmo->link_map_size); + + /* Read the link map into our internal structure. */ + read_memory (lm, objfile_lm_info.lm, lmo->link_map_size); + + /* Read address of name from target memory to GDB. */ + read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size); + + /* Extract this object's name. */ + name_address = extract_address (l_name_buf, + lmo->l_name_size); + target_read_string (name_address, &buffer, + SO_NAME_MAX_PATH_SIZE - 1, &errcode); + make_cleanup (xfree, buffer); + if (errcode != 0) + { + warning ("svr4_fetch_objfile_link_map: Can't read pathname for load map: %s\n", + safe_strerror (errcode)); + } + else + { + /* Is this the linkmap for the file we want? */ + /* If the file is not a shared library and has no name, + we are sure it is the main executable, so we return that. */ + if ((buffer && strcmp (buffer, objfile->name) == 0) + || (!(objfile->flags & OBJF_SHARED) && (strcmp (buffer, "") == 0))) + { + do_cleanups (old_chain); + return lm; + } + } + /* Not the file we wanted, continue checking. */ + lm = extract_address (objfile_lm_info.lm + lmo->l_next_offset, + lmo->l_next_size); + do_cleanups (old_chain); + } + return 0; +} /* On some systems, the only way to recognize the link map entry for the main executable file is by looking at its name. Return