From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 43937 invoked by alias); 9 Oct 2017 07:35:50 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 43927 invoked by uid 89); 9 Oct 2017 07:35:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Board, Directors, qualified, 1012 X-HELO: mga04.intel.com Received: from mga04.intel.com (HELO mga04.intel.com) (192.55.52.120) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 09 Oct 2017 07:35:47 +0000 Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Oct 2017 00:35:45 -0700 X-ExtLoop1: 1 Received: from irsmsx108.ger.corp.intel.com ([163.33.3.3]) by fmsmga006.fm.intel.com with ESMTP; 09 Oct 2017 00:35:44 -0700 Received: from irsmsx155.ger.corp.intel.com (163.33.192.3) by IRSMSX108.ger.corp.intel.com (163.33.3.3) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 9 Oct 2017 08:35:43 +0100 Received: from irsmsx104.ger.corp.intel.com ([169.254.5.248]) by irsmsx155.ger.corp.intel.com ([169.254.14.169]) with mapi id 14.03.0319.002; Mon, 9 Oct 2017 08:35:43 +0100 From: "Tedeschi, Walfred" To: "Tedeschi, Walfred" , "palves@redhat.com" , "qiyaoltc@gmail.com" , "Keith Seitz (keiths@redhat.com)" CC: "gdb-patches@sourceware.org" Subject: RE: [ping][PATCH] symlookup: improves symbol lookup when a file is specified. Date: Mon, 09 Oct 2017 07:35:00 -0000 Message-ID: References: <1504687613-14649-1-git-send-email-walfred.tedeschi@intel.com> <1504687613-14649-3-git-send-email-walfred.tedeschi@intel.com> <5ae65a00-6f34-8c6b-e2ee-f241dec5669e@intel.com> In-Reply-To: <5ae65a00-6f34-8c6b-e2ee-f241dec5669e@intel.com> dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2017-10/txt/msg00187.txt.bz2 Any feedback? -----Original Message----- From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-owner@sourceware= .org] On Behalf Of Tedeschi, Walfred Sent: Wednesday, September 20, 2017 4:20 PM To: palves@redhat.com; qiyaoltc@gmail.com Cc: gdb-patches@sourceware.org Subject: [ping][PATCH] symlookup: improves symbol lookup when a file is spe= cified. Any feedback? On 09/06/2017 10:46 AM, Walfred Tedeschi wrote: > The provided patch adds a global lookup with higher priority for the=20 > provided file. > > Usual symbol lookup from GDB follows linker logic. This is what is=20 > desired most of the time. In the usage case a file is provided as=20 > scope, so the lookup has to follow this priority. Failing in finding=20 > the symbol at this scope usual path is followed. > > As test case it is presented two shared objects having a global=20 > variable with the same name but comming from different source files.=20=20 > Without the patch accessing them via the file scope returns the value=20 > seen in the first loaded shared object. Using the patch the value=20 > defined in the file scope is the one returned. > > One of the already existing test cases in print-file-var.exp starts to=20 > fail after using this patch. In fact the value that the linker sees is=20 > different then the one debugger can read from the shared object. In=20 > this sense it looks like to me that the test has to be changed. > The fail is in the call: > print 'print-file-var-lib2.c'::this_version_id =3D=3D v2 > > In this case there also in both libraries the symbol this_version_id. > During load of the libraries linker resolves the symbol as the first=20 > one loaded and independent of the scope symbol will have the same=20 > value, as defined in the first library loaded. > However, when defining the scope the value should represent the value=20 > in that context. Diferent evaluations of the same symbols might also=20 > better spot the issue in users code. > > - I haven't changed the test because I wanted to hear the community=20 > thought on the subject. > > > > 2017-07-13 Walfred Tedeschi > > gdb/ChangeLog: > > * symtab.c (lookup_global_symbol): Add new lookup to ensure > priority on given block. > > gdb/testsuite/ChangeLog: > > * gdb.base/print-file-var-dlopen-main.c: New file. > * gdb.base/print-file-var-dlopen.exp: New test based on > print-file-var.exp. > > --- > gdb/symtab.c | 4 + > .../gdb.base/print-file-var-dlopen-main.c | 62 +++++++++++++ > gdb/testsuite/gdb.base/print-file-var-dlopen.exp | 101 ++++++++++++++= +++++++ > 3 files changed, 167 insertions(+) > create mode 100644 gdb/testsuite/gdb.base/print-file-var-dlopen-main.c > create mode 100644 gdb/testsuite/gdb.base/print-file-var-dlopen.exp > > diff --git a/gdb/symtab.c b/gdb/symtab.c index 8492315..920461f 100644 > --- a/gdb/symtab.c > +++ b/gdb/symtab.c > @@ -2590,6 +2590,10 @@ lookup_global_symbol (const char *name, > if (objfile !=3D NULL) > result =3D solib_global_lookup (objfile, name, domain); >=20=20=20 > + /* We still need to look on the global scope of current object=20 > + file. */ if (result.symbol =3D=3D NULL && objfile !=3D NULL) > + result =3D lookup_symbol_in_objfile (objfile, GLOBAL_BLOCK, name,=20 > + domain); > + > /* If that didn't work go a global search (of global blocks, heh). */ > if (result.symbol =3D=3D NULL) > { > diff --git a/gdb/testsuite/gdb.base/print-file-var-dlopen-main.c=20 > b/gdb/testsuite/gdb.base/print-file-var-dlopen-main.c > new file mode 100644 > index 0000000..98cfd97 > --- /dev/null > +++ b/gdb/testsuite/gdb.base/print-file-var-dlopen-main.c > @@ -0,0 +1,62 @@ > +/* This testcase is part of GDB, the GNU debugger. > + Copyright 2017 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see=20 > + . */ > + > +#include > +#include > +#include > + > +int > +dummy (void) > +{ > + return 1; > +} > + > +int > +main (void) > +{ > + int (*get_version1) (void); > + int (*get_version2) (void); > + int v1, v2; > + > + dummy (); > + void *lib1 =3D dlopen ("print-file-var-dlopen-lib1.so", RTLD_LAZY);=20= =20 > + void *lib2 =3D dlopen ("print-file-var-dlopen-lib2.so", RTLD_LAZY); > + > + if (lib1 =3D=3D NULL || lib2 =3D=3D NULL) > + return 1; > + > + *(int **) (&get_version1) =3D dlsym (lib1, "get_version"); *(int **)= =20 > + (&get_version2) =3D dlsym (lib2, "get_version"); > + > + if (get_version1 !=3D NULL > + && get_version2 !=3D NULL) > + { > + v1 =3D get_version1(); > + v2 =3D get_version2(); > + } > + > + dummy (); /* STOP */ > + dlclose (lib1); > + dlclose (lib2); > + if (v1 !=3D 104) > + return 1; > + /* The value returned by get_version_2 depends on the target=20 > + system. */ if (v2 !=3D 104 || v2 !=3D 203) > + return 2; > + > + return 0; > +} > + > diff --git a/gdb/testsuite/gdb.base/print-file-var-dlopen.exp=20 > b/gdb/testsuite/gdb.base/print-file-var-dlopen.exp > new file mode 100644 > index 0000000..87f89f2 > --- /dev/null > +++ b/gdb/testsuite/gdb.base/print-file-var-dlopen.exp > @@ -0,0 +1,101 @@ > +# Copyright 2017 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or=20 > +modify # it under the terms of the GNU General Public License as=20 > +published by # the Free Software Foundation; either version 3 of the=20 > +License, or # (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, #=20 > +but WITHOUT ANY WARRANTY; without even the implied warranty of #=20 > +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU=20 > +General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License #=20 > +along with this program. If not, see .=20= =20 > +*/ > + > +if {[skip_shlib_tests]} { > + return -1 > +} > + > +set executable print-file-var-dlopen-main > + > +set lib1 "print-file-var-lib1" > +set lib2 "print-file-var-lib2" > + > +set libobj1 [standard_output_file ${lib1}.so] set libobj2=20 > +[standard_output_file ${lib2}.so] > + > +set lib_opts { debug additional_flags=3D-fPIC additional_flags=3D-shared} > + > +if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib1}.c \ > + ${libobj1} \ > + ${lib_opts} ] !=3D "" } { > + return -1 > +} > +if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib2}.c \ > + ${libobj2} \ > + ${lib_opts} ] !=3D "" } { > + return -1 > +} > +if { [gdb_compile "${srcdir}/${subdir}/${executable}.c" \ > + [standard_output_file ${executable}] \ > + executable \ > + [list debug shlib=3D-ldl]] > + !=3D ""} { > + return -1 > +} > + > +clean_restart $executable > + > +set outdir [file dirname $libobj1] > + > +gdb_test_no_output "set env LD_LIBRARY_PATH=3D${outdir}/:" > + > +if ![runto_main] { > + untested "could not run to main" > + return -1 > +} > + > +# Try printing "this_version_num" qualified with the name of the file=20 > +# where the variables are defined. There are two global variables #=20 > +with that name, and some systems such as GNU/Linux merge them # into=20 > +one single entity, while some other systems such as Windows # keep=20 > +them separate. In the first situation, we have to verify # that GDB=20 > +does not randomly select the wrong instance, even when # a specific=20 > +filename is used to qualified the lookup. And in the # second case,=20 > +we have to verify that GDB does select the instance # defined in the=20 > +given filename. > +# > +# To avoid adding target-specific code in this testcase, the program=20 > +# sets two local variable named 'v1' and 'v2' with the value of # our=20 > +global variables. This allows us to compare the value that # GDB=20 > +returns for each query against the actual value seen by # the program=20 > +itself. > + > +# Get past the initialization of variables 'v1' and 'v2'. > + > +set bp_location \ > + [gdb_get_line_number "STOP" "${executable}.c"] gdb_test "break=20 > +$executable.c:$bp_location" \ > + "Breakpoint \[0-9\]+ at 0x\[0-9a-fA-F\]+: .*" \ > + "breapoint past v1 & v2 initialization" > + > +gdb_test "continue" \ > + "Breakpoint \[0-9\]+, main \\(\\) at.*" \ > + "continue to STOP marker" > + > +# Now check the value of this_version_id in both=20 > +print-file-var-lib1.c # and print-file-var-lib2.c. > + > +gdb_test "print 'print-file-var-dlopen-lib1.c'::this_version_id =3D=3D v= 1" \ > + " =3D 1" > + > +gdb_test "print 'print-file-var-dlopen-lib2.c'::this_version_id =3D=3D v= 2" \ > + " =3D 1" > + > +gdb_test "print 'print-file-var-dlopen-lib2.c'::get_version::test =3D=3D= v2" \ > + " =3D 1" > + > +gdb_test "print 'print-file-var-dlopen-lib1.c'::get_version::test" \ > + " =3D 100" > + Intel Deutschland GmbH Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Christian Lamprechter Chairperson= of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial = Register: Amtsgericht Muenchen HRB 186928 Intel Deutschland GmbH Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Christian Lamprechter Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928