# Copyright 2014-2021 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/>.

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile .c symtab-search-order-1.c symtab-search-order-shlib-1.c
set srcfile  $srcdir/$subdir/$srcfile
set srcfile2 $srcdir/$subdir/$srcfile2
set lib1src  $srcdir/$subdir/$srcfile3
set lib1     [standard_output_file symtab-search-order-1.sl]

set lib_opts "debug"
set exec_opts [list debug shlib=$lib1]

if [get_compiler_info] {
    return -1
}

if { [gdb_compile_shlib $lib1src $lib1 $lib_opts] != ""
     || [gdb_compile [list $srcfile $srcfile2] $binfile executable \
	     $exec_opts] != ""} {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.

clean_restart $binfile
gdb_load_shlib $lib1

if ![runto_main] {
    return -1
}

# PR 17564
# Expand something in the shared library,
# and then try to print static_global in the binary.
# We should get the static_global in the binary.
# Note: static_global in the binary needs to be in a file
# other than the one with "main" because gdb will expand
# the symtab with main when starting.

gdb_test "p shlib_1_func" "= .*<shlib_1_func>"
gdb_test "p static_global" " = 23"
