From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 4FUMMfE73l+WGgAAWB0awg (envelope-from ) for ; Sat, 19 Dec 2020 12:44:17 -0500 Received: by simark.ca (Postfix, from userid 112) id C69391F0AA; Sat, 19 Dec 2020 12:44:17 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=MAILING_LIST_MULTI,RDNS_NONE, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 3B13D1E965 for ; Sat, 19 Dec 2020 12:44:17 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8AF803858004; Sat, 19 Dec 2020 17:44:16 +0000 (GMT) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 559233858004 for ; Sat, 19 Dec 2020 17:44:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 559233858004 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 478A9ACA5; Sat, 19 Dec 2020 17:44:12 +0000 (UTC) Subject: Re: [PATCH][gdb/testsuite] Fix shlib compilation with target board unix/-pie/-fPIE From: Tom de Vries To: Simon Marchi , gdb-patches@sourceware.org References: <20201213164131.GA7699@delia> <60fb40c8-73ca-e6de-e45f-805fba548f88@simark.ca> <1a23f50f-bf4f-ae09-7ff5-b23e59d6438b@suse.de> Message-ID: <9f2a5364-9651-2842-2d64-439ef14957fd@suse.de> Date: Sat, 19 Dec 2020 18:44:11 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.0 MIME-Version: 1.0 In-Reply-To: <1a23f50f-bf4f-ae09-7ff5-b23e59d6438b@suse.de> Content-Type: multipart/mixed; boundary="------------9D2ABC659D75C2F4145D67CF" Content-Language: en-US X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" This is a multi-part message in MIME format. --------------9D2ABC659D75C2F4145D67CF Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 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 --------------9D2ABC659D75C2F4145D67CF Content-Type: text/x-patch; charset=UTF-8; name="0005-gdb-testsuite-Handle-target_board_info-switch-in-save_vars.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0005-gdb-testsuite-Handle-target_board_info-switch-in-save_v"; filename*1="ars.patch" [gdb/testsuite] Handle --target_board_info switch in save_vars Add a --target_board_info switch to save_vars such that we can do: ... save_vars { --target_board_info multilib_flags } { unset_board_info multilib_flags set_board_info multilib_flags "$override_multilib_flags" } ... and use it in gdb_compile_shlib. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-19 Tom de Vries * lib/gdb.exp (save_vars): Add --target_board_info support. (gdb_compile_shlib): Use save_vars. --- gdb/testsuite/lib/gdb.exp | 63 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index e91023093e..4aae1fffe6 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -2364,6 +2364,9 @@ proc proc_with_prefix {name arguments body} { # Run BODY in the context of the caller. After BODY is run, the variables # listed in VARS will be reset to the values they had before BODY was run. # +# A variable preceded by "--target_board_info" specifies a variable stored +# in board_info for the target board, rather than a tcl variable. +# # This is useful for providing a scope in which it is safe to temporarily # modify global variables, e.g. # @@ -2386,9 +2389,28 @@ proc proc_with_prefix {name arguments body} { proc save_vars { vars body } { array set saved_scalars { } array set saved_arrays { } + array set saved_target_board_info { } set unset_vars { } + set unset_target_board_info { } + set target_board_info 0 foreach var $vars { + if { $var == "--target_board_info" } { + set target_board_info 1 + continue + } + if { $target_board_info } { + set target_board_info 0 + global board board_info + set board [target_info name] + if { [info exists board_info($board,$var)] } { + set saved_target_board_info($var) [board_info $board $var] + } else { + lappend unset_target_board_info $var + } + continue + } + # First evaluate VAR in the context of the caller in case the variable # name may be a not-yet-interpolated string like env($foo) set var [uplevel 1 list $var] @@ -2415,10 +2437,23 @@ proc save_vars { vars body } { uplevel 1 [list array set $var $value] } + foreach {var value} [array get saved_target_board_info] { + global board + set board [target_info name] + unset_board_info $var + set_board_info $var $value + } + foreach var $unset_vars { uplevel 1 [list unset -nocomplain $var] } + foreach var $unset_target_board_info { + global board + set board [target_info name] + unset_board_info $var + } + if {$code == 1} { global errorInfo errorCode return -code $code -errorinfo $errorInfo -errorcode $errorCode $result @@ -4422,32 +4457,22 @@ proc gdb_compile_shlib_1 {sources dest options} { 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 { + set board [target_info name] + set multilib_flags_orig [board_info $board multilib_flags] + set multilib_flags "" + foreach op $multilib_flags_orig { if { $op == "-pie" || $op == "-no-pie" \ || $op == "-fPIE" || $op == "-fno-PIE"} { } else { - append multilib_flag " $op" + append multilib_flags " $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 + save_vars { --target_board_info multilib_flags } { + unset_board_info multilib_flags + set_board_info multilib_flags "$multilib_flags" + set result [gdb_compile_shlib_1 $sources $dest $options] } return $result --------------9D2ABC659D75C2F4145D67CF--