On 12/16/20 6:22 PM, Tom de Vries wrote: > On 12/14/20 6:21 PM, Simon Marchi wrote: >> On 2020-12-13 11:41 a.m., Tom de Vries wrote: >>> Hi, >>> >>> 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. >>> >>> Any comments? >>> >>> Thanks, >>> - Tom >>> >>> [gdb/testsuite] Fix shlib compilation with target board unix/-pie/-fPIE >>> >>> --- >>> gdb/testsuite/lib/gdb.exp | 39 ++++++++++++++++++++++++++++++++++++++- >>> 1 file changed, 38 insertions(+), 1 deletion(-) >>> >>> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp >>> index e35d236018..071b5afa99 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 >> >> That sounds reasonable. I wonder if the lines above could be simplified >> to: >> >> if {$code == 1} { >> ... >> } >> >> return -code $code $result >> >> IOW, if it's fine to return an explicit -code even if $code is 0 / OK. >> > > Thanks for the review. > > I copied this code from gdb_do_cache_wrap, so I left it as is for the > commit. > > This sounds like a good idea for a more broad refactoring. > I thought this over a bit more, and came to the realization that what this does is similar to save_vars, only for target board_info. So, how about this refactoring? Thanks, - Tom