From patchwork Wed Apr 26 22:46:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 20172 Received: (qmail 40802 invoked by alias); 26 Apr 2017 22:47:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 40685 invoked by uid 89); 26 Apr 2017 22:47:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy=principles, so, digested, confident X-HELO: sessmg23.ericsson.net Received: from sessmg23.ericsson.net (HELO sessmg23.ericsson.net) (193.180.251.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 26 Apr 2017 22:47:42 +0000 Received: from ESESSHC006.ericsson.se (Unknown_Domain [153.88.183.36]) by sessmg23.ericsson.net (Symantec Mail Security) with SMTP id 22.6A.06507.B8321095; Thu, 27 Apr 2017 00:47:42 +0200 (CEST) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.36) with Microsoft SMTP Server (TLS) id 14.3.339.0; Thu, 27 Apr 2017 00:47:38 +0200 Authentication-Results: sourceware.org; dkim=none (message not signed) header.d=none; sourceware.org; dmarc=none action=none header.from=ericsson.com; Received: from elxcz23q12-y4.ca.am.ericsson.se (192.75.88.130) by VI1PR07MB1725.eurprd07.prod.outlook.com (10.166.143.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1075.1; Wed, 26 Apr 2017 22:47:35 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH 02/10] Make various lm_info implementations inherit from a base class Date: Wed, 26 Apr 2017 18:46:58 -0400 Message-ID: <20170426224706.27988-3-simon.marchi@ericsson.com> In-Reply-To: <20170426224706.27988-1-simon.marchi@ericsson.com> References: <20170426224706.27988-1-simon.marchi@ericsson.com> MIME-Version: 1.0 X-ClientProxiedBy: MWHPR2201CA0037.namprd22.prod.outlook.com (10.172.59.11) To VI1PR07MB1725.eurprd07.prod.outlook.com (10.166.143.21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3f9ee074-f1b0-460f-7285-08d48cf63c62 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:VI1PR07MB1725; X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1725; 3:vrmfhO4mngkkPkK67SF9p4M0OVbGvEEmThgNQ5Nnb3k4n8kMtWym7wYi5ipYFEP6RznX+C6tYb5NCoL5664WZY1v1zT6RFk0weJnleh4J3m9w6PtXHNzDcLVHXuVJ8Zp8mYseSqA1KjU3MvCU3OGIvCvfB2602356decxRz3IYQwpZlF9fjUKkGN0S4fpRRUKVo5NDgRbL6gGOZdGg8VQpjjzHWNuyPIY5Cs1zRk54U0cNLKiBoA1FiHQg6F/xK2ZcKr9pj4USMTt8pl//htVtRTHszWzj6ONYWvd4Cr4D07nOnzHcjjNkuGWVisJAUy/Ky5ZsqL0Vr9/RbGkgaDPw==; 25:JI24PbXq0ChOG8D5p5cb6N6Ndu7I+UgsqcIzF4PaEEXq/uWX7nEpRY2Dqx5wEkBRohmi1391IS8UEEab5vGmA575NNkXfP4xG79nK5ePClj4Fr+hdxO5TGMXH063K8+aOsLNbNa9CFrnx+SuezAX7+2zfxGN4zOcWBMSfTusNJ43/E07EwW3+PM/bjW6Aa15Ti2EjNCkChNX9ub5B402GTU3mo3Td4He5a5u2fEC0XMcx2r3GzZHArxJCc4t5bJhMYx5Kh72p9m1MsTwu9m6fJSEbHjdVYpddfSq6O6FWNZ+qdihczm6cHJOkX7AD72mxDBRwIs++k5/ugR5UvEh4BoK1C3ax0Bfla6kIe2QUAFHZx1XkuD4BO/7sRaotnn+GSkpsfb+FhQhlobaS17rDMeGuTwR4KcSt4QLlzhpwsdvnSEpOorP1bOwZuv27etSXxOhn8IcLC35nOnhshdXD9zn/6wG5U8e20n9/YOCqEE= X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1725; 31:V4cmxWKtYPoptRqllVpsNJAdOvzySWajxaxFxGuSrJfNxYCp/xeeUPQb1a7RNle3VJJTtX3FS8buhMO8QK3Z0ENgqGgiLZ9KXeGNA4x0j7mLTEST7cBsYgW/xl9YniWeOOnOCumHJZI4jy8YRc2tMJtFIp9C/rmS2ij+V/CLME/YTR/VZiAmF0+QPFv4SHls+yGHZIMvfb8u/L1unnYOjti69C0BODEjjMMTWfYWIFVEt+i8thSjyuXm0z7tT78n; 20:ycP26NFPYe4o1QmlgB9qh4CF8gUZSelJklLYG9NfZdHo36AgM1yqPgA0U8xFysxYS1GBbUQjAOgdfkUvbdIw4KC/nC07gAs11hBo8rpvEenmfGvfosl8VnQDRWkCkZlSSD3+wml7MCJXTa8Y++nKzRo+b7dEbl5VHMyrBfGppuMnTECspUhW4+ODMlLXLU05OLXZwKO+SZclZo2kcd1CBt2NVQSemh6j57NGtyz61uIBO5GqlPEYLSqP5KuFZ/R9/FTeSs3ryPMZgwLw9JXJwBLjkGSJe24d1lELnuB0OhNz5wiKO5k9b/7xBAsztRMwtS0PjOEArXuUAYfNSebGiHvhqAZoS3M2hUBDRllsfo1jiExl/I6bJdOPZZWUW8gI7zW8JL22X4SDzzaTNDbcRJ8xXkxB8zTbe4xyAYhW4brOnBobZUmv++M6dxd5VdE3/VMhx6gUv60Wck/7ZLyNIUsDFal/QrH/REO2nmxDyS0nYkT0HmFkaMGi35d1EuGB X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(6041248)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123564025)(20161123558100)(6072148); SRVR:VI1PR07MB1725; BCL:0; PCL:0; RULEID:; SRVR:VI1PR07MB1725; X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1725; 4:w7YmdXgkL+5k53xM47nUlFl4PEOSbUjSru+3aVdMR9xtUODgO/h5KkbYfWCU7V4Qi0otmq8b2Asi/t4ym19XUtecIwAK+u05paR4euBivjnrY3vUz56guPFuZWjpb08oFmD2pt9hdqBFU5uNdX1x53Cbr3exBwhu74WfiKx/J4txhPHx4GlTcCsXK+1ngDLkkcqoWOjomTToGmHuKvTQxfjPoR+M1grVcHAM/pkAqcKCpc24JNyoLFiCtIduR7hh73eC1tyaSkQRskQMJqyGm/B7J8VgzeyTnwzSjMblwq8G2HC1a+X9o8nS68vuvcRphp27TamYoXSlpn/Q+hHQEORq6aY1mTOkTjHRpahsXJCFZsK3u+lDV46+aVwBRoW4hTKxVHKQsSZ2N3hlJGzUBvG+4PeTIuDBhPsTgAh9CpnTBx/mmRX1XpnNypucfy+TexOgrKvw72+MFKWJ1JjWTpEO0X5Ju8oX3SFo9Pm6o+d3rPA9LfvWdAl1Gvw67XjRtjWAZE8pX7VACu+nGwCsUlAPH1/Eq3L1kyF9JLzQW+l4dd953gcdeQ4jI6YTWt51mzT5xb6/fIzOlsE/u6cYss9QqwuQmnt3fHhQUhvyLx4KPlOGIdd7O48b5qQKNQdB5gtwsxt0mQ1d4v05yS7TF3XY7hAmSHgxMZ5WVc+d/grY9Zs+1yv5UAfhB5EmQZe6NPHQL32h03UvbVtSxwNlyNKkMrbh5AvzCGwZoFXJ4DrXPDXl1k14PDnAJIhaI2wtetEjp8tw/sQwFQbAKAKqTRhPz8VcmU7GqSw1/8ypcE8= X-Forefront-PRVS: 0289B6431E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39410400002)(39860400002)(39400400002)(39840400002)(39450400003)(39850400002)(54534003)(33646002)(25786009)(5003940100001)(4326008)(53936002)(53946003)(2351001)(86362001)(2906002)(5660300001)(6916009)(6666003)(47776003)(6116002)(2950100002)(7736002)(305945005)(1076002)(3846002)(38730400002)(6506006)(110136004)(50226002)(36756003)(189998001)(6512007)(42186005)(50466002)(48376002)(76176999)(8676002)(6486002)(81166006)(66066001)(50986999)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR07MB1725; H:elxcz23q12-y4.ca.am.ericsson.se; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR07MB1725; 23:SRBiLQlFpDUvxnuld+XMT0kGzqD69Pk1U7wGBzC6Y?= =?us-ascii?Q?QCCwkWH4OgXjg+XxvpwYnLu+XtxDoU+IiYT5vTq12ID/LZyo8p39VFJ91UrQ?= =?us-ascii?Q?bwYMnrEvYGfSBUeBLCgTKTxI9cYiBFhD4NW3Kb3wo27WxyxyXq1/bHF+4uy8?= =?us-ascii?Q?GvEMQrSJRTtBN2ZT7NY/egSArB1utmxD+jnCedb0cRDhJW9J0xfua+WBTqWG?= =?us-ascii?Q?R83xpiTM/COW/PSua0xJCytEQKDtJcRZYljGFXR0D9+0367U1YaPewm079uG?= =?us-ascii?Q?0swpk9MSaJP9ZPOh7N0mpdK16Fpsk9FjX1nU+tAfKtTxyg9mxroP6dWqTbxl?= =?us-ascii?Q?Xe4VXEzY6unCkB/iUSWPYbyiOQ/xjPHwwH4gVjYzyHoC3aOKUk+BCORc1n5p?= =?us-ascii?Q?o/GvJJS15646p4WuF6VuuRnrfXSfacqUN9Wdjz0eSfAu48lTC94VDpHuIkgn?= =?us-ascii?Q?1AZdGcpv79E5ccuDx+W5QYUq5IQg+D4nvo0KWHhz31qPeV121hxwFgBTTtK5?= =?us-ascii?Q?7SfVs8eW77j+zhowjhrMZ71xqGU8H97HkPpM4NX6APYSPu1eK88DLWFjew27?= =?us-ascii?Q?8cVpQGFeSTnCfPyvY+pUik/4fk6JOlPf5cpNeRTfIvrrOg1ahrZK4s24ka6I?= =?us-ascii?Q?grRIyhlr2uXKSHg5Lnc4i+68rdW7m2ysPvhDD7lsyKHafxh++50anFKwwcje?= =?us-ascii?Q?FwLUo1E3B9ywVp3+gqDSJ8czGOMvyul6abad4F+zlQAFF0ZguoVWGje8JCYc?= =?us-ascii?Q?T28RQme7b+eFWg5UYnNfins8fpb/x9hXDDqoQr7ew8YL5qrlL2g5CF+IqxiC?= =?us-ascii?Q?kJamWogBLKXj0uWl/SDNcYhyakJOfIoIUU+n6JG3T6fQoStgA/IeFJhlu1qT?= =?us-ascii?Q?Ub+gyh++akzbDlQfw+AmT6jjaA0ufiGfTIbeNwMfnNF43uXJIPDWyxYJgV+M?= =?us-ascii?Q?+m+6Fbs7rkyMAH1nX8tAoP/RmHAUJh/3sUsfjcxkBD0sau+R1AnnD9PB3oKy?= =?us-ascii?Q?jTcAaELCDoEj49PtkzinCu4XC+WUuQ74EJN8jfbq6UBCRFnYdgE8SzxEn/WX?= =?us-ascii?Q?bYlekdl8vXKtj985alJEdrZ0LdAwjKXlIuULdfc4xFEPnnaC03Ysr1rK+OEf?= =?us-ascii?Q?ytWCfAjlbQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1725; 6:MHDhtNDCnv+LWBLsQXHgDer+GW3KEtZZ4qcIEBzNr8I6bEcaxv3kJQ/YpSqBnjXLauV1Vb350CqCZmy6c4dui8Fm695k+LqyV598sXihTHO3Zz0yxKWYV+gA44p80K7Jf6yRigMpT6MgAUHKaBBflNOyFtfw07m97gKp4TqRCVfD4t+aU7lYeNc/lTU6rU5CnwkxsBd6NMOjMolLWiv6boq6/j9OpgKgqV1/GIqj86/nOUACXZvjZVKToAMr3j9FqfVDN4uVnv7u18Y/4CqIYpFMTxOa+PVq+X9KBRenzRhCWfjY7X9eF2+3ro/shsDSpyH9V3mTPnw+D7XIjMHv1KcKf1AuGEA1+PO3r1cvs7YUNDx1oLkikgK170J97lavHbuWBvQbtpNHk4WOtFXfNCN5vIroTVJo+KnP0pi04VXV/tSdxPxK6kyaCKN4/WbSUdR8V5I0LKTk8NUwBQaDLPPNfEesYm0xWj573lD/+l40Ks5RIrUW5EIUB+r/WB6KwHbE55b2k1CQiZU7idixvA==; 5:FYJUX/2hpRuh9KL3wXFUI+MrSu2egsFhA63STu5ZDs2Wp8l7OWD4UJ5VwUGr6ALIgDrKRKfMIhKFVIFCwUYR56qS1T1jdJXxvwWn1P+/6kKRtEpWlHWqT/DXXw1gy06M8qUXCTpAi7t1mKRhJgu7lg==; 24:Xhfsg6m4Z374/5N3LyYzuK9TpMXfVD+/7gcuux6Wn52YihhV3XgI4zlo2g5dreGwDCiH7BVLwJpowqQLE422vrfHcNf/LRJ4RNSPC4d+jGk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1725; 7:CLrey0FYQR8oh2kOwJ7uaDcBedqFyzy0ebIDyTBli5KEkj0tyhI8YpZGfR0kiBr/1ecu5yCEHHOOT9jT5dNYFxKbOhE3IOwFihuq+s/Eh/lT59IxAQXO88ynLg8o0gdvhoROLDf8xEoCSwgJDqJfXMc7G/GrvjJyWTo4Ux5ywwcpjtxNR1j+o9uJad4vTO8vIaMnyfJiO9664/nygbjYuKxeANHwTF0kefkVy4KIfrlLxK9xjOVagIIvMUeFVg0mAAeBYpyIfRYMxZpIGXEED/M01ibInOvor0QKiAyvx3Jid+hu+QTMmNMhnRPuO3AaT5xs7fDIe33hlwyT29bJ9w== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Apr 2017 22:47:35.9479 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB1725 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes From: Simon Marchi The lm_info structure is used to store target specific information about mapped libraries. It is currently defined as an opaque type in solist.h and a pointer to it is included in solist, the target-agnostic object representing a loaded shared library. Multiple targets define their own implementation of lm_info. In anticipation of using C++ stuff (e.g. vector) in the lm_info objects, we first need to avoid different definitions of classes with the same name (which violates the one definition rule). This patch does it by having a base class (lm_info_base) from which all the specific lm_info derive. Each implementation is renamed to something that makes sense (e.g. lm_info_aix for AIX). The next logical step would probably be to derive directly from so_list, but it's not really obvious, so I'll keep that for another day. One special case is the Neutrino (nto) support. It uses SVR4-style libraries, but overrides some methods. To do that, it needed to have its own copy of SVR4's lm_info structure in nto-tdep.c, because it was just not possible to put it in solib-svr4.h and include that file. Over time, that copy got out of sync, which is still the case today. I can only assume that the lm_addr function in nto-tdep.c is broken right now. The first field of the old lm_info was a pointer (gdb_byte *), whereas in the new lm_info it's an address in the inferior (CORE_ADDR). Trying to use that field today probably results in a crash. With this refactor, it's now possible to put lm_info_svr4 in solib-svr4.h and just include it. I have adapted the code in nto-tdep.c to that it builds, but it's probably not correct. Since I don't have the knowledge nor setup to try this on Neutrino, somebody else would have to fix it. But I am confident that I am not making things worse than they already are. gdb/ChangeLog: * solist.h (struct lm_info): Remove. (struct lm_info_base): New class. (struct so_list) : Change type to lm_info_base *. * nto-tdep.c (struct lm_info): Remove. (lm_addr): Adjust. * solib-aix.c (struct lm_info): Rename to ... (struct lm_info_aix): ... this. Extend lm_info_base. (lm_info_p): Rename to ... (lm_info_aix_p): ... this, and adjust. (solib_aix_new_lm_info, solib_aix_xfree_lm_info, solib_aix_parse_libraries, library_list_start_library, solib_aix_free_library_list, solib_aix_parse_libraries, solib_aix_get_library_list, solib_aix_relocate_section_addresses, solib_aix_free_so, solib_aix_get_section_offsets, solib_aix_solib_create_inferior_hook, solib_aix_current_sos): Adjust. (struct solib_aix_inferior_data) : Adjust. * solib-darwin.c (struct lm_info): Rename to ... (struct lm_info_darwin): ... this. Extend lm_info_base. (darwin_current_sos, darwin_relocate_section_addresses): Adjust. * solib-dsbt.c (struct lm_info): Rename to ... (struct lm_info_dsbt): ... this. Extend lm_info_base. (struct dsbt_info) lm_info->l_addr == (CORE_ADDR)-1) - { - struct link_map_offsets *lmo = nto_fetch_link_map_offsets (); - struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; + lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; - so->lm_info->l_addr = - extract_typed_address (so->lm_info->lm + lmo->l_addr_offset, ptr_type); - } - return so->lm_info->l_addr; + return li->l_addr; } static CORE_ADDR diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c index 66add03054..54b8c38032 100644 --- a/gdb/solib-aix.c +++ b/gdb/solib-aix.c @@ -33,7 +33,7 @@ static int solib_aix_debug; /* Our private data in struct so_list. */ -struct lm_info +struct lm_info_aix : public lm_info_base { /* The name of the file mapped by the loader. Apart from the entry for the main executable, this is usually a shared library (which, @@ -58,17 +58,17 @@ struct lm_info ULONGEST data_size; }; -typedef struct lm_info *lm_info_p; -DEF_VEC_P(lm_info_p); +typedef lm_info_aix *lm_info_aix_p; +DEF_VEC_P(lm_info_aix_p); /* Return a deep copy of the given struct lm_info object. */ -static struct lm_info * -solib_aix_new_lm_info (struct lm_info *info) +static lm_info_aix * +solib_aix_new_lm_info (lm_info_aix *info) { - struct lm_info *result = XNEW (struct lm_info); + lm_info_aix *result = XCNEW (lm_info_aix); - memcpy (result, info, sizeof (struct lm_info)); + memcpy (result, info, sizeof (lm_info_aix)); result->filename = xstrdup (info->filename); if (info->member_name != NULL) result->member_name = xstrdup (info->member_name); @@ -79,7 +79,7 @@ solib_aix_new_lm_info (struct lm_info *info) /* Free the memory allocated for the given lm_info. */ static void -solib_aix_xfree_lm_info (struct lm_info *info) +solib_aix_xfree_lm_info (lm_info_aix *info) { xfree (info->filename); xfree (info->member_name); @@ -98,7 +98,7 @@ struct solib_aix_inferior_data the same principles applied to shared libraries also apply to the main executable. So it's simpler to keep it as part of this list. */ - VEC (lm_info_p) *library_list; + VEC (lm_info_aix_p) *library_list; }; /* Key to our per-inferior data. */ @@ -127,7 +127,7 @@ get_solib_aix_inferior_data (struct inferior *inf) /* Dummy implementation if XML support is not compiled in. */ -static VEC (lm_info_p) * +static VEC (lm_info_aix_p) * solib_aix_parse_libraries (const char *library) { static int have_warned; @@ -161,8 +161,8 @@ library_list_start_library (struct gdb_xml_parser *parser, void *user_data, VEC (gdb_xml_value_s) *attributes) { - VEC (lm_info_p) **list = (VEC (lm_info_p) **) user_data; - struct lm_info *item = XCNEW (struct lm_info); + VEC (lm_info_aix_p) **list = (VEC (lm_info_aix_p) **) user_data; + lm_info_aix *item = XCNEW (lm_info_aix); struct gdb_xml_value *attr; attr = xml_find_attribute (attributes, "name"); @@ -184,7 +184,7 @@ library_list_start_library (struct gdb_xml_parser *parser, attr = xml_find_attribute (attributes, "data_size"); item->data_size = * (ULONGEST *) attr->value; - VEC_safe_push (lm_info_p, *list, item); + VEC_safe_push (lm_info_aix_p, *list, item); } /* Handle the start of a element. */ @@ -207,16 +207,16 @@ library_list_start_list (struct gdb_xml_parser *parser, static void solib_aix_free_library_list (void *p) { - VEC (lm_info_p) **result = (VEC (lm_info_p) **) p; - struct lm_info *info; + VEC (lm_info_aix_p) **result = (VEC (lm_info_aix_p) **) p; + lm_info_aix *info; int ix; if (solib_aix_debug) fprintf_unfiltered (gdb_stdlog, "DEBUG: solib_aix_free_library_list\n"); - for (ix = 0; VEC_iterate (lm_info_p, *result, ix, info); ix++) + for (ix = 0; VEC_iterate (lm_info_aix_p, *result, ix, info); ix++) solib_aix_xfree_lm_info (info); - VEC_free (lm_info_p, *result); + VEC_free (lm_info_aix_p, *result); *result = NULL; } @@ -256,14 +256,14 @@ static const struct gdb_xml_element library_list_elements[] = }; /* Parse LIBRARY, a string containing the loader info in XML format, - and return an lm_info_p vector. + and return an lm_info_aix_p vector. Return NULL if the parsing failed. */ -static VEC (lm_info_p) * +static VEC (lm_info_aix_p) * solib_aix_parse_libraries (const char *library) { - VEC (lm_info_p) *result = NULL; + VEC (lm_info_aix_p) *result = NULL; struct cleanup *back_to = make_cleanup (solib_aix_free_library_list, &result); @@ -291,7 +291,7 @@ solib_aix_parse_libraries (const char *library) is not NULL, then print a warning including WARNING_MSG and a description of the error. */ -static VEC (lm_info_p) * +static VEC (lm_info_aix_p) * solib_aix_get_library_list (struct inferior *inf, const char *warning_msg) { struct solib_aix_inferior_data *data; @@ -394,7 +394,7 @@ solib_aix_relocate_section_addresses (struct so_list *so, struct bfd_section *bfd_sect = sec->the_bfd_section; bfd *abfd = bfd_sect->owner; const char *section_name = bfd_section_name (abfd, bfd_sect); - struct lm_info *info = so->lm_info; + lm_info_aix *info = (lm_info_aix *) so->lm_info; if (strcmp (section_name, ".text") == 0) { @@ -446,7 +446,7 @@ solib_aix_free_so (struct so_list *so) if (solib_aix_debug) fprintf_unfiltered (gdb_stdlog, "DEBUG: solib_aix_free_so (%s)\n", so->so_name); - solib_aix_xfree_lm_info (so->lm_info); + solib_aix_xfree_lm_info ((lm_info_aix *) so->lm_info); } /* Implement the "clear_solib" target_so_ops method. */ @@ -465,7 +465,7 @@ solib_aix_clear_solib (void) static struct section_offsets * solib_aix_get_section_offsets (struct objfile *objfile, - struct lm_info *info) + lm_info_aix *info) { struct section_offsets *offsets; bfd *abfd = objfile->obfd; @@ -519,8 +519,8 @@ static void solib_aix_solib_create_inferior_hook (int from_tty) { const char *warning_msg = "unable to relocate main executable"; - VEC (lm_info_p) *library_list; - struct lm_info *exec_info; + VEC (lm_info_aix_p) *library_list; + lm_info_aix *exec_info; /* We need to relocate the main executable... */ @@ -529,13 +529,13 @@ solib_aix_solib_create_inferior_hook (int from_tty) if (library_list == NULL) return; /* Warning already printed. */ - if (VEC_length (lm_info_p, library_list) < 1) + if (VEC_length (lm_info_aix_p, library_list) < 1) { warning (_("unable to relocate main executable (no info from loader)")); return; } - exec_info = VEC_index (lm_info_p, library_list, 0); + exec_info = VEC_index (lm_info_aix_p, library_list, 0); if (symfile_objfile != NULL) { @@ -554,8 +554,8 @@ static struct so_list * solib_aix_current_sos (void) { struct so_list *start = NULL, *last = NULL; - VEC (lm_info_p) *library_list; - struct lm_info *info; + VEC (lm_info_aix_p) *library_list; + lm_info_aix *info; int ix; library_list = solib_aix_get_library_list (current_inferior (), NULL); @@ -565,7 +565,7 @@ solib_aix_current_sos (void) /* Build a struct so_list for each entry on the list. We skip the first entry, since this is the entry corresponding to the main executable, not a shared library. */ - for (ix = 1; VEC_iterate (lm_info_p, library_list, ix, info); ix++) + for (ix = 1; VEC_iterate (lm_info_aix_p, library_list, ix, info); ix++) { struct so_list *new_solib = XCNEW (struct so_list); char *so_name; diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c index c507e13caf..03211cfb92 100644 --- a/gdb/solib-darwin.c +++ b/gdb/solib-darwin.c @@ -153,7 +153,7 @@ darwin_load_image_infos (struct darwin_info *info) /* Link map info to include in an allocated so_list entry. */ -struct lm_info +struct lm_info_darwin : public lm_info_base { /* The target location of lm. */ CORE_ADDR lm_addr; @@ -296,13 +296,14 @@ darwin_current_sos (void) newobj = XCNEW (struct so_list); old_chain = make_cleanup (xfree, newobj); - newobj->lm_info = XCNEW (struct lm_info); + lm_info_darwin *li = XCNEW (lm_info_darwin); + newobj->lm_info = li; strncpy (newobj->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1); newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; strcpy (newobj->so_original_name, newobj->so_name); xfree (file_path); - newobj->lm_info->lm_addr = load_addr; + li->lm_addr = load_addr; if (head == NULL) head = newobj; @@ -587,8 +588,10 @@ static void darwin_relocate_section_addresses (struct so_list *so, struct target_section *sec) { - sec->addr += so->lm_info->lm_addr; - sec->endaddr += so->lm_info->lm_addr; + lm_info_darwin *li = (lm_info_darwin *) so->lm_info; + + sec->addr += li->lm_addr; + sec->endaddr += li->lm_addr; /* Best effort to set addr_high/addr_low. This is used only by 'info sharedlibary'. */ diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c index c4071066f1..6d410ac90b 100644 --- a/gdb/solib-dsbt.c +++ b/gdb/solib-dsbt.c @@ -123,7 +123,7 @@ struct ext_link_map /* Link map info to include in an allocated so_list entry */ -struct lm_info +struct lm_info_dsbt : public lm_info_base { /* The loadmap, digested into an easier to use form. */ struct int_elf32_dsbt_loadmap *map; @@ -137,7 +137,7 @@ struct dsbt_info of loaded shared objects. ``main_executable_lm_info'' provides a way to get at this information so that it doesn't need to be frequently recomputed. Initialized by dsbt_relocate_main_executable. */ - struct lm_info *main_executable_lm_info; + struct lm_info_dsbt *main_executable_lm_info; /* Load maps for the main executable and the interpreter. These are obtained from ptrace. They are the starting point for getting into the program, @@ -711,8 +711,9 @@ dsbt_current_sos (void) } sop = XCNEW (struct so_list); - sop->lm_info = XCNEW (struct lm_info); - sop->lm_info->map = loadmap; + lm_info_dsbt *li = XCNEW (lm_info_dsbt); + sop->lm_info = li; + li->map = loadmap; /* Fetch the name. */ addr = extract_unsigned_integer (lm_buf.l_name, sizeof (lm_buf.l_name), @@ -930,7 +931,7 @@ dsbt_relocate_main_executable (void) ldm = info->exec_loadmap; xfree (info->main_executable_lm_info); - info->main_executable_lm_info = XCNEW (struct lm_info); + info->main_executable_lm_info = XCNEW (lm_info_dsbt); info->main_executable_lm_info->map = ldm; new_offsets = XCNEWVEC (struct section_offsets, @@ -1016,8 +1017,10 @@ dsbt_clear_solib (void) static void dsbt_free_so (struct so_list *so) { - xfree (so->lm_info->map); - xfree (so->lm_info); + lm_info_dsbt *li = (lm_info_dsbt *) so->lm_info; + + xfree (li->map); + xfree (li); } static void @@ -1025,9 +1028,8 @@ dsbt_relocate_section_addresses (struct so_list *so, struct target_section *sec) { int seg; - struct int_elf32_dsbt_loadmap *map; - - map = so->lm_info->map; + lm_info_dsbt *li = (lm_info_dsbt *) so->lm_info; + int_elf32_dsbt_loadmap *map = li->map; for (seg = 0; seg < map->nsegs; seg++) { diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index e8d5f20d4f..0108d97815 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -202,7 +202,7 @@ struct ext_link_map /* Link map info to include in an allocated so_list entry. */ -struct lm_info +struct lm_info_frv : public lm_info_base { /* The loadmap, digested into an easier to use form. */ struct int_elf32_fdpic_loadmap *map; @@ -231,7 +231,7 @@ struct lm_info of loaded shared objects. ``main_executable_lm_info'' provides a way to get at this information so that it doesn't need to be frequently recomputed. Initialized by frv_relocate_main_executable(). */ -static struct lm_info *main_executable_lm_info; +static lm_info_frv *main_executable_lm_info; static void frv_relocate_main_executable (void); static CORE_ADDR main_got (void); @@ -389,10 +389,11 @@ frv_current_sos (void) } sop = XCNEW (struct so_list); - sop->lm_info = XCNEW (struct lm_info); - sop->lm_info->map = loadmap; - sop->lm_info->got_value = got_addr; - sop->lm_info->lm_addr = lm_addr; + lm_info_frv *li = XCNEW (lm_info_frv); + sop->lm_info = li; + li->map = loadmap; + li->got_value = got_addr; + li->lm_addr = lm_addr; /* Fetch the name. */ addr = extract_unsigned_integer (lm_buf.l_name, sizeof (lm_buf.l_name), @@ -783,7 +784,7 @@ frv_relocate_main_executable (void) if (main_executable_lm_info) xfree (main_executable_lm_info); - main_executable_lm_info = XCNEW (struct lm_info); + main_executable_lm_info = XCNEW (lm_info_frv); main_executable_lm_info->map = ldm; new_offsets = XCNEWVEC (struct section_offsets, @@ -870,10 +871,12 @@ frv_clear_solib (void) static void frv_free_so (struct so_list *so) { - xfree (so->lm_info->map); - xfree (so->lm_info->dyn_syms); - xfree (so->lm_info->dyn_relocs); - xfree (so->lm_info); + lm_info_frv *li = (lm_info_frv *) so->lm_info; + + xfree (li->map); + xfree (li->dyn_syms); + xfree (li->dyn_relocs); + xfree (li); } static void @@ -881,9 +884,8 @@ frv_relocate_section_addresses (struct so_list *so, struct target_section *sec) { int seg; - struct int_elf32_fdpic_loadmap *map; - - map = so->lm_info->map; + lm_info_frv *li = (lm_info_frv *) so->lm_info; + int_elf32_fdpic_loadmap *map = li->map; for (seg = 0; seg < map->nsegs; seg++) { @@ -926,15 +928,14 @@ frv_fdpic_find_global_pointer (CORE_ADDR addr) while (so) { int seg; - struct int_elf32_fdpic_loadmap *map; - - map = so->lm_info->map; + lm_info_frv *li = (lm_info_frv *) so->lm_info; + int_elf32_fdpic_loadmap *map = li->map; for (seg = 0; seg < map->nsegs; seg++) { if (map->segs[seg].addr <= addr && addr < map->segs[seg].addr + map->segs[seg].p_memsz) - return so->lm_info->got_value; + return li->got_value; } so = so->next; @@ -947,7 +948,7 @@ frv_fdpic_find_global_pointer (CORE_ADDR addr) /* Forward declarations for frv_fdpic_find_canonical_descriptor(). */ static CORE_ADDR find_canonical_descriptor_in_load_object - (CORE_ADDR, CORE_ADDR, const char *, bfd *, struct lm_info *); + (CORE_ADDR, CORE_ADDR, const char *, bfd *, lm_info_frv *); /* Given a function entry point, attempt to find the canonical descriptor associated with that entry point. Return 0 if no canonical descriptor @@ -987,8 +988,10 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) so = master_so_list (); while (so) { + lm_info_frv *li = (lm_info_frv *) so->lm_info; + addr = find_canonical_descriptor_in_load_object - (entry_point, got_value, name, so->abfd, so->lm_info); + (entry_point, got_value, name, so->abfd, li); if (addr != 0) break; @@ -1003,7 +1006,7 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) static CORE_ADDR find_canonical_descriptor_in_load_object (CORE_ADDR entry_point, CORE_ADDR got_value, const char *name, bfd *abfd, - struct lm_info *lm) + lm_info_frv *lm) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); arelent *rel; @@ -1141,8 +1144,10 @@ frv_fetch_objfile_link_map (struct objfile *objfile) of shared libraries. */ for (so = master_so_list (); so; so = so->next) { + lm_info_frv *li = (lm_info_frv *) so->lm_info; + if (so->objfile == objfile) - return so->lm_info->lm_addr; + return li->lm_addr; } /* Not found! */ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 4cb6127af3..6098d505da 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -51,27 +51,6 @@ static int svr4_have_link_map_offsets (void); static void svr4_relocate_main_executable (void); static void svr4_free_library_list (void *p_list); -/* Link map info to include in an allocated so_list entry. */ - -struct lm_info - { - /* Amount by which addresses in the binary should be relocated to - match the inferior. The direct inferior value is L_ADDR_INFERIOR. - When prelinking is involved and the prelink base address changes, - we may need a different offset - the recomputed offset is in L_ADDR. - It is commonly the same value. It is cached as we want to warn about - the difference and compute it only once. L_ADDR is valid - iff L_ADDR_P. */ - CORE_ADDR l_addr, l_addr_inferior; - unsigned int l_addr_p : 1; - - /* The target location of lm. */ - CORE_ADDR lm_addr; - - /* Values read in from inferior's fields of the same name. */ - CORE_ADDR l_ld, l_next, l_prev, l_name; - }; - /* On SVR4 systems, a list of symbols in the dynamic linker where GDB can try to place a breakpoint to monitor shared library events. @@ -189,12 +168,12 @@ svr4_same (struct so_list *gdb, struct so_list *inferior) return (svr4_same_1 (gdb->so_original_name, inferior->so_original_name)); } -static struct lm_info * +static lm_info_svr4 * lm_info_read (CORE_ADDR lm_addr) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); gdb_byte *lm; - struct lm_info *lm_info; + lm_info_svr4 *lm_info; struct cleanup *back_to; lm = (gdb_byte *) xmalloc (lmo->link_map_size); @@ -210,7 +189,7 @@ lm_info_read (CORE_ADDR lm_addr) { struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; - lm_info = XCNEW (struct lm_info); + lm_info = XCNEW (lm_info_svr4); lm_info->lm_addr = lm_addr; lm_info->l_addr_inferior = extract_typed_address (&lm[lmo->l_addr_offset], @@ -240,17 +219,19 @@ has_lm_dynamic_from_link_map (void) static CORE_ADDR lm_addr_check (const struct so_list *so, bfd *abfd) { - if (!so->lm_info->l_addr_p) + lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; + + if (!li->l_addr_p) { struct bfd_section *dyninfo_sect; CORE_ADDR l_addr, l_dynaddr, dynaddr; - l_addr = so->lm_info->l_addr_inferior; + l_addr = li->l_addr_inferior; if (! abfd || ! has_lm_dynamic_from_link_map ()) goto set_addr; - l_dynaddr = so->lm_info->l_ld; + l_dynaddr = li->l_ld; dyninfo_sect = bfd_get_section_by_name (abfd, ".dynamic"); if (dyninfo_sect == NULL) @@ -333,11 +314,11 @@ lm_addr_check (const struct so_list *so, bfd *abfd) } set_addr: - so->lm_info->l_addr = l_addr; - so->lm_info->l_addr_p = 1; + li->l_addr = l_addr; + li->l_addr_p = 1; } - return so->lm_info->l_addr; + return li->l_addr; } /* Per pspace SVR4 specific data. */ @@ -994,9 +975,10 @@ svr4_keep_data_in_core (CORE_ADDR vaddr, unsigned long size) newobj = XCNEW (struct so_list); old_chain = make_cleanup (xfree, newobj); - newobj->lm_info = lm_info_read (ldsomap); + lm_info_svr4 *li = lm_info_read (ldsomap); + newobj->lm_info = li; make_cleanup (xfree, newobj->lm_info); - name_lm = newobj->lm_info ? newobj->lm_info->l_name : 0; + name_lm = li != NULL ? li->l_name : 0; do_cleanups (old_chain); return (name_lm >= vaddr && name_lm < vaddr + size); @@ -1106,8 +1088,10 @@ svr4_free_so (struct so_list *so) static void svr4_clear_so (struct so_list *so) { - if (so->lm_info != NULL) - so->lm_info->l_addr_p = 0; + lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; + + if (li != NULL) + li->l_addr_p = 0; } /* Free so_list built so far (called via cleanup). */ @@ -1141,8 +1125,8 @@ svr4_copy_library_list (struct so_list *src) newobj = XNEW (struct so_list); memcpy (newobj, src, sizeof (struct so_list)); - newobj->lm_info = XNEW (struct lm_info); - memcpy (newobj->lm_info, src->lm_info, sizeof (struct lm_info)); + newobj->lm_info = XNEW (lm_info_svr4); + memcpy (newobj->lm_info, src->lm_info, sizeof (lm_info_svr4)); newobj->next = NULL; *link = newobj; @@ -1178,10 +1162,11 @@ library_list_start_library (struct gdb_xml_parser *parser, struct so_list *new_elem; new_elem = XCNEW (struct so_list); - new_elem->lm_info = XCNEW (struct lm_info); - new_elem->lm_info->lm_addr = *lmp; - new_elem->lm_info->l_addr_inferior = *l_addrp; - new_elem->lm_info->l_ld = *l_ldp; + lm_info_svr4 *li = XCNEW (lm_info_svr4); + new_elem->lm_info = li; + li->lm_addr = *lmp; + li->l_addr_inferior = *l_addrp; + li->l_ld = *l_ldp; strncpy (new_elem->so_name, name, sizeof (new_elem->so_name) - 1); new_elem->so_name[sizeof (new_elem->so_name) - 1] = 0; @@ -1332,12 +1317,12 @@ svr4_default_sos (void) return NULL; newobj = XCNEW (struct so_list); - - newobj->lm_info = XCNEW (struct lm_info); + lm_info_svr4 *li = XCNEW (lm_info_svr4); + newobj->lm_info = li; /* Nothing will ever check the other fields if we set l_addr_p. */ - newobj->lm_info->l_addr = info->debug_loader_offset; - newobj->lm_info->l_addr_p = 1; + li->l_addr = info->debug_loader_offset; + li->l_addr_p = 1; strncpy (newobj->so_name, info->debug_loader_name, SO_NAME_MAX_PATH_SIZE - 1); newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; @@ -1371,20 +1356,21 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm, newobj = XCNEW (struct so_list); old_chain = make_cleanup_free_so (newobj); - newobj->lm_info = lm_info_read (lm); - if (newobj->lm_info == NULL) + lm_info_svr4 *li = lm_info_read (lm); + newobj->lm_info = li; + if (li == NULL) { do_cleanups (old_chain); return 0; } - next_lm = newobj->lm_info->l_next; + next_lm = li->l_next; - if (newobj->lm_info->l_prev != prev_lm) + if (li->l_prev != prev_lm) { warning (_("Corrupted shared library list: %s != %s"), paddress (target_gdbarch (), prev_lm), - paddress (target_gdbarch (), newobj->lm_info->l_prev)); + paddress (target_gdbarch (), li->l_prev)); do_cleanups (old_chain); return 0; } @@ -1394,26 +1380,26 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm, SVR4, it has no name. For others (Solaris 2.3 for example), it does have a name, so we can no longer use a missing name to decide when to ignore it. */ - if (ignore_first && newobj->lm_info->l_prev == 0) + if (ignore_first && li->l_prev == 0) { struct svr4_info *info = get_svr4_info (); - first_l_name = newobj->lm_info->l_name; - info->main_lm_addr = newobj->lm_info->lm_addr; + first_l_name = li->l_name; + info->main_lm_addr = li->lm_addr; do_cleanups (old_chain); continue; } /* Extract this shared object's name. */ - target_read_string (newobj->lm_info->l_name, &buffer, - SO_NAME_MAX_PATH_SIZE - 1, &errcode); + target_read_string (li->l_name, &buffer, SO_NAME_MAX_PATH_SIZE - 1, + &errcode); if (errcode != 0) { /* If this entry's l_name address matches that of the inferior executable, then this is not a normal shared object, but (most likely) a vDSO. In this case, silently skip it; otherwise emit a warning. */ - if (first_l_name == 0 || newobj->lm_info->l_name != first_l_name) + if (first_l_name == 0 || li->l_name != first_l_name) warning (_("Can't read pathname for load map: %s."), safe_strerror (errcode)); do_cleanups (old_chain); @@ -1594,7 +1580,10 @@ svr4_current_sos (void) [...] [ 9] .dynamic DYNAMIC ffffffffff700580 000580 0000f0 */ - if (address_in_mem_range (so->lm_info->l_ld, &vsyscall_range)) + + lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; + + if (address_in_mem_range (li->l_ld, &vsyscall_range)) { *sop = so->next; free_so (so); @@ -1628,7 +1617,11 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) of shared libraries. */ for (so = master_so_list (); so; so = so->next) if (so->objfile == objfile) - return so->lm_info->lm_addr; + { + lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; + + return li->lm_addr; + } /* Not found! */ return 0; @@ -1860,7 +1853,9 @@ solist_update_incremental (struct svr4_info *info, CORE_ADDR lm) /* Walk to the end of the list. */ for (tail = info->solib_list; tail->next != NULL; tail = tail->next) /* Nothing. */; - prev_lm = tail->lm_info->lm_addr; + + lm_info_svr4 *li = (lm_info_svr4 *) tail->lm_info; + prev_lm = li->lm_addr; /* Read the new objects. */ if (info->using_xfer) diff --git a/gdb/solib-svr4.h b/gdb/solib-svr4.h index b97fbd62f5..a9b09aa56c 100644 --- a/gdb/solib-svr4.h +++ b/gdb/solib-svr4.h @@ -20,11 +20,34 @@ #ifndef SOLIB_SVR4_H #define SOLIB_SVR4_H +#include "solist.h" + struct objfile; struct target_so_ops; extern struct target_so_ops svr4_so_ops; +/* Link map info to include in an allocated so_list entry. */ + +struct lm_info_svr4 : public lm_info_base +{ + /* Amount by which addresses in the binary should be relocated to + match the inferior. The direct inferior value is L_ADDR_INFERIOR. + When prelinking is involved and the prelink base address changes, + we may need a different offset - the recomputed offset is in L_ADDR. + It is commonly the same value. It is cached as we want to warn about + the difference and compute it only once. L_ADDR is valid + iff L_ADDR_P. */ + CORE_ADDR l_addr, l_addr_inferior; + unsigned int l_addr_p : 1; + + /* The target location of lm. */ + CORE_ADDR lm_addr; + + /* Values read in from inferior's fields of the same name. */ + CORE_ADDR l_ld, l_next, l_prev, l_name; +}; + /* Critical offsets and sizes which describe struct r_debug and struct link_map on SVR4-like targets. All offsets and sizes are in bytes unless otherwise specified. */ diff --git a/gdb/solib-target.c b/gdb/solib-target.c index 1b10e4ea41..e40acc1823 100644 --- a/gdb/solib-target.c +++ b/gdb/solib-target.c @@ -27,7 +27,7 @@ #include "solib-target.h" /* Private data for each loaded library. */ -struct lm_info +struct lm_info_target : public lm_info_base { /* The library's name. The name is normally kept in the struct so_list; it is only here during XML parsing. */ @@ -49,12 +49,12 @@ struct lm_info struct section_offsets *offsets; }; -typedef struct lm_info *lm_info_p; -DEF_VEC_P(lm_info_p); +typedef lm_info_target *lm_info_target_p; +DEF_VEC_P(lm_info_target_p); #if !defined(HAVE_LIBEXPAT) -static VEC(lm_info_p) * +static VEC(lm_info_target_p) * solib_target_parse_libraries (const char *library) { static int have_warned; @@ -80,8 +80,8 @@ library_list_start_segment (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes) { - VEC(lm_info_p) **list = (VEC(lm_info_p) **) user_data; - struct lm_info *last = VEC_last (lm_info_p, *list); + VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; + lm_info_target *last = VEC_last (lm_info_target_p, *list); ULONGEST *address_p = (ULONGEST *) xml_find_attribute (attributes, "address")->value; CORE_ADDR address = (CORE_ADDR) *address_p; @@ -98,8 +98,8 @@ library_list_start_section (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes) { - VEC(lm_info_p) **list = (VEC(lm_info_p) **) user_data; - struct lm_info *last = VEC_last (lm_info_p, *list); + VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; + lm_info_target *last = VEC_last (lm_info_target_p, *list); ULONGEST *address_p = (ULONGEST *) xml_find_attribute (attributes, "address")->value; CORE_ADDR address = (CORE_ADDR) *address_p; @@ -118,13 +118,13 @@ library_list_start_library (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes) { - VEC(lm_info_p) **list = (VEC(lm_info_p) **) user_data; - struct lm_info *item = XCNEW (struct lm_info); + VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; + lm_info_target *item = XCNEW (lm_info_target); const char *name = (const char *) xml_find_attribute (attributes, "name")->value; item->name = xstrdup (name); - VEC_safe_push (lm_info_p, *list, item); + VEC_safe_push (lm_info_target_p, *list, item); } static void @@ -132,8 +132,8 @@ library_list_end_library (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text) { - VEC(lm_info_p) **list = (VEC(lm_info_p) **) user_data; - struct lm_info *lm_info = VEC_last (lm_info_p, *list); + VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; + lm_info_target *lm_info = VEC_last (lm_info_target_p, *list); if (lm_info->segment_bases == NULL && lm_info->section_bases == NULL) @@ -168,18 +168,18 @@ library_list_start_list (struct gdb_xml_parser *parser, static void solib_target_free_library_list (void *p) { - VEC(lm_info_p) **result = (VEC(lm_info_p) **) p; - struct lm_info *info; + VEC(lm_info_target_p) **result = (VEC(lm_info_target_p) **) p; + lm_info_target *info; int ix; - for (ix = 0; VEC_iterate (lm_info_p, *result, ix, info); ix++) + for (ix = 0; VEC_iterate (lm_info_target_p, *result, ix, info); ix++) { xfree (info->name); VEC_free (CORE_ADDR, info->segment_bases); VEC_free (CORE_ADDR, info->section_bases); xfree (info); } - VEC_free (lm_info_p, *result); + VEC_free (lm_info_target_p, *result); *result = NULL; } @@ -229,10 +229,10 @@ static const struct gdb_xml_element library_list_elements[] = { { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } }; -static VEC(lm_info_p) * +static VEC(lm_info_target_p) * solib_target_parse_libraries (const char *library) { - VEC(lm_info_p) *result = NULL; + VEC(lm_info_target_p) *result = NULL; struct cleanup *back_to = make_cleanup (solib_target_free_library_list, &result); @@ -255,8 +255,8 @@ solib_target_current_sos (void) struct so_list *new_solib, *start = NULL, *last = NULL; char *library_document; struct cleanup *old_chain; - VEC(lm_info_p) *library_list; - struct lm_info *info; + VEC(lm_info_target_p) *library_list; + lm_info_target *info; int ix; /* Fetch the list of shared libraries. */ @@ -279,7 +279,7 @@ solib_target_current_sos (void) return NULL; /* Build a struct so_list for each entry on the list. */ - for (ix = 0; VEC_iterate (lm_info_p, library_list, ix, info); ix++) + for (ix = 0; VEC_iterate (lm_info_target_p, library_list, ix, info); ix++) { new_solib = XCNEW (struct so_list); strncpy (new_solib->so_name, info->name, SO_NAME_MAX_PATH_SIZE - 1); @@ -304,7 +304,7 @@ solib_target_current_sos (void) } /* Free the library list, but not its members. */ - VEC_free (lm_info_p, library_list); + VEC_free (lm_info_target_p, library_list); return start; } @@ -324,10 +324,12 @@ solib_target_clear_solib (void) static void solib_target_free_so (struct so_list *so) { - gdb_assert (so->lm_info->name == NULL); - xfree (so->lm_info->offsets); - VEC_free (CORE_ADDR, so->lm_info->segment_bases); - xfree (so->lm_info); + lm_info_target *li = (lm_info_target *) so->lm_info; + + gdb_assert (li->name == NULL); + xfree (li->offsets); + VEC_free (CORE_ADDR, li->segment_bases); + xfree (li); } static void @@ -335,23 +337,24 @@ solib_target_relocate_section_addresses (struct so_list *so, struct target_section *sec) { CORE_ADDR offset; + lm_info_target *li = (lm_info_target *) so->lm_info; /* Build the offset table only once per object file. We can not do it any earlier, since we need to open the file first. */ - if (so->lm_info->offsets == NULL) + if (li->offsets == NULL) { int num_sections = gdb_bfd_count_sections (so->abfd); - so->lm_info->offsets + li->offsets = ((struct section_offsets *) xzalloc (SIZEOF_N_SECTION_OFFSETS (num_sections))); - if (so->lm_info->section_bases) + if (li->section_bases) { int i; asection *sect; int num_section_bases - = VEC_length (CORE_ADDR, so->lm_info->section_bases); + = VEC_length (CORE_ADDR, li->section_bases); int num_alloc_sections = 0; for (i = 0, sect = so->abfd->sections; @@ -371,7 +374,7 @@ Could not relocate shared library \"%s\": wrong number of ALLOC sections"), CORE_ADDR *section_bases; section_bases = VEC_address (CORE_ADDR, - so->lm_info->section_bases); + li->section_bases); so->addr_low = ~(CORE_ADDR) 0; so->addr_high = 0; @@ -395,7 +398,7 @@ Could not relocate shared library \"%s\": wrong number of ALLOC sections"), gdb_assert (so->addr_low <= so->addr_high); found_range = 1; } - so->lm_info->offsets->offsets[i] + li->offsets->offsets[i] = section_bases[bases_index]; bases_index++; } @@ -404,7 +407,7 @@ Could not relocate shared library \"%s\": wrong number of ALLOC sections"), gdb_assert (so->addr_low <= so->addr_high); } } - else if (so->lm_info->segment_bases) + else if (li->segment_bases) { struct symfile_segment_data *data; @@ -419,12 +422,10 @@ Could not relocate shared library \"%s\": no segments"), so->so_name); int num_bases; CORE_ADDR *segment_bases; - num_bases = VEC_length (CORE_ADDR, so->lm_info->segment_bases); - segment_bases = VEC_address (CORE_ADDR, - so->lm_info->segment_bases); + num_bases = VEC_length (CORE_ADDR, li->segment_bases); + segment_bases = VEC_address (CORE_ADDR, li->segment_bases); - if (!symfile_map_offsets_to_segments (so->abfd, data, - so->lm_info->offsets, + if (!symfile_map_offsets_to_segments (so->abfd, data, li->offsets, num_bases, segment_bases)) warning (_("\ Could not relocate shared library \"%s\": bad offsets"), so->so_name); @@ -459,9 +460,9 @@ Could not relocate shared library \"%s\": bad offsets"), so->so_name); } } - offset = so->lm_info->offsets->offsets[gdb_bfd_section_index - (sec->the_bfd_section->owner, - sec->the_bfd_section)]; + offset = li->offsets->offsets[gdb_bfd_section_index + (sec->the_bfd_section->owner, + sec->the_bfd_section)]; sec->addr += offset; sec->endaddr += offset; } diff --git a/gdb/solist.h b/gdb/solist.h index 378d60d7b8..54c9902b4a 100644 --- a/gdb/solist.h +++ b/gdb/solist.h @@ -29,9 +29,11 @@ so != NULL; \ so = so->next) -/* Forward declaration for target specific link map information. This - struct is opaque to all but the target specific file. */ -struct lm_info; +/* Base class for target-specific link map information. */ + +struct lm_info_base +{ +}; struct so_list { @@ -45,7 +47,7 @@ struct so_list will be a copy of struct link_map from the user process, but it need not be; it can be any collection of data needed to traverse the dynamic linker's data structures. */ - struct lm_info *lm_info; + lm_info_base *lm_info; /* Shared object file name, exactly as it appears in the inferior's link map. This may be a relative path, or something diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 805fb4358d..ef1c2914f1 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -585,7 +585,7 @@ struct safe_symbol_file_add_args }; /* Maintain a linked list of "so" information. */ -struct lm_info +struct lm_info_windows : public lm_info_base { LPVOID load_addr; }; @@ -645,8 +645,9 @@ windows_make_so (const char *name, LPVOID load_addr) } #endif so = XCNEW (struct so_list); - so->lm_info = XNEW (struct lm_info); - so->lm_info->load_addr = load_addr; + lm_info_windows *li = XCNEW (struct lm_info_windows); + so->lm_info = li; + li->load_addr = load_addr; strcpy (so->so_original_name, name); #ifndef __CYGWIN__ strcpy (so->so_name, buf); @@ -772,8 +773,10 @@ handle_load_dll (void *dummy) solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll); solib_end = solib_end->next; + lm_info_windows *li = (lm_info_windows *) solib_end->lm_info; + DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end->so_name, - host_address_to_string (solib_end->lm_info->load_addr))); + host_address_to_string (li->load_addr))); return 1; } @@ -801,18 +804,22 @@ handle_unload_dll (void *dummy) struct so_list *so; for (so = &solib_start; so->next != NULL; so = so->next) - if (so->next->lm_info->load_addr == lpBaseOfDll) - { - struct so_list *sodel = so->next; + { + lm_info_windows *li_next = (lm_info_windows *) so->next->lm_info; - so->next = sodel->next; - if (!so->next) - solib_end = so; - DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name)); + if (li_next->load_addr == lpBaseOfDll) + { + struct so_list *sodel = so->next; - windows_free_so (sodel); - return 1; - } + so->next = sodel->next; + if (!so->next) + solib_end = so; + DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name)); + + windows_free_so (sodel); + return 1; + } + } /* We did not find any DLL that was previously loaded at this address, so register a complaint. We do not report an error, because we have @@ -2842,9 +2849,13 @@ windows_xfer_shared_libraries (struct target_ops *ops, obstack_init (&obstack); obstack_grow_str (&obstack, "\n"); for (so = solib_start.next; so; so = so->next) - windows_xfer_shared_library (so->so_name, (CORE_ADDR) - (uintptr_t) so->lm_info->load_addr, - target_gdbarch (), &obstack); + { + lm_info_windows *li = (lm_info_windows *) so->lm_info; + + windows_xfer_shared_library (so->so_name, (CORE_ADDR) + (uintptr_t) li->load_addr, + target_gdbarch (), &obstack); + } obstack_grow_str0 (&obstack, "\n"); buf = (const char *) obstack_finish (&obstack);