diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c75c0e14191..cb87cee4e72 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-08-19 Michael Spang + + PR gdb/11786 + * solib-svr4.c (svr4_exec_displacement): Ignore memsz fields + for PT_TLS segments. + 2018-08-18 Kevin Buettner * dwarf2expr.h (struct dwarf_expr_context): Add virtual method diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 6f48c686320..84589509ef9 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -2709,8 +2709,10 @@ svr4_exec_displacement (CORE_ADDR *displacementp) /* Strip modifies the flags and alignment of PT_GNU_RELRO. CentOS-5 has problems with filesz, memsz as well. + Strip also modifies memsz of PT_TLS. See PR 11786. */ - if (phdr2[i].p_type == PT_GNU_RELRO) + if (phdr2[i].p_type == PT_GNU_RELRO || + phdr2[i].p_type == PT_TLS) { Elf32_External_Phdr tmp_phdr = *phdrp; Elf32_External_Phdr tmp_phdr2 = *phdr2p; @@ -2840,8 +2842,10 @@ svr4_exec_displacement (CORE_ADDR *displacementp) /* Strip modifies the flags and alignment of PT_GNU_RELRO. CentOS-5 has problems with filesz, memsz as well. + Strip also modifies memsz of PT_TLS. See PR 11786. */ - if (phdr2[i].p_type == PT_GNU_RELRO) + if (phdr2[i].p_type == PT_GNU_RELRO || + phdr2[i].p_type == PT_TLS) { Elf64_External_Phdr tmp_phdr = *phdrp; Elf64_External_Phdr tmp_phdr2 = *phdr2p; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b70db16eb0e..bdef4be4bb9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-08-19 Michael Spang + + PR gdb/11786 + * gdb.base/gcore-tls-pie.c: New file. + * gdb.base/gcore-tls-pie.exp: New file. + 2018-08-18 Kevin Buettner * lib/dwarf.exp: Add support for DW_OP_GNU_variable_value. diff --git a/gdb/testsuite/gdb.base/gcore-tls-pie.c b/gdb/testsuite/gdb.base/gcore-tls-pie.c new file mode 100644 index 00000000000..aaba20fcc4a --- /dev/null +++ b/gdb/testsuite/gdb.base/gcore-tls-pie.c @@ -0,0 +1,48 @@ +/* Copyright 2013-2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* The size of these variables is chosen so that gold will add some padding + to the TLS program header (total size of 16 bytes on x86_64) which strip + will remove (bringing it down to 9 bytes). */ + +__thread long j; +__thread char i; + +void +break_here (void) +{ + *(int *) 0 = 0; +} + +void +foo (void) +{ + break_here (); +} + +void +bar (void) +{ + foo (); +} + +int +main (void) +{ + bar (); + return 0; +} diff --git a/gdb/testsuite/gdb.base/gcore-tls-pie.exp b/gdb/testsuite/gdb.base/gcore-tls-pie.exp new file mode 100644 index 00000000000..1f7381e1b39 --- /dev/null +++ b/gdb/testsuite/gdb.base/gcore-tls-pie.exp @@ -0,0 +1,62 @@ +# Copyright 2013-2018 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 . + +# PR 11786 (Gold and strip differ on memsz field of PT_TLS). +# Generate a core file from the stripped version of the program, +# and then try to debug the core with the unstripped version. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug additional_flags=-fpie "ldflags=-pie -fuse-ld=gold"}]} { + return -1 +} + +set stripped_binfile ${binfile}.stripped +set gcorefile ${binfile}.gcore + +set strip_program [transform strip] +remote_file host delete ${stripped_binfile} +if [run_on_host "strip" "$strip_program" "-g -o ${stripped_binfile} $binfile"] { + return -1 +} + +# Workaround PR binutils/10802: +# Preserve the 'x' bit also for PIEs (Position Independent Executables). +set perm [file attributes ${binfile} -permissions] +file attributes ${stripped_binfile} -permissions $perm + +clean_restart ${stripped_binfile} + +# The binary is stripped of debug info, but not minsyms. +if ![runto break_here] { + fail "can't run to break_here" + return -1 +} + +if {![gdb_gcore_cmd $gcorefile "save a corefile"]} { + return -1 +} + +# Now restart gdb with the unstripped binary and load the corefile. + +clean_restart ${binfile} + +gdb_test "core ${gcorefile}" \ + "Core was generated by .*" "re-load generated corefile" + +# Put $pc in gdb.log for debug purposes for comparison with stripped case. +gdb_test "x/i \$pc" "break_here.*" + +gdb_test "frame" "#0 \[^\r\n\]* break_here .*" "unstripped + core ok"