[v5,8/8] Tests for validate symbol file using build-id

Message ID 20140319223131.14668.9029.stgit@host1.jankratochvil.net
State Deferred
Headers

Commit Message

Jan Kratochvil March 19, 2014, 10:31 p.m. UTC
  Hi,

new testcase.


Jan


gdb/testsuite/
2014-02-26  Aleksandar Ristovski  <aristovski@qnx.com

	Tests for validate symbol file using build-id.
	* gdb.server/solib-mismatch-lib.c: New file.
	* gdb.server/solib-mismatch-libmod.c: New file.
	* gdb.server/solib-mismatch.c: New file.
	* gdb.server/solib-mismatch.exp: New file.
---
 gdb/testsuite/gdb.server/solib-mismatch-lib.c    |   29 ++++
 gdb/testsuite/gdb.server/solib-mismatch-libmod.c |   29 ++++
 gdb/testsuite/gdb.server/solib-mismatch.c        |   56 ++++++++
 gdb/testsuite/gdb.server/solib-mismatch.exp      |  156 ++++++++++++++++++++++
 4 files changed, 270 insertions(+)
 create mode 100644 gdb/testsuite/gdb.server/solib-mismatch-lib.c
 create mode 100644 gdb/testsuite/gdb.server/solib-mismatch-libmod.c
 create mode 100644 gdb/testsuite/gdb.server/solib-mismatch.c
 create mode 100644 gdb/testsuite/gdb.server/solib-mismatch.exp
  

Comments

Tom Tromey May 20, 2014, 2:57 p.m. UTC | #1
>>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:

Jan> 2014-02-26  Aleksandar Ristovski  <aristovski@qnx.com
Jan> 	Tests for validate symbol file using build-id.
Jan> 	* gdb.server/solib-mismatch-lib.c: New file.
Jan> 	* gdb.server/solib-mismatch-libmod.c: New file.
Jan> 	* gdb.server/solib-mismatch.c: New file.
Jan> 	* gdb.server/solib-mismatch.exp: New file.

I thought Pedro had wanted these not in gdb.server.
Or am I confusing that with some other patch?

Jan> +if ![is_remote target] {
Jan> +  untested "only gdbserver supports build-id reporting"
Jan> +  return -1

I was mildly confused to read this.
Isn't build-id also supported natively?
How does the new functionality interact with the existing build-id
functionality?

Tom
  
Jan Kratochvil May 20, 2014, 3:29 p.m. UTC | #2
On Tue, 20 May 2014 16:57:11 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
> 
> Jan> 2014-02-26  Aleksandar Ristovski  <aristovski@qnx.com
> Jan> 	Tests for validate symbol file using build-id.
> Jan> 	* gdb.server/solib-mismatch-lib.c: New file.
> Jan> 	* gdb.server/solib-mismatch-libmod.c: New file.
> Jan> 	* gdb.server/solib-mismatch.c: New file.
> Jan> 	* gdb.server/solib-mismatch.exp: New file.
> 
> I thought Pedro had wanted these not in gdb.server.
> Or am I confusing that with some other patch?

In a local copy they are moved back to gdb.base/ .
But I haven't re-post the whole series just because of it.
Planning to check it in into gdb.base/ .


> Jan> +if ![is_remote target] {
> Jan> +  untested "only gdbserver supports build-id reporting"
> Jan> +  return -1
> 
> I was mildly confused to read this.
> Isn't build-id also supported natively?

For this case of build-id it is not.  It was discussed in:
	Re: [patchv3 7/8] Validate symbol file using build-id
	Message-ID: <53108EF7.3000708@redhat.com>
	https://sourceware.org/ml/gdb-patches/2014-02/msg00862.html
	https://sourceware.org/ml/gdb-patches/2014-03/msg00011.html


> How does the new functionality interact with the existing build-id
> functionality?

Currently only the separate debug info file is located and validated by
build-id.  This patch is about validating the primary file (without .debug
extension - in fact symbol file as GDB uses that file only for symbols).


Besides all of these there are additional patches:
	http://pkgs.fedoraproject.org/cgit/gdb.git/tree/
	gdb-6.6-buildid-locate-*
which are also about locating the primary files but those patches are for
local (NAT) mode.

Also this series does not validate / locate the main executable, the Fedora
patches above work also for the main executable.

It got all a bit messy so I decided to merge it all and preparing it as an
update (technically add-on) on this patch series.  So also contrary to my
original plans in
	Re: [patchv3 7/8] Validate symbol file using build-id
above I am going to implement the local (NAT) mode for locating the files.
As I expect GDB is not going to unify LocalRemoteFeatureParity soon enough.
It will be about upstreaming the Fedora patchset which is the last largest
Fedora-specific patchsets kept.


Jan
  

Patch

diff --git a/gdb/testsuite/gdb.server/solib-mismatch-lib.c b/gdb/testsuite/gdb.server/solib-mismatch-lib.c
new file mode 100644
index 0000000..65b26af
--- /dev/null
+++ b/gdb/testsuite/gdb.server/solib-mismatch-lib.c
@@ -0,0 +1,29 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2014 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 <http://www.gnu.org/licenses/>.  */
+
+
+int _bar = 42;
+
+int bar(void)
+{
+  return _bar + 21;
+}
+
+int foo(void)
+{
+  return _bar;
+}
diff --git a/gdb/testsuite/gdb.server/solib-mismatch-libmod.c b/gdb/testsuite/gdb.server/solib-mismatch-libmod.c
new file mode 100644
index 0000000..fc8827e
--- /dev/null
+++ b/gdb/testsuite/gdb.server/solib-mismatch-libmod.c
@@ -0,0 +1,29 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2014 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 <http://www.gnu.org/licenses/>.  */
+
+
+int _bar = 21;
+
+int bar(void)
+{
+  return 42 - _bar;
+}
+
+int foo(void)
+{
+  return 24 + bar();
+}
diff --git a/gdb/testsuite/gdb.server/solib-mismatch.c b/gdb/testsuite/gdb.server/solib-mismatch.c
new file mode 100644
index 0000000..c8be18a
--- /dev/null
+++ b/gdb/testsuite/gdb.server/solib-mismatch.c
@@ -0,0 +1,56 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2014 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 <http://www.gnu.org/licenses/>.  */
+
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+
+/* The following defines must correspond to solib-mismatch.exp .  */
+
+/* DIRNAME and LIB must be defined at compile time.  */
+#ifndef DIRNAME
+#error DIRNAME not defined
+#endif
+#ifndef LIB
+#error LIB not defined
+#endif
+
+int main (int argc, char *argv[])
+{
+  void *h;
+  int (*foo) (void);
+
+  if (chdir (DIRNAME) != 0)
+    {
+      printf ("ERROR - Could not cd to %s\n", DIRNAME);
+      return 1;
+    }
+
+  h = dlopen (LIB, RTLD_NOW);
+
+  if (h == NULL)
+    {
+      printf ("ERROR - could not open lib %s\n", LIB);
+      return 1;
+    }
+  foo = dlsym (h, "foo"); /* set breakpoint 1 here */
+  dlclose (h);
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.server/solib-mismatch.exp b/gdb/testsuite/gdb.server/solib-mismatch.exp
new file mode 100644
index 0000000..9dbce7f
--- /dev/null
+++ b/gdb/testsuite/gdb.server/solib-mismatch.exp
@@ -0,0 +1,156 @@ 
+# Copyright 2014 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 <http://www.gnu.org/licenses/>.  */
+
+standard_testfile
+set executable $testfile
+
+if ![is_remote target] {
+  untested "only gdbserver supports build-id reporting"
+  return -1
+}
+if [is_remote host] {
+  untested "only local host is currently supported"
+  return -1
+}
+
+# Test overview:
+#  generate two shared objects. One that will be used by the process
+#  and another, modified, that will be found by gdb. Gdb should
+#  detect the mismatch and refuse to use mismatched shared object.
+
+if { [get_compiler_info] } {
+  untested "get_compiler_info failed."
+  return -1
+}
+
+# First version of the object, to be loaded by ld.
+set srclibfilerun ${testfile}-lib.c
+
+# Modified version of the object to be loaded by gdb
+# Code in -libmod.c is tuned so it gives a mismatch but
+# leaves .dynamic at the same point.
+set srclibfilegdb ${testfile}-libmod.c
+
+# So file name:
+set binlibfilebase lib${testfile}.so
+
+# Setup run directory (where program is run from)
+#   It contains executable and '-lib' version of the library.
+set binlibfiledirrun [standard_output_file ${testfile}_wd]
+set binlibfilerun ${binlibfiledirrun}/${binlibfilebase}
+
+# Second solib version is in current directory, '-libmod' version.
+set binlibfiledirgdb [standard_output_file ""]
+set binlibfilegdb ${binlibfiledirgdb}/${binlibfilebase}
+
+# Executable
+set srcfile ${testfile}.c
+set executable ${testfile}
+
+file delete -force -- "${binlibfiledirrun}"
+file mkdir "${binlibfiledirrun}"
+
+set exec_opts {}
+
+if { ![istarget "*-*-nto-*"] } {
+  lappend exec_opts "shlib_load"
+}
+
+lappend exec_opts "additional_flags=-DDIRNAME\=\"${binlibfiledirrun}\" -DLIB\=\"./${binlibfilebase}\""
+lappend exec_opts "debug"
+
+if { [build_executable $testfile.exp $executable $srcfile $exec_opts] != 0 } {
+  return -1
+}
+
+if { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfilerun}" "${binlibfilerun}" [list debug ldflags=-Wl,--build-id]] != ""
+     || [gdb_gnu_strip_debug "${binlibfilerun}"]
+     || [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfilegdb}" "${binlibfilegdb}" [list debug ldflags=-Wl,--build-id]] != "" } {
+  untested "compilation failed."
+  return -1
+}
+
+proc solib_matching_test { solibfile symsloaded } {
+  global gdb_prompt
+  global testfile
+  global executable
+  global srcdir
+  global subdir
+  global binlibfiledirrun
+  global binlibfiledirgdb
+  global srcfile
+
+  clean_restart ${binlibfiledirrun}/${executable}
+
+  gdb_test_no_output "set solib-search-path \"${binlibfiledirgdb}\"" ""
+  if { [gdb_test "cd ${binlibfiledirgdb}" "" ""] != 0 } {
+    untested "cd ${binlibfiledirgdb}"
+    return -1
+  }
+
+  # Do not auto load shared libraries, the test needs to have control
+  # over when the relevant output gets printed.
+  gdb_test_no_output "set auto-solib-add off" ""
+
+  if ![runto "${srcfile}:[gdb_get_line_number "set breakpoint 1 here"]"] {
+    return -1
+  }
+
+  gdb_test "sharedlibrary" "" ""
+
+  set nocrlf "\[^\r\n\]*"
+  set expected_header "From${nocrlf}To${nocrlf}Syms${nocrlf}Read${nocrlf}Shared${nocrlf}"
+  set expected_line "${symsloaded}${nocrlf}${solibfile}"
+
+  gdb_test "info sharedlibrary ${solibfile}" \
+    "${expected_header}\r\n.*${expected_line}.*" \
+    "Symbols for ${solibfile} loaded: expected '${symsloaded}'"
+
+  return 0
+}
+
+# Copy binary to working dir so it pulls in the library from that dir
+# (by the virtue of $ORIGIN).
+file copy -force "${binlibfiledirgdb}/${executable}" \
+		 "${binlibfiledirrun}/${executable}"
+
+# Test unstripped, .dynamic matching
+with_test_prefix "test unstripped, .dynamic matching" {
+  solib_matching_test "${binlibfilebase}" "No"
+}
+
+# Keep original so for debugging purposes
+file copy -force "${binlibfilegdb}" "${binlibfilegdb}-orig"
+set objcopy_program [transform objcopy]
+set result [catch "exec $objcopy_program --only-keep-debug ${binlibfilegdb}"]
+if {$result != 0} {
+  untested "test --only-keep-debug (objcopy)"
+}
+
+# Test --only-keep-debug, .dynamic matching so
+with_test_prefix "test --only-keep-debug" {
+  solib_matching_test "${binlibfilebase}" "No"
+}
+
+# Keep previous so for debugging puroses
+file copy -force "${binlibfilegdb}" "${binlibfilegdb}-orig1"
+
+# Copy loaded so over the one gdb will find
+file copy -force "${binlibfilerun}" "${binlibfilegdb}"
+
+# Now test it does not mis-invalidate matching libraries
+with_test_prefix "test matching libraries" {
+  solib_matching_test "${binlibfilebase}" "Yes"
+}