From 1e61189d0ab0905178002120eb0a380858ed6dc0 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 16 Dec 2020 18:18:40 +0100 Subject: [PATCH] [gdb/testsuite] Fix shlib compilation with target board unix/-pie/-fPIE When running test-case gdb.base/info-shared.exp with target board unix/-pie/-fPIE, we run into: ... spawn -ignore SIGHUP gcc -fno-stack-protector \ outputs/gdb.base/info-shared/info-shared-solib1.c.o \ -fdiagnostics-color=never -fPIC -shared -Wl,-soname,info-shared-solib1.so \ -lm -fPIE -pie -o outputs/gdb.base/info-shared/info-shared-solib1.so^M ld: Scrt1.o: in function `_start':^M start.S:104: undefined reference to `main'^M collect2: error: ld returned 1 exit status^M compiler exited with status 1 ... The intention of the -pie/-fPIE flags is to build and test PIE executables on platforms where that is not the default. However, the flags clash with the flags required to build shared libraries. Fix this by filtering out PIE-related flags out of the multilib_flags settings in compile_shared_lib. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-16 Tom de Vries * lib/gdb.exp (gdb_compile_shlib_1): Factor out of ... (gdb_compile_shlib): ... here. Filter out PIE-related flags. --- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/lib/gdb.exp | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7249ae670d6..51d768c0365 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-12-16 Tom de Vries + + * lib/gdb.exp (gdb_compile_shlib_1): Factor out of ... + (gdb_compile_shlib): ... here. Filter out PIE-related flags. + 2020-12-16 Luis Machado * gdb.arch/aarch64-tagged-pointer.c (main): Add a few more diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 2b6b4d5e207..e812237d67a 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4283,7 +4283,7 @@ proc gdb_compile_pthreads {source dest type options} { # Build a shared library from SOURCES. -proc gdb_compile_shlib {sources dest options} { +proc gdb_compile_shlib_1 {sources dest options} { set obj_options $options set ada 0 @@ -4416,6 +4416,43 @@ proc gdb_compile_shlib {sources dest options} { return "" } +# Build a shared library from SOURCES. Ignore target boards PIE-related +# multilib_flags. + +proc gdb_compile_shlib {sources dest options} { + global board + + # Save multilib_flags. + set board [target_info name] + set save_multilib_flag [board_info $board multilib_flags] + + # Ignore PIE-related setting in multilib_flags. + set multilib_flag "" + foreach op $save_multilib_flag { + if { $op == "-pie" || $op == "-no-pie" \ + || $op == "-fPIE" || $op == "-fno-PIE"} { + } else { + append multilib_flag " $op" + } + } + unset_board_info "multilib_flags" + set_board_info multilib_flags "$multilib_flag" + set code [catch {gdb_compile_shlib_1 $sources $dest $options} result] + + # Restore multilib_flags. + unset_board_info "multilib_flags" + set_board_info multilib_flags $save_multilib_flag + + if {$code == 1} { + global errorInfo errorCode + return -code error -errorinfo $errorInfo -errorcode $errorCode $result + } elseif {$code > 1} { + return -code $code $result + } + + return $result +} + # This is just like gdb_compile_shlib, above, except that it tries compiling # against several different thread libraries, to see which one this # system has.