Testsuite: Ensure pie is disabled on some tests
authorAlan Hayward <alan.hayward@arm.com>
Wed, 13 Feb 2019 12:28:38 +0000 (12:28 +0000)
committerAlan Hayward <alan.hayward@arm.com>
Fri, 22 Mar 2019 09:43:35 +0000 (09:43 +0000)
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 636800f2bf88a78e1514e2c401b1e249664cc3a8..76ffd632b4a08dec4060bd7db265543c0558b0ff 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-03-19  Tom Tromey  <tromey@adacore.com>
 
        * gdb.mi/mi2-cli-display.c: New file.
index b5e75b9a79a56ef3380d81068c11515dcfe0fdd1..db90ea46982efa101b29e7cde754b474b7b6f42c 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 f85e8a650a5bffeacbc062947b851b96f006f598..51e31f65035403b02ba1650509c9743b931ba2fb 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 44b0988b803c4d7a9a6a1ab065f0cd812caaed31..52ba5f8ebe3dd17c0bdd4752803b57dd64c96b49 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 f13f909c34418c9f4dee2e8e7920e4be6e90a73b..6800c741874b06dcb2f4cee6b5716cd845aed94c 100644 (file)
@@ -3461,6 +3461,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
@@ -3599,8 +3600,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] {