Re: [PATCH][gdb/testsuite] Fix shlib compilation with target board unix/-pie/-fPIE

Simon Marchi
2020-12-14T17:21:56Z

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.

Otherwise, LGTM.

Simon