Commit | Line | Data |
---|---|---|
7b6bb8da | 1 | # Copyright 2009, 2010, 2011 Free Software Foundation, Inc. |
817aadd2 JK |
2 | # This program is free software; you can redistribute it and/or modify |
3 | # it under the terms of the GNU General Public License as published by | |
4 | # the Free Software Foundation; either version 3 of the License, or | |
5 | # (at your option) any later version. | |
6 | # | |
7 | # This program is distributed in the hope that it will be useful, | |
8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
10 | # GNU General Public License for more details. | |
11 | # | |
12 | # You should have received a copy of the GNU General Public License | |
13 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
14 | # | |
15 | # Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>. | |
16 | ||
17 | # Test GDB can cope with two libraries loaded with overlapping VMA ranges. | |
18 | # Prelink libraries first so they can be loaded and their native address. | |
19 | # In such case `struct linkmap'.l_addr will be zero. Provide different | |
20 | # unprelinked library files on the disk which have zero-based VMAs. These | |
21 | # different files should have their .dynamic section at a different offset in | |
22 | # page size so that we get for | |
23 | # warning: .dynamic section for "..." is not at the expected address | |
24 | # the reason | |
25 | # (wrong library or version mismatch?) | |
26 | # and not: | |
27 | # difference appears to be caused by prelink, adjusting expectations | |
28 | # In such case both disk libraries will be loaded at VMAs starting at zero. | |
29 | ||
30 | if [skip_shlib_tests] { | |
31 | return 0 | |
32 | } | |
33 | ||
34 | # Are we on a target board? It is required for attaching to a process. | |
35 | if [is_remote target] { | |
36 | return 0 | |
37 | } | |
38 | ||
39 | if [get_compiler_info binfile-unused] { | |
40 | return -1; | |
41 | } | |
42 | ||
43 | # Library file. | |
44 | set libname "solib-overlap-lib" | |
45 | set srcfile_lib ${srcdir}/${subdir}/${libname}.c | |
46 | # Binary file. | |
47 | set testfile "solib-overlap-main" | |
48 | set srcfile ${srcdir}/${subdir}/${testfile}.c | |
49 | ||
50 | # Base addresses for `prelink -r' which should be compatible with both -m32 and | |
51 | # -m64 targets. If it clashes with system prelinked libraries it would give | |
52 | # false PASS. | |
53 | # Prelink first lib1 at 0x40000000 and lib2 at 0x41000000. | |
54 | # During second pass try lib1 at 0x50000000 and lib2 at 0x51000000. | |
55 | foreach prelink_lib1 {0x40000000 0x50000000} { | |
56 | set prelink_lib2 [format "0x%x" [expr $prelink_lib1 + 0x01000000]] | |
57 | ||
58 | set old_prefix $pf_prefix | |
59 | lappend pf_prefix "$prelink_lib1:" | |
60 | ||
61 | # Library file. | |
62 | set binfile_lib1 ${objdir}/${subdir}/${libname}1-${prelink_lib1}.so | |
a449c2d8 | 63 | set binfile_lib1_test_msg OBJDIR/${subdir}/${libname}1-${prelink_lib1}.so |
817aadd2 | 64 | set binfile_lib2 ${objdir}/${subdir}/${libname}2-${prelink_lib1}.so |
a449c2d8 | 65 | set binfile_lib2_test_msg OBJDIR/${subdir}/${libname}2-${prelink_lib1}.so |
817aadd2 JK |
66 | set lib_flags {debug} |
67 | # Binary file. | |
68 | set binfile_base ${testfile}-${prelink_lib1} | |
69 | set binfile ${objdir}/${subdir}/${binfile_base} | |
a449c2d8 | 70 | set binfile_test_msg OBJDIR/${subdir}/${binfile_base} |
817aadd2 JK |
71 | set bin_flags [list debug shlib=${binfile_lib1} shlib=${binfile_lib2}] |
72 | set escapedbinfile [string_to_regexp ${binfile}] | |
73 | ||
74 | if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != "" | |
75 | || [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != "" | |
76 | || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { | |
a449c2d8 | 77 | untested "Could not compile ${binfile_lib1_test_msg}, ${binfile_lib2_test_msg} or ${binfile_test_msg}." |
817aadd2 JK |
78 | return -1 |
79 | } | |
80 | ||
81 | if {[catch "system \"prelink -N -r ${prelink_lib1} ${binfile_lib1}\""] != 0 | |
82 | || [catch "system \"prelink -N -r ${prelink_lib2} ${binfile_lib2}\""] != 0} { | |
83 | # Maybe we don't have prelink. | |
a449c2d8 | 84 | untested "Could not prelink ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}." |
817aadd2 JK |
85 | return -1 |
86 | } | |
87 | ||
88 | # Start the program running and then wait for a bit, to be sure | |
89 | # that it can be attached to. | |
90 | ||
91 | set testpid [eval exec $binfile &] | |
92 | sleep 2 | |
93 | if { [istarget "*-*-cygwin*"] } { | |
94 | # testpid is the Cygwin PID, GDB uses the Windows PID, which might be | |
95 | # different due to the way fork/exec works. | |
96 | set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] | |
97 | } | |
98 | ||
99 | remote_exec build "mv -f ${binfile_lib1} ${binfile_lib1}-running" | |
100 | remote_exec build "mv -f ${binfile_lib2} ${binfile_lib2}-running" | |
101 | ||
102 | # Provide another exported function name to cause different sizes of sections. | |
103 | lappend lib_flags additional_flags=-DSYMB | |
104 | ||
105 | if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != "" | |
106 | || [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != ""} { | |
a449c2d8 | 107 | untested "Could not recompile ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}." |
817aadd2 JK |
108 | remote_exec build "kill -9 ${testpid}" |
109 | return -1 | |
110 | } | |
111 | ||
112 | clean_restart ${binfile_base} | |
113 | # This testcase currently does not support remote targets. | |
114 | # gdb_load_shlibs ${binfile_lib1} ${binfile_lib2} | |
115 | ||
116 | # Here we should get: | |
117 | # warning: .dynamic section for ".../solib-overlap-lib1.so" is not at the expected address (wrong library or version mismatch?) | |
118 | # warning: .dynamic section for ".../solib-overlap-lib2.so" is not at the expected address (wrong library or version mismatch?) | |
119 | ||
120 | set test attach | |
121 | gdb_test_multiple "attach $testpid" $test { | |
122 | -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" { | |
123 | pass $test | |
124 | } | |
125 | -re "Attaching to program.*`?$escapedbinfile\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" { | |
126 | # Response expected on Cygwin | |
127 | pass $test | |
128 | } | |
129 | } | |
130 | ||
131 | # Detach the process. | |
132 | ||
133 | gdb_test "detach" "Detaching from program: .*$escapedbinfile, process $testpid" | |
134 | ||
135 | # Wait a bit for gdb to finish detaching | |
136 | ||
137 | sleep 5 | |
138 | ||
139 | remote_exec build "kill -9 ${testpid}" | |
140 | ||
141 | set pf_prefix $old_prefix | |
142 | } |