From: Alan Hayward Date: Wed, 13 Feb 2019 12:28:38 +0000 (+0000) Subject: Testsuite: Ensure pie is disabled on some tests X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=968aa7ae389d9e6cecb5fda6826bf889ed959fce;p=binutils-gdb.git Testsuite: Ensure pie is disabled on some tests 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. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 636800f2bf8..76ffd632b4a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-03-22 Alan Hayward + + * 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 * gdb.mi/mi2-cli-display.c: New file. diff --git a/gdb/testsuite/README b/gdb/testsuite/README index b5e75b9a79a..db90ea46982 100644 --- a/gdb/testsuite/README +++ b/gdb/testsuite/README @@ -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 diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index f85e8a650a5..51e31f65035 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -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 diff --git a/gdb/testsuite/gdb.base/dump.exp b/gdb/testsuite/gdb.base/dump.exp index 44b0988b803..52ba5f8ebe3 100644 --- a/gdb/testsuite/gdb.base/dump.exp +++ b/gdb/testsuite/gdb.base/dump.exp @@ -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 diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index f13f909c344..6800c741874 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -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] {