From 0dd7698fd13c74b2ddf73ba761bb14044404467f Mon Sep 17 00:00:00 2001 From: Richard Wheeler Date: Wed, 19 Feb 2025 15:58:18 -0500 Subject: [PATCH] native: fix missing symbols CaptureStackBackTrace and __debugbreak (#23765) --- vlib/v/gen/native/pe.v | 17 ++++++++++++++++- vlib/v/gen/native/readdll.c.v | 2 +- vlib/v/gen/native/tests/native_test.v | 10 ++++++++-- vlib/v/gen/native/tests/pe_test.v | 9 +++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 vlib/v/gen/native/tests/pe_test.v diff --git a/vlib/v/gen/native/pe.v b/vlib/v/gen/native/pe.v index f9bf31837b..f338a23a86 100644 --- a/vlib/v/gen/native/pe.v +++ b/vlib/v/gen/native/pe.v @@ -635,7 +635,7 @@ fn (mut g Gen) gen_pe_idata() { ] for symbol in g.extern_symbols { - sym := symbol.all_after('C.') + mut sym := symbol.all_after('C.') mut found := false for mut dll in dlls { if sym in dll.exports { @@ -645,6 +645,21 @@ fn (mut g Gen) gen_pe_idata() { } } + if !found { + if sym == 'CaptureStackBackTrace' { + sym = 'RtlCaptureStackBackTrace' + } else if sym == '__debugbreak' { + sym = 'DebugBreak' + } + for mut dll in dlls { + if sym in dll.exports { + found = true + dll.exports[sym] = true + break + } + } + } + if !found { eprintln('could not find symbol `${sym}` in ${dll_files}') } diff --git a/vlib/v/gen/native/readdll.c.v b/vlib/v/gen/native/readdll.c.v index e22e40a1d6..8901dcff59 100644 --- a/vlib/v/gen/native/readdll.c.v +++ b/vlib/v/gen/native/readdll.c.v @@ -49,7 +49,7 @@ fn (mut g Gen) lookup_system_dll(dll string) !SystemDll { } } } $else { - // TODO: look into librarys dirs + // TODO: look into library's dirs return SystemDll{ name: dll } diff --git a/vlib/v/gen/native/tests/native_test.v b/vlib/v/gen/native/tests/native_test.v index 92129a8c22..1ef71e1d4e 100644 --- a/vlib/v/gen/native/tests/native_test.v +++ b/vlib/v/gen/native/tests/native_test.v @@ -15,6 +15,7 @@ fn test_native() { eprintln('>> skipping testing on FreeBSD/OpenBSD for now') return } + mut bench := benchmark.new_benchmark() vexe := os.getenv('VEXE') vroot := os.dir(vexe) @@ -26,12 +27,14 @@ fn test_native() { defer { os.rmdir_all(wrkdir) or {} } + os.chdir(wrkdir) or {} tests := files.filter(it.ends_with('.vv')) if tests.len == 0 { println('no native tests found') assert false } + bench.set_total_expected_steps(tests.len) for test in tests { if test == 'libc.vv' { @@ -41,6 +44,7 @@ fn test_native() { continue } } + bench.step() full_test_path := os.real_path(os.join_path(dir, test)) test_file_name := os.file_name(test) @@ -64,7 +68,6 @@ fn test_native() { err := os.read_file(tmperrfile) or { panic(err) } eprintln(err) } - continue } @@ -95,6 +98,7 @@ fn test_native() { errstr := os.read_file(tmperrfile) or { panic('${err}: ${os.quoted_path(exe_test_path)} 2> ${os.quoted_path(tmperrfile)}') } + mut err_found := errstr.trim_right('\r\n').replace('\r\n', '\n') if err_expected != err_found { println(term.red('FAIL')) @@ -107,6 +111,7 @@ fn test_native() { continue } } + os.rm(tmperrfile) or {} expected = expected.trim_right('\r\n').replace('\r\n', '\n') mut found := res.output.trim_right('\r\n').replace('\r\n', '\n') @@ -123,7 +128,8 @@ fn test_native() { } bench.ok() eprintln(bench.step_message_ok('${relative_test_path:-45} , took ${compile_time_ms:4}ms to compile, ${runtime_ms:4}ms to run')) - } + } // for loop + bench.stop() eprintln(term.h_divider('-')) eprintln(bench.total_message('native')) diff --git a/vlib/v/gen/native/tests/pe_test.v b/vlib/v/gen/native/tests/pe_test.v new file mode 100644 index 0000000000..96183b08ca --- /dev/null +++ b/vlib/v/gen/native/tests/pe_test.v @@ -0,0 +1,9 @@ +module tests + +import os + +fn test_prevent_could_not_find_symbols_regression() { + res := os.execute('${os.quoted_path(@VEXE)} -b native examples/hello_world.v') + assert !res.output.contains('CaptureStackBackTrace'), 'Test failed system unable to find symbol: CaptureStackBackTrace' + assert !res.output.contains('__debugbreak'), 'Test failed system unable to find symbol: __debugbreak' +}