Testsuite: Ensure pie is disabled on some tests
authorAlan Hayward <alan.hayward@arm.com>
Wed, 7 Aug 2019 16:23:49 +0000 (18:23 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 7 Aug 2019 16:23:49 +0000 (18:23 +0200)
[ Backport of master commit 968aa7ae38. ]

Recent versions of Ubuntu and Debian default GCC to enable pie.

In dump.exp, pie will causes addresses to be out of range for IHEX.

In break-interp.exp, pie is explicitly set for some tests and assumed
to be disabled for the remainder.

Ensure pie is disabled for these tests when required.

In addition, add a pie option to gdb_compile to match the nopie option
and simplify use.

gdb/testsuite/ChangeLog:

* README: Add pie options.
* gdb.base/break-interp.exp: Ensure pie is disabled.
* gdb.base/dump.exp: Likewise.
* lib/gdb.exp (gdb_compile): Add pie option.

gdb/testsuite/ChangeLog
gdb/testsuite/README
gdb/testsuite/gdb.base/break-interp.exp
gdb/testsuite/gdb.base/dump.exp
gdb/testsuite/lib/gdb.exp

index c510361..03824fa 100644 (file)
@@ -1,3 +1,10 @@
+2019-03-22  Alan Hayward  <alan.hayward@arm.com>
+
+       * README: Add pie options.
+       * gdb.base/break-interp.exp: Ensure pie is disabled.
+       * gdb.base/dump.exp: Likewise.
+       * lib/gdb.exp (gdb_compile): Add pie option.
+
 2019-06-27  Tom Tromey  <tromey@adacore.com>
 
        * gdb.cp/constexpr-field.exp: Use setup_xfail.
index b5e75b9..db90ea4 100644 (file)
@@ -482,6 +482,16 @@ gdb,no_thread_names
 
   The target doesn't support thread names.
 
+gdb,pie_flag
+
+  The flag required to force the compiler to produce position-independent
+  executables.
+
+gdb,pie_ldflag
+
+  The flag required to force the linker to produce position-independent
+  executables.
+
 gdb,nopie_flag
 
   The flag required to force the compiler to produce non-position-independent
index f85e8a6..51e31f6 100644 (file)
@@ -625,8 +625,10 @@ foreach ldprelink {NO YES} {
                                lappend opts {debug}
                            }
                            if {$binpie != "NO"} {
-                               lappend opts {additional_flags=-fPIE}
-                               lappend opts {ldflags=-pie}
+                               lappend opts {pie}
+                           } else {
+                               # Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled.
+                               lappend opts {nopie}
                            }
 
                            set dir ${exec}.d
index 44b0988..52ba5f8 100644 (file)
@@ -36,6 +36,10 @@ if {[istarget "spu*-*-*"]} then {
     set is64bitonly "yes"
 }
 
+# Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled as
+# this causes addresses to be out of range for IHEX.
+lappend options {nopie}
+
 if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ${options}] != "" } {
      untested "failed to compile"
      return -1
index 36f1673..3d5f872 100644 (file)
@@ -3492,6 +3492,7 @@ set gdb_saved_set_unbuffered_mode_obj ""
 #     dynamically load libraries at runtime.  For example, on Linux, this adds
 #     -ldl so that the test can use dlopen.
 #   - nowarnings:  Inhibit all compiler warnings.
+#   - pie: Force creation of PIE executables.
 #   - nopie: Prevent creation of PIE executables.
 #
 # And here are some of the not too obscure options understood by DejaGnu that
@@ -3630,8 +3631,33 @@ proc gdb_compile {source dest type options} {
        set options [lreplace $options $nowarnings $nowarnings $flag]
     }
 
-    # Replace the "nopie" option with the appropriate additional_flags
-    # to disable PIE executables.
+    # Replace the "pie" option with the appropriate compiler and linker flags
+    # to enable PIE executables.
+    set pie [lsearch -exact $options pie]
+    if {$pie != -1} {
+       if [target_info exists gdb,pie_flag] {
+           set flag "additional_flags=[target_info gdb,pie_flag]"
+       } else {
+           # For safety, use fPIE rather than fpie. On AArch64, m68k, PowerPC
+           # and SPARC, fpie can cause compile errors due to the GOT exceeding
+           # a maximum size.  On other architectures the two flags are
+           # identical (see the GCC manual). Note Debian9 and Ubuntu16.10
+           # onwards default GCC to using fPIE.  If you do require fpie, then
+           # it can be set using the pie_flag.
+           set flag "additional_flags=-fPIE"
+       }
+       set options [lreplace $options $pie $pie $flag]
+
+       if [target_info exists gdb,pie_ldflag] {
+           set flag "ldflags=[target_info gdb,pie_ldflag]"
+       } else {
+           set flag "ldflags=-pie"
+       }
+       lappend options "$flag"
+    }
+
+    # Replace the "nopie" option with the appropriate linker flag to disable
+    # PIE executables.  There are no compiler flags for this option.
     set nopie [lsearch -exact $options nopie]
     if {$nopie != -1} {
        if [target_info exists gdb,nopie_flag] {