From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 74193 invoked by alias); 20 Sep 2017 15:22:22 -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 74184 invoked by uid 89); 20 Sep 2017 15:22:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=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=STOP X-HELO: mga06.intel.com Received: from mga06.intel.com (HELO mga06.intel.com) (134.134.136.31) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 20 Sep 2017 15:22:19 +0000 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga104.jf.intel.com with ESMTP; 20 Sep 2017 08:22:18 -0700 X-ExtLoop1: 1 Received: from labpc1530.iul.intel.com ([172.28.48.195]) by fmsmga002.fm.intel.com with ESMTP; 20 Sep 2017 08:22:17 -0700 Subject: [ping][PATCH] symlookup: improves symbol lookup when a file is specified. To: palves@redhat.com, qiyaoltc@gmail.com References: <1504687613-14649-1-git-send-email-walfred.tedeschi@intel.com> <1504687613-14649-3-git-send-email-walfred.tedeschi@intel.com> Cc: gdb-patches@sourceware.org From: "Tedeschi, Walfred" Message-ID: <5ae65a00-6f34-8c6b-e2ee-f241dec5669e@intel.com> Date: Wed, 20 Sep 2017 15:22:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <1504687613-14649-3-git-send-email-walfred.tedeschi@intel.com> Content-Type: text/plain; charset="windows-1252"; format="flowed" Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2017-09/txt/msg00494.txt.bz2 Any feedback? On 09/06/2017 10:46 AM, Walfred Tedeschi wrote: > The provided patch adds a global lookup with higher priority for the > provided file. > > Usual symbol lookup from GDB follows linker logic. This is what is > desired most of the time. In the usage case a file is provided as > scope, so the lookup has to follow this priority. Failing in finding > the symbol at this scope usual path is followed. > > As test case it is presented two shared objects having a global variable > with the same name but comming from different source files. Without the > patch accessing them via the file scope returns the value seen in the > first loaded shared object. Using the patch the value defined in the file > scope is the one returned. > > One of the already existing test cases in print-file-var.exp starts to > fail after using this patch. In fact the value that the linker sees is > different then the one debugger can read from the shared object. In > 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 one > loaded and independent of the scope symbol will have the same value, as > defined in the first library loaded. > However, when defining the scope the value should represent the value > in that context. Diferent evaluations of the same symbols might also bett= er > spot the issue in users code. > > - I haven't changed the test because I wanted to hear the community > 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 file. = */ > + if (result.symbol =3D=3D NULL && objfile !=3D NULL) > + result =3D lookup_symbol_in_objfile (objfile, GLOBAL_BLOCK, name, do= main); > + > /* 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 b/gdb/te= stsuite/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 .= */ > + > +#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); > + 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 **) (&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 system. = */ > + if (v2 !=3D 104 || v2 !=3D 203) > + return 2; > + > + return 0; > +} > + > diff --git a/gdb/testsuite/gdb.base/print-file-var-dlopen.exp b/gdb/tests= uite/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 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 . = */ > + > +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 [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 > +# where the variables are defined. There are two global variables > +# with that name, and some systems such as GNU/Linux merge them > +# into one single entity, while some other systems such as Windows > +# keep them separate. In the first situation, we have to verify > +# that GDB does not randomly select the wrong instance, even when > +# a specific filename is used to qualified the lookup. And in the > +# second case, we have to verify that GDB does select the instance > +# defined in the given filename. > +# > +# To avoid adding target-specific code in this testcase, the program > +# sets two local variable named 'v1' and 'v2' with the value of > +# our global variables. This allows us to compare the value that > +# GDB returns for each query against the actual value seen by > +# the program itself. > + > +# Get past the initialization of variables 'v1' and 'v2'. > + > +set bp_location \ > + [gdb_get_line_number "STOP" "${executable}.c"] > +gdb_test "break $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 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