This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Fix debugging of stripped PIE executables with padded PT_TLS
- From: Simon Marchi <simark at simark dot ca>
- To: Michael Spang <spang at chromium dot org>, gdb-patches at sourceware dot org
- Cc: Michael Spang <spang at google dot com>
- Date: Sun, 19 Aug 2018 11:04:26 -0400
- Subject: Re: [PATCH] Fix debugging of stripped PIE executables with padded PT_TLS
- References: <20180816183546.72361-1-spang@chromium.org>
On 2018-08-16 2:35 p.m., Michael Spang via gdb-patches wrote:
> 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.
Thanks, as far as I understand this patch is correct. I pushed it with some
minor changes outlined below.
Simon
> 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.
The changes in testsuite/ have their own ChangeLog file (gdb/testsuite/ChangeLog).
> ---
> 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%)
>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 9fac8ccf5f..b441619ca7 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -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.
> diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
> index 6f48c68632..84589509ef 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/gdb.base/gcore-relro-pie.c b/gdb/testsuite/gdb.base/gcore-tls-pie.c
> similarity index 96%
> copy from gdb/testsuite/gdb.base/gcore-relro-pie.c
> copy to gdb/testsuite/gdb.base/gcore-tls-pie.c
> index 2b5c0f3d2f..9deb4cd1d8 100644
> --- a/gdb/testsuite/gdb.base/gcore-relro-pie.c
> +++ b/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;
> +
I added a comment here explaining why we use these variable types specifically.
> void
> break_here (void)
> {
> diff --git a/gdb/testsuite/gdb.base/gcore-relro-pie.exp b/gdb/testsuite/gdb.base/gcore-tls-pie.exp
> similarity index 93%
> copy from gdb/testsuite/gdb.base/gcore-relro-pie.exp
> copy to gdb/testsuite/gdb.base/gcore-tls-pie.exp
> index fd03e4a98d..1f7381e1b3 100644
> --- a/gdb/testsuite/gdb.base/gcore-relro-pie.exp
> +++ b/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
> }
>
>