| # Copyright 1998-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/>. |
| |
| # Test just for the 'maintenance info sections' command and the |
| # 'maintenance info target-sections' command. |
| |
| load_lib completion-support.exp |
| |
| standard_testfile break.c break1.c |
| |
| if {[prepare_for_testing "failed to prepare" $testfile \ |
| [list $srcfile $srcfile2] {debug nowarnings}]} { |
| return -1 |
| } |
| |
| if ![runto_main] then { |
| return -1 |
| } |
| |
| # Check the output of 'maint info target-sections' command. |
| proc check_maint_info_target_sections_output {prefix} { |
| global hex gdb_prompt |
| |
| with_test_prefix $prefix { |
| # Check the output of the 'maint info target-sections' command. |
| # Ensures that all the lines have the expected format, and that we see |
| # an auxiliary information line after every section information line. |
| # |
| # We also check that every bfd section has the ALLOC flag. |
| set seen_header false |
| set seen_a_section false |
| set seen_aux_info false |
| set expecting_aux_info false |
| gdb_test_multiple "maint info target-sections" "" { |
| -re "^maint info target-sections\r\n" { |
| # Consume the command we sent to GDB that the terminal echo'd |
| # back. |
| exp_continue |
| } |
| -re "^From '\[^\r\n\]+', file type \[^\r\n\]+:\r\n" { |
| # There might be more than one header, but there should be at |
| # least one. |
| set seen_header true |
| if { $expecting_aux_info } { |
| fail $gdb_test_name |
| } else { |
| exp_continue |
| } |
| } |
| -re "^ \\\[\[0-9\]+\\\]\\s+$hex->$hex at $hex: \[^*\r\]+\\yALLOC\\y\[^*\r\]*\r\n" { |
| # A bfd section description line. |
| set seen_a_section true |
| if { $expecting_aux_info } { |
| fail $gdb_test_name |
| } else { |
| set expecting_aux_info true |
| exp_continue |
| } |
| } |
| -re "^\\s+Start: $hex, End: $hex, Owner token: $hex\r\n" { |
| # A target section auxiliary information line. |
| set seen_aux_info true |
| if { !$expecting_aux_info } { |
| fail $gdb_test_name |
| } else { |
| set expecting_aux_info false |
| exp_continue |
| } |
| } |
| -re "^$gdb_prompt $" { |
| gdb_assert { $seen_header && $seen_a_section && $seen_aux_info } |
| gdb_assert { !$expecting_aux_info } |
| pass $gdb_test_name |
| } |
| } |
| } |
| } |
| |
| # Check that 'maint info sections' output looks correct. When |
| # checking the lines for each section we reject section names starting |
| # with a '*' character, the internal *COM*, *UND*, *ABS*, and *IND* |
| # sections should not be displayed in this output. |
| set seen_header false |
| set seen_a_section false |
| gdb_test_multiple "maint info sections" "general output check" { |
| -re "Exec file: `\[^'\]+', file type \[^.\]+\.\r\n" { |
| set seen_header true |
| exp_continue |
| } |
| -re "^ \\\[\[0-9\]+\\\]\[\t \]+$hex->$hex at $hex: \[^*\r\]+\r\n" { |
| set seen_a_section true |
| exp_continue |
| } |
| -re "^$gdb_prompt $" { |
| gdb_assert { $seen_header && $seen_a_section } |
| pass $gdb_test_name |
| } |
| } |
| |
| # It'd be nice to check for every possible section. However, that's |
| # problematic, since the relative ordering wanders from release to |
| # release of the compilers. Instead, we'll just check for two |
| # sections which appear to always come out in the same relative |
| # order. (If that changes, then we should just check for one |
| # section.) |
| # |
| # And by the way: This testpoint will break for PA64, where a.out's |
| # are ELF files. |
| |
| # Standard GNU names. |
| set text_section ".text" |
| set data_section ".data" |
| |
| gdb_test_multiple "maint info sections" "" { |
| -re -wrap "Exec file: .*${binfile}., file type.*ER_RO.*" { |
| # Looks like RealView which uses different section names. |
| set text_section ER_RO |
| set data_section ER_RW |
| pass "maint info sections" |
| } |
| -re -wrap "Exec file: .*${binfile}., file type.*neardata.*" { |
| # c6x doesn't have .data section. It has .neardata and .fardata section. |
| set data_section ".neardata" |
| pass "maint info sections" |
| } |
| -re -wrap "Exec file: .*${binfile}., file type.*" { |
| pass "maint info sections" |
| } |
| } |
| |
| # Test for new option: maint info sections <section name> |
| # If you don't have a .text section, this will require tweaking. |
| |
| gdb_test_multiple "maint info sections $text_section" "" { |
| -re -wrap " \\.bss .*" { |
| fail $gdb_test_name |
| } |
| -re -wrap " $data_section .*" { |
| fail $gdb_test_name |
| } |
| -re -wrap " $text_section .*" { |
| pass $gdb_test_name |
| } |
| } |
| |
| # Test for new option: CODE section flag |
| # If your data section is tagged CODE, xfail this test. |
| |
| gdb_test_multiple "maint info sections CODE" "" { |
| -re -wrap " $data_section .*" { |
| fail $gdb_test_name |
| } |
| -re -wrap " $text_section .*" { |
| pass $gdb_test_name |
| } |
| } |
| |
| # Test for new option: DATA section flag |
| # If your text section is tagged DATA, xfail this test. |
| # |
| # The "maint info sections DATA" test is marked for XFAIL on Windows, |
| # because Windows has text sections marked DATA. |
| setup_xfail "*-*-*cygwin*" |
| setup_xfail "*-*-*mingw*" |
| |
| gdb_test_multiple "maint info sections DATA" "" { |
| -re -wrap " $text_section .*" { |
| fail $gdb_test_name |
| } |
| -re -wrap " $data_section .*" { |
| pass $gdb_test_name |
| } |
| -re -wrap " .rodata .*" { |
| pass $gdb_test_name |
| } |
| } |
| |
| check_maint_info_target_sections_output "with executable" |
| |
| # Restart GDB, but don't load the executable. |
| clean_restart |
| |
| # Now load the executable in as a symbol file. |
| gdb_test "add-symbol-file ${binfile}" ".*" \ |
| "load the executable as a symbol file" \ |
| "add symbol table from file \"${binfile}\"\r\n\\(y or n\\) " \ |
| "y" |
| |
| # As we have no object file 'maint info sections' will print nothing. |
| gdb_test_no_output "maint info sections" \ |
| "no output when no executable is set" |
| |
| # Check that the executable shows up as an object file when |
| # -all-objects is used. |
| set seen_header false |
| set seen_a_section false |
| gdb_test_multiple "maint info sections -all-objects" "" { |
| -re "Object file: `${binfile}', file type \[^.\]+\.\r\n" { |
| set seen_header true |
| exp_continue |
| } |
| -re "^ \\\[\[0-9\]+\\\]\[\t \]+$hex->$hex at $hex: \[^*\r\]+\r\n" { |
| set seen_a_section true |
| exp_continue |
| } |
| -re "^$gdb_prompt $" { |
| gdb_assert { $seen_header && $seen_a_section } \ |
| "ensure header and section seen in -all-objects case" |
| pass $gdb_test_name |
| } |
| } |
| |
| check_maint_info_target_sections_output "with loaded symbol file" |
| |
| # Test the command line completion on 'maint info sections'. First |
| # the command line flag. |
| test_gdb_complete_unique \ |
| "maintenance info sections -" \ |
| "maintenance info sections -all-objects" |
| |
| # Now check the section flags complete. |
| test_gdb_complete_multiple "maintenance info sections " "" "" { |
| "ALLOC" |
| "CODE" |
| "COFF_SHARED_LIBRARY" |
| "CONSTRUCTOR" |
| "DATA" |
| "HAS_CONTENTS" |
| "IS_COMMON" |
| "LOAD" |
| "NEVER_LOAD" |
| "READONLY" |
| "RELOC" |
| "ROM" |
| } |