| # Copyright 2007-2015 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/>. */ |
| |
| # Test loading symbols from unrelocated C++ object files. |
| |
| standard_testfile .cc |
| append binfile .o |
| |
| if { [skip_cplus_tests] } { continue } |
| |
| if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {c++ debug}] != "" } { |
| untested cp-relocate.exp |
| return -1 |
| } |
| |
| proc get_func_address { func } { |
| global gdb_prompt hex |
| |
| set rfunc [string_to_regexp $func] |
| gdb_test_multiple "print ${func}" "get address of ${func}" { |
| -re "\\\$\[0-9\]+ = \\{.*\\} (($hex) <${rfunc}.*>)\[\r\n\]+${gdb_prompt} $" { |
| # $1 = {int ()} 0x24 <function_bar> |
| # But if the function is at zero, the name may be omitted. |
| pass "get address of ${func}" |
| if { $expect_out(1,string) == "0x0" } { |
| return "0x0" |
| } else { |
| return $expect_out(2,string) |
| } |
| } |
| } |
| return "" |
| } |
| |
| # Load the file as an executable; GDB should assign non-overlapping |
| # section offsets. |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_file_cmd ${binfile} |
| |
| # Find the interesting functions. We go to a little effort to find |
| # the right function names here, to work around PR c++/40. |
| set func1_name "" |
| set func2_name "" |
| gdb_test_multiple "info functions func<.>" "info functions" { |
| -re "\r\nint (\[^\r\]*func<1>\[^\r]*);" { |
| set func1_name $expect_out(1,string) |
| exp_continue |
| } |
| -re "\r\nint (\[^\r\]*func<2>\[^\r]*);" { |
| set func2_name $expect_out(1,string) |
| exp_continue |
| } |
| -re "$gdb_prompt $" { |
| if { ${func1_name} != "" && ${func2_name} != "" } { |
| pass "info functions" |
| } else { |
| fail "info functions" |
| return -1 |
| } |
| } |
| } |
| |
| # Check that all the functions have different addresses. |
| set func1_addr [get_func_address "$func1_name"] |
| set func2_addr [get_func_address "$func2_name"] |
| set caller_addr [get_func_address "caller"] |
| |
| if { "${func1_addr}" == "${func2_addr}" |
| || "${func1_addr}" == "${func2_addr}" |
| || "${func2_addr}" == "${caller_addr}" } { |
| fail "C++ functions have different addresses" |
| } else { |
| pass "C++ functions have different addresses" |
| } |
| |
| # Figure out the names of the sections containing the template |
| # functions. |
| set func1_sec "" |
| set func2_sec "" |
| gdb_test_multiple "info file" "info file" { |
| -re "($hex) - ($hex) is (\[^\r\]*)\r" { |
| if { $expect_out(1,string) <= $func1_addr |
| && $expect_out(2,string) > $func1_addr } { |
| set func1_sec $expect_out(3,string) |
| } elseif { $expect_out(1,string) <= $func2_addr |
| && $expect_out(2,string) > $func2_addr } { |
| set func2_sec $expect_out(3,string) |
| } |
| exp_continue |
| } |
| -re "$gdb_prompt $" { |
| if { ${func1_sec} != "" && ${func2_sec} != "" } { |
| pass "info file" |
| } else { |
| fail "info file" |
| return -1 |
| } |
| } |
| } |
| |
| if { $func1_sec == $func2_sec } { |
| untested "cp-relocate.exp - template functions in same sections" |
| return -1 |
| } |
| |
| # Now start a clean GDB, for add-symbol-file tests. |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| |
| gdb_test "add-symbol-file ${binfile} 0 -s ${func1_sec} 0x10000 -s ${func2_sec} 0x20000" \ |
| "Reading symbols from .*${testfile}\\.o\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \ |
| "add-symbol-file ${testfile}.o" \ |
| "add symbol table from file \".*${testfile}\\.o\" at.*\\(y or n\\) " \ |
| "y" |
| |
| # Make sure the function addresses were updated. |
| gdb_test "break *$func1_name" \ |
| "Breakpoint $decimal at 0x1....: file .*" |
| gdb_test "break *$func2_name" \ |
| "Breakpoint $decimal at 0x2....: file .*" |