diff --git a/_gdb.spec.Patch.include b/_gdb.spec.Patch.include index dca185a..a32e678 100644 --- a/_gdb.spec.Patch.include +++ b/_gdb.spec.Patch.include @@ -309,3 +309,7 @@ Patch073: gdb-rhbz1553104-s390x-arch12-test.patch Patch074: gdb-backport-readline_support.patch +# [gdb/testsuite] Use prototype to call libc functions +# (Tom de Vries) +Patch075: gdb-backport-fix-break-main-file-remove-fail.patch + diff --git a/_gdb.spec.patch.include b/_gdb.spec.patch.include index affe771..f5bd893 100644 --- a/_gdb.spec.patch.include +++ b/_gdb.spec.patch.include @@ -72,3 +72,4 @@ %patch072 -p1 %patch073 -p1 %patch074 -p1 +%patch075 -p1 diff --git a/_patch_order b/_patch_order index 356ca91..cb69eba 100644 --- a/_patch_order +++ b/_patch_order @@ -72,3 +72,4 @@ gdb-libexec-add-index.patch gdb-rhbz1398387-tab-crash-test.patch gdb-rhbz1553104-s390x-arch12-test.patch gdb-backport-readline_support.patch +gdb-backport-fix-break-main-file-remove-fail.patch diff --git a/gdb-backport-fix-break-main-file-remove-fail.patch b/gdb-backport-fix-break-main-file-remove-fail.patch new file mode 100644 index 0000000..970d8b2 --- /dev/null +++ b/gdb-backport-fix-break-main-file-remove-fail.patch @@ -0,0 +1,101 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Bruno Larsen +Date: Tue, 18 Oct 2022 11:10:41 +0200 +Subject: gdb-backport-fix-break-main-file-remove-fail.patch + +;; [gdb/testsuite] Use prototype to call libc functions +;; (Tom de Vries) + +On openSUSE Tumbleweed (using glibc 2.36), I run into: +... +(gdb) print /d (int) munmap (4198400, 4096)^M +Invalid cast.^M +(gdb) FAIL: gdb.base/break-main-file-remove-fail.exp: cmdline: \ + get integer valueof "(int) munmap (4198400, 4096)" +... + +The problem is that after starting the executable, the symbol has type +"void (*) (void)": +... +(gdb) p munmap +$1 = {} 0x401030 +(gdb) start + ... +(gdb) p munmap +$2 = {void (void)} 0x7ffff7feb9a0 <__GI_munmap> +... +which causes the "Invalid cast" error. + +Looking at the debug info for glibc for symbol __GI_munmap: +... + <0><189683>: Abbrev Number: 1 (DW_TAG_compile_unit) + <189691> DW_AT_name : ../sysdeps/unix/syscall-template.S + <189699> DW_AT_producer : GNU AS 2.39.0 +<1><1896ae>: Abbrev Number: 2 (DW_TAG_subprogram) + <1896af> DW_AT_name : __GI___munmap + <1896b3> DW_AT_external : 1 + <1896b4> DW_AT_low_pc : 0x10cad0 + <1896bc> DW_AT_high_pc : 37 +... +that's probably caused by this bit (or similar bits for other munmap aliases). + +This is fixed in gas on trunk by commit 5578fbf672e ("GAS: Add a return type +tag to DWARF DIEs generated for function symbols"). + +Work around this (for say gas 2.39) by explicitly specifying the prototype for +munmap. + +Likewise for getpid in a couple of other test-cases. + +Tested on x86_64-linux. + +diff --git a/gdb/testsuite/gdb.base/break-main-file-remove-fail.exp b/gdb/testsuite/gdb.base/break-main-file-remove-fail.exp +--- a/gdb/testsuite/gdb.base/break-main-file-remove-fail.exp ++++ b/gdb/testsuite/gdb.base/break-main-file-remove-fail.exp +@@ -87,7 +87,9 @@ proc test_remove_bp { initial_load } { + # should warn the user about it. + set pagesize [get_integer_valueof "pg_size" 0] + set align_addr [expr $bp_addr - $bp_addr % $pagesize] +- set munmap [get_integer_valueof "(int) munmap ($align_addr, $pagesize)" -1] ++ set munmap_prototype "int (*) (void *, size_t)" ++ set munmap_expr "(($munmap_prototype) munmap) ($align_addr, $pagesize)" ++ set munmap [get_integer_valueof $munmap_expr -1] + + if {$munmap != 0} { + unsupported "can't munmap foo's page" +diff --git a/gdb/testsuite/gdb.base/dprintf-detach.exp b/gdb/testsuite/gdb.base/dprintf-detach.exp +--- a/gdb/testsuite/gdb.base/dprintf-detach.exp ++++ b/gdb/testsuite/gdb.base/dprintf-detach.exp +@@ -52,7 +52,7 @@ proc dprintf_detach_test { breakpoint_always_inserted dprintf_style disconnected + # Get PID of test program. + set inferior_pid -1 + set test "get inferior process ID" +- gdb_test_multiple "call (int) getpid ()" $test { ++ gdb_test_multiple "call ((int (*) (void)) getpid) ()" $test { + -re ".* = ($decimal).*$gdb_prompt $" { + set inferior_pid $expect_out(1,string) + pass $test +diff --git a/gdb/testsuite/gdb.base/info-os.exp b/gdb/testsuite/gdb.base/info-os.exp +--- a/gdb/testsuite/gdb.base/info-os.exp ++++ b/gdb/testsuite/gdb.base/info-os.exp +@@ -39,7 +39,7 @@ if ![runto_main] then { + # Get PID of test program. + set inferior_pid "" + set test "get inferior process ID" +-gdb_test_multiple "call (int) getpid()" $test { ++gdb_test_multiple "call ((int (*) (void)) getpid) ()" $test { + -re ".* = ($decimal).*$gdb_prompt $" { + set inferior_pid $expect_out(1,string) + pass $test +diff --git a/gdb/testsuite/gdb.threads/siginfo-threads.exp b/gdb/testsuite/gdb.threads/siginfo-threads.exp +--- a/gdb/testsuite/gdb.threads/siginfo-threads.exp ++++ b/gdb/testsuite/gdb.threads/siginfo-threads.exp +@@ -41,7 +41,7 @@ gdb_breakpoint [gdb_get_line_number "break-at-exit"] + + set test "get pid" + set pid "" +-gdb_test_multiple "p (int) getpid ()" $test { ++gdb_test_multiple "p ((int (*) (void))getpid) ()" $test { + -re " = (\[0-9\]+)\r\n$gdb_prompt $" { + set pid $expect_out(1,string) + pass $test diff --git a/gdb.spec b/gdb.spec index 13ee14c..093d672 100644 --- a/gdb.spec +++ b/gdb.spec @@ -51,7 +51,7 @@ Version: 12.1 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 7%{?dist} +Release: 8%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL # Do not provide URL for snapshots as the file lasts there only for 2 days. @@ -1189,7 +1189,11 @@ fi %endif %changelog -* Wed Oct 18 2022 Bruno Larsen - 12.1-7 +* Tue Oct 18 2022 Bruno Larsen - 12.1-8 +- Backport fix to gdb.base/break-main-file-remove-fail.exp + (Tom de Vries) + +* Tue Oct 18 2022 Bruno Larsen - 12.1-7 - Remove patch gdb-6.3-test-dtorfix. Was upstreamed, will be back in the next rebase.