This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix debugging of stripped PIE executables with padded PT_TLS


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
>  }
>  
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]