shims/super/cc: fix linker flag parsing

Our parsing of linker flags can be easily confused by, e.g.,

    -Wl,-undefined -Wl,dynamic_lookup,-dead_strip_dylibs

The current code that tries to detect these flags will erroneously
conclude that they were not passed.

This change fixes that.
This commit is contained in:
Carlo Cabrera 2024-09-11 22:53:04 +08:00
parent b29549eaed
commit f3d1dd165d
No known key found for this signature in database
GPG Key ID: C74D447FC549A1D0

View File

@ -431,14 +431,16 @@ class Cmd
config.include?("D") config.include?("D")
end end
def linker_flags
@args.select { |arg| arg.start_with?("-Wl,") }
.flat_map { |arg| arg.delete_prefix("-Wl,").split(",") }
end
def no_fixup_chains? def no_fixup_chains?
return false unless config.include?("f") return false unless config.include?("f")
return false unless calls_ld? return false unless calls_ld?
return true if @args.include?("-Wl,-undefined,dynamic_lookup") return true if @args.each_cons(2).include?(["-undefined", "dynamic_lookup"])
return true if linker_flags.each_cons(2).include?(["-undefined", "dynamic_lookup"])
args_consecutive_pairs = @args.each_cons(2)
return true if args_consecutive_pairs.include?(["-undefined", "dynamic_lookup"])
return true if args_consecutive_pairs.include?(["-Wl,-undefined", "-Wl,dynamic_lookup"])
# The next flag would produce an error, but we fix it in `refurbish_arg`. # The next flag would produce an error, but we fix it in `refurbish_arg`.
@args.include?("-undefineddynamic_lookup") @args.include?("-undefineddynamic_lookup")
@ -449,7 +451,10 @@ class Cmd
end end
def ld_classic? def ld_classic?
config.include?("c") && calls_ld? && @args.any? { |arg| arg.match?(/^(-Wl,)?-dead_strip_dylibs$/) } return false unless config.include?("c")
return false unless calls_ld?
@args.include?("-dead_strip_dylibs") || linker_flags.include?("-dead_strip_dylibs")
end end
def calls_ld? def calls_ld?