compiler wrapper: parse Wl and Xlinker properly (#35912)
Two fixes: 1. `-Wl,a,b,c,d` is a comma separated list of linker arguments, we incorrectly assume key/value pairs, which runs into issues with for example `-Wl,--enable-new-dtags,-rpath,/x` 2. `-Xlinker,xxx` is not a think, so it shouldn't be parsed.
This commit is contained in:
		
							
								
								
									
										93
									
								
								lib/spack/env/cc
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										93
									
								
								lib/spack/env/cc
									
									
									
									
										vendored
									
									
								
							| @@ -427,6 +427,48 @@ isystem_include_dirs_list="" | ||||
| libs_list="" | ||||
| other_args_list="" | ||||
|  | ||||
| # Global state for keeping track of -Wl,-rpath -Wl,/path | ||||
| wl_expect_rpath=no | ||||
|  | ||||
| parse_Wl() { | ||||
|     # drop -Wl | ||||
|     shift | ||||
|     while [ $# -ne 0 ]; do | ||||
|     if [ "$wl_expect_rpath" = yes ]; then | ||||
|         rp="$1" | ||||
|         wl_expect_rpath=no | ||||
|     else | ||||
|         rp="" | ||||
|         case "$1" in | ||||
|             -rpath=*) | ||||
|                 rp="${1#-rpath=}" | ||||
|                 ;; | ||||
|             --rpath=*) | ||||
|                 rp="${1#--rpath=}" | ||||
|                 ;; | ||||
|             -rpath|--rpath) | ||||
|                 wl_expect_rpath=yes | ||||
|                 ;; | ||||
|             "$dtags_to_strip") | ||||
|                 ;; | ||||
|             *) | ||||
|                 append other_args_list "-Wl,$1" | ||||
|                 ;; | ||||
|         esac | ||||
|     fi | ||||
|     if [ -n "$rp" ]; then | ||||
|         if system_dir "$rp"; then | ||||
|             append system_rpath_dirs_list "$rp" | ||||
|         else | ||||
|             append rpath_dirs_list "$rp" | ||||
|         fi | ||||
|     fi | ||||
|     shift | ||||
|     done | ||||
|     # By lack of local variables, always set this to empty string. | ||||
|     rp="" | ||||
| } | ||||
|  | ||||
|  | ||||
| while [ $# -ne 0 ]; do | ||||
|  | ||||
| @@ -526,54 +568,9 @@ while [ $# -ne 0 ]; do | ||||
|             append other_args_list "-l$arg" | ||||
|             ;; | ||||
|         -Wl,*) | ||||
|             arg="${1#-Wl,}" | ||||
|             if [ -z "$arg" ]; then shift; arg="$1"; fi | ||||
|             case "$arg" in | ||||
|                 -rpath=*)  rp="${arg#-rpath=}"  ;; | ||||
|                 --rpath=*) rp="${arg#--rpath=}" ;; | ||||
|                 -rpath,*)  rp="${arg#-rpath,}"  ;; | ||||
|                 --rpath,*) rp="${arg#--rpath,}" ;; | ||||
|                 -rpath|--rpath) | ||||
|                     shift; arg="$1" | ||||
|                     case "$arg" in | ||||
|                         -Wl,*) | ||||
|                             rp="${arg#-Wl,}" | ||||
|                             ;; | ||||
|                         *) | ||||
|                             die "-Wl,-rpath was not followed by -Wl,*" | ||||
|                             ;; | ||||
|                     esac | ||||
|                     ;; | ||||
|                 "$dtags_to_strip") | ||||
|                     :  # We want to remove explicitly this flag | ||||
|                     ;; | ||||
|                 *) | ||||
|                     append other_args_list "-Wl,$arg" | ||||
|                     ;; | ||||
|             esac | ||||
|             ;; | ||||
|         -Xlinker,*) | ||||
|             arg="${1#-Xlinker,}" | ||||
|             if [ -z "$arg" ]; then shift; arg="$1"; fi | ||||
|  | ||||
|             case "$arg" in | ||||
|                 -rpath=*)  rp="${arg#-rpath=}"  ;; | ||||
|                 --rpath=*) rp="${arg#--rpath=}" ;; | ||||
|                 -rpath|--rpath) | ||||
|                     shift; arg="$1" | ||||
|                     case "$arg" in | ||||
|                         -Xlinker,*) | ||||
|                             rp="${arg#-Xlinker,}" | ||||
|                         ;; | ||||
|                         *) | ||||
|                             die "-Xlinker,-rpath was not followed by -Xlinker,*" | ||||
|                             ;; | ||||
|                     esac | ||||
|                     ;; | ||||
|                 *) | ||||
|                     append other_args_list "-Xlinker,$arg" | ||||
|                     ;; | ||||
|             esac | ||||
|             IFS=, | ||||
|             parse_Wl $1 | ||||
|             unset IFS | ||||
|             ;; | ||||
|         -Xlinker) | ||||
|             if [ "$2" = "-rpath" ]; then | ||||
|   | ||||
| @@ -127,13 +127,13 @@ def test_static_to_shared_library(build_environment): | ||||
|         "linux": ( | ||||
|             "/bin/mycc -shared" | ||||
|             " -Wl,--disable-new-dtags" | ||||
|             " -Wl,-soname,{2} -Wl,--whole-archive {0}" | ||||
|             " -Wl,-soname -Wl,{2} -Wl,--whole-archive {0}" | ||||
|             " -Wl,--no-whole-archive -o {1}" | ||||
|         ), | ||||
|         "darwin": ( | ||||
|             "/bin/mycc -dynamiclib" | ||||
|             " -Wl,--disable-new-dtags" | ||||
|             " -install_name {1} -Wl,-force_load,{0} -o {1}" | ||||
|             " -install_name {1} -Wl,-force_load -Wl,{0} -o {1}" | ||||
|         ), | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -342,6 +342,16 @@ def test_fc_flags(wrapper_environment, wrapper_flags): | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| def test_Wl_parsing(wrapper_environment): | ||||
|     check_args( | ||||
|         cc, | ||||
|         ["-Wl,-rpath,/a,--enable-new-dtags,-rpath=/b,--rpath", "-Wl,/c"], | ||||
|         [real_cc] | ||||
|         + target_args | ||||
|         + ["-Wl,--disable-new-dtags", "-Wl,-rpath,/a", "-Wl,-rpath,/b", "-Wl,-rpath,/c"], | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| def test_dep_rpath(wrapper_environment): | ||||
|     """Ensure RPATHs for root package are added.""" | ||||
|     check_args(cc, test_args, [real_cc] + target_args + common_compile_args) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Harmen Stoppels
					Harmen Stoppels