# Copyright 2024-2026 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Very simple test that links with libinproctrace.so and then starts
# the resulting inferior.
#
# This test should run on targets that don't support tracing, but for
# which libinproctrace.so is built and helps catch some issues where
# libinproctrace.so is so broken inferiors won't even start.

load_lib "trace-support.exp"

require allow_shlib_tests

standard_testfile

require allow_in_proc_agent
set libipa [get_in_proc_agent]

gdb_download_shlib $libipa

if { [build_executable "failed to prepare" $testfile $srcfile \
	  [list debug shlib=$libipa]] } {
    return
}

save_vars { env(ASAN_OPTIONS) } {
    # Prevent address sanitizer error:
    # ASan runtime does not come first in initial library list; you should
    # either link runtime to your application or manually preload it with
    # LD_PRELOAD.
    append_environment_default ASAN_OPTIONS verify_asan_link_order 0

    clean_restart $testfile
}

if {![runto_main]} {
    return
}

pass "inferior with libinproctrace.so started"
