[RFC] asan ld builds without detect_leaks=0
Sam James
sam@gentoo.org
Mon Jan 20 17:39:16 GMT 2025
Alan Modra <amodra@gmail.com> writes:
> I found that building binutils with -fsanitize=address,undefined
> results in much of the testsuite not being run. The problem is that
> running gcc results in linker plugin memory leaks which of course are
> errors, so the testsuite sees this as lack of compiler support.
>
> Does this seem a reasonable hack?
I would prefer -fno-sanitize=leak *but* I suspect it's going to be a bit
harder to pipe it in everywhere and will end up being roughly as
invasive as this patch is, so it looks fine. Thanks.
>
> * testsuite/lib/ld-lib.exp (run_host_noleak): New proc.
> (check_compiler_available, check_lto_available),
> (check_lto_fat_available, check_lto_shared_available),
> (check_ifunc_available, check_ifunc_attribute_available),
> (check_libdl_available, check_gnu2_tls_available),
> (compile_one_cc): Use run_host_noleak.
> * testsuite/config/default.exp (compiler_supports): Likewise.
>
> diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp
> index f93fb30ab07..66721ff618e 100644
> --- a/ld/testsuite/config/default.exp
> +++ b/ld/testsuite/config/default.exp
> @@ -422,7 +422,7 @@ proc compiler_supports { flag args } {
> }
> close $f
> set rfn [remote_download host $fn]
> - set avail [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $flag $rfn -o $rfno"]
> + set avail [run_host_noleak "$CC_FOR_TARGET" "$flags $flag $rfn -o $rfno"]
> remote_file host delete $rfno
> remote_file host delete $rfn
> file delete $fn
> diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
> index 74125ac1983..96152718d6f 100644
> --- a/ld/testsuite/lib/ld-lib.exp
> +++ b/ld/testsuite/lib/ld-lib.exp
> @@ -151,6 +151,22 @@ proc run_host_cmd_yesno { prog command } {
> return 0;
> }
>
> +proc run_host_noleak { prog command } {
> + global env
> + if [info exists env(ASAN_OPTIONS)] {
> + set old_asan "$env(ASAN_OPTIONS)"
> + }
> + # don't fail the test due to gcc plugin or ld memory leaks
> + set env(ASAN_OPTIONS) "detect_leaks=0"
> + set result [run_host_cmd_yesno "$prog" "$command"]
> + if [info exists old_asan] {
> + set env(ASAN_OPTIONS) "$old_asan"
> + } else {
> + unset env(ASAN_OPTIONS)
> + }
> + return $result
> +}
> +
> # Link an object using relocation.
> #
> proc default_ld_relocate { ld target objects } {
> @@ -1248,7 +1264,7 @@ proc check_compiler_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set compiler_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $src -o $output"]
> + set compiler_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags $src -o $output"]
> remote_file host delete $src
> remote_file host delete $output
> file delete $src
> @@ -1311,7 +1327,7 @@ proc check_lto_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set lto_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags -flto -fuse-linker-plugin $src -o $output"]
> + set lto_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags -flto -fuse-linker-plugin $src -o $output"]
> remote_file host delete $src
> remote_file host delete $output
> file delete $src
> @@ -1347,7 +1363,7 @@ proc check_lto_fat_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set lto_fat_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags -flto -ffat-lto-objects -fuse-linker-plugin $src -o $output"]
> + set lto_fat_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags -flto -ffat-lto-objects -fuse-linker-plugin $src -o $output"]
> remote_file host delete $src
> remote_file host delete $output
> file delete $src
> @@ -1383,7 +1399,7 @@ proc check_lto_shared_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set lto_shared_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags -shared -fPIC -flto -fuse-linker-plugin $src -o $output"]
> + set lto_shared_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags -shared -fPIC -flto -fuse-linker-plugin $src -o $output"]
> remote_file host delete $src
> remote_file host delete $output
> file delete $src
> @@ -1444,7 +1460,7 @@ proc check_ifunc_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set ifunc_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $src -o $output"]
> + set ifunc_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags $src -o $output"]
> if { [isnative] && $ifunc_available_saved == 1 } {
> set ifunc_available_saved [run_host_cmd_yesno "$output" ""]
> }
> @@ -1484,7 +1500,7 @@ proc check_ifunc_attribute_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set ifunc_attribute_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $src -o $output"]
> + set ifunc_attribute_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags $src -o $output"]
> if { [isnative] && $ifunc_attribute_available_saved == 1 } {
> set ifunc_attribute_available_saved [run_host_cmd_yesno "$output" ""]
> }
> @@ -1522,7 +1538,7 @@ proc check_libdl_available { } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - set libdl_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$src -o $output -ldl"]
> + set libdl_available_saved [run_host_noleak "$CC_FOR_TARGET" "$src -o $output -ldl"]
> remote_file host delete $src
> remote_file host delete $output
> file delete $src
> @@ -1571,11 +1587,11 @@ proc check_gnu2_tls_available { } {
> if [is_remote host] {
> set src2 [remote_download host $src2]
> }
> - set gnu2_tls_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "-fPIC -shared $flags $src1 -o $output1"]
> + set gnu2_tls_available_saved [run_host_noleak "$CC_FOR_TARGET" "-fPIC -shared $flags $src1 -o $output1"]
> if { $gnu2_tls_available_saved == 1 } {
> - set gnu2_tls_available_saved [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $src2 $output1 -o $output2"]
> + set gnu2_tls_available_saved [run_host_noleak "$CC_FOR_TARGET" "$flags $src2 $output1 -o $output2"]
> if { $gnu2_tls_available_saved == 1 } {
> - set gnu2_tls_available_saved [run_host_cmd_yesno "$output2" ""]
> + set gnu2_tls_available_saved [run_host_noleak "$output2" ""]
> }
> }
> remote_file host delete $src1
> @@ -1597,7 +1613,7 @@ proc compile_one_cc { src output additional_flags } {
> if [is_remote host] {
> set src [remote_download host $src]
> }
> - return [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $CFLAGS_FOR_TARGET $additional_flags $src -o $output"]
> + return [run_host_noleak "$CC_FOR_TARGET" "$flags $CFLAGS_FOR_TARGET $additional_flags $src -o $output"]
> }
>
> # Returns true if the target compiler supports -gctf.
More information about the Binutils
mailing list