Fix debugging of stripped PIE executables with padded PT_TLS
Commit Message
From: Michael Spang <spang@google.com>
Certain PIE executables produced by gold cannot be debugged by gdb after
being stripped. GDB requires program headers of PIE executables to match,
and those checks may fail due to adjustments made during stripping.
One case of this occurs because strip recomputes the memsz of PT_TLS and
does not add alignment, while gold does. This is another variant of PR
11786, so apply the same fix of relaxing the program header matching.
gdb/ChangeLog:
PR gdb/11786
* solib-svr4.c (svr4_exec_displacement): Ignore memsz fields
for PT_TLS segments.
testsuite/
* gdb.base/gcore-tls-pie.c: New file.
* gdb.base/gcore-tls-pie.exp: New file.
---
gdb/ChangeLog | 10 ++++++++++
gdb/solib-svr4.c | 8 ++++++--
.../gdb.base/{gcore-relro-pie.c => gcore-tls-pie.c} | 4 ++++
.../{gcore-relro-pie.exp => gcore-tls-pie.exp} | 4 ++--
4 files changed, 22 insertions(+), 4 deletions(-)
copy gdb/testsuite/gdb.base/{gcore-relro-pie.c => gcore-tls-pie.c} (96%)
copy gdb/testsuite/gdb.base/{gcore-relro-pie.exp => gcore-tls-pie.exp} (93%)
@@ -1,3 +1,13 @@
+2018-08-16 Michael Spang <spang@google.com>
+
+ PR gdb/11786
+ * solib-svr4.c (svr4_exec_displacement): Ignore memsz fields
+ for PT_TLS segments.
+
+ testsuite/
+ * gdb.base/gcore-tls-pie.c: New file.
+ * gdb.base/gcore-tls-pie.exp: New file.
+
2018-08-15 Tom Tromey <tom@tromey.com>
* aarch64-linux-tdep.c (aarch64_linux_core_read_vq): Use pulongest.
@@ -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;
similarity index 96%
copy from gdb/testsuite/gdb.base/gcore-relro-pie.c
copy to gdb/testsuite/gdb.base/gcore-tls-pie.c
@@ -15,6 +15,10 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+__thread long j;
+__thread char i;
+
void
break_here (void)
{
similarity index 93%
copy from gdb/testsuite/gdb.base/gcore-relro-pie.exp
copy to gdb/testsuite/gdb.base/gcore-tls-pie.exp
@@ -13,13 +13,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# PR 11786 (Gold and strip differ on flags,align fields of PT_GNU_RELRO).
+# 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 -Wl,-z,relro"}]} {
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug additional_flags=-fpie "ldflags=-pie -fuse-ld=gold"}]} {
return -1
}