Add diagnostic explaining STATUS_STACK_BUFFER_OVERRUN not only being
used for stack buffer overruns if link.exe exits with that exit code `STATUS_STACK_BUFFER_OVERRUN` is also used for fast abnormal program termination, e.g. by abort(). Emit a special diagnostic to let people know that this most likely doesn't indicate a stack buffer overrun.
This commit is contained in:
@@ -178,6 +178,9 @@ codegen_ssa_ld64_unimplemented_modifier = `as-needed` modifier not implemented y
|
|||||||
|
|
||||||
codegen_ssa_lib_def_write_failure = failed to write lib.def file: {$error}
|
codegen_ssa_lib_def_write_failure = failed to write lib.def file: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_link_exe_status_stack_buffer_overrun = 0xc0000409 is `STATUS_STACK_BUFFER_OVERRUN`
|
||||||
|
.note = this may have been caused by a program abort and not a stack buffer overrun
|
||||||
|
|
||||||
codegen_ssa_link_exe_unexpected_error = `link.exe` returned an unexpected error
|
codegen_ssa_link_exe_unexpected_error = `link.exe` returned an unexpected error
|
||||||
|
|
||||||
codegen_ssa_link_script_unavailable = can only use link script when linking with GNU-like linker
|
codegen_ssa_link_script_unavailable = can only use link script when linking with GNU-like linker
|
||||||
|
|||||||
@@ -880,6 +880,14 @@ fn link_natively(
|
|||||||
windows_registry::find_tool(&sess.target.arch, "link.exe").is_some();
|
windows_registry::find_tool(&sess.target.arch, "link.exe").is_some();
|
||||||
|
|
||||||
sess.dcx().emit_note(errors::LinkExeUnexpectedError);
|
sess.dcx().emit_note(errors::LinkExeUnexpectedError);
|
||||||
|
|
||||||
|
// STATUS_STACK_BUFFER_OVERRUN is also used for fast abnormal program termination, e.g. abort().
|
||||||
|
// Emit a special diagnostic to let people know that this most likely doesn't indicate a stack buffer overrun.
|
||||||
|
const STATUS_STACK_BUFFER_OVERRUN: i32 = 0xc0000409u32 as _;
|
||||||
|
if code == STATUS_STACK_BUFFER_OVERRUN {
|
||||||
|
sess.dcx().emit_note(errors::LinkExeStatusStackBufferOverrun);
|
||||||
|
}
|
||||||
|
|
||||||
if is_vs_installed && has_linker {
|
if is_vs_installed && has_linker {
|
||||||
// the linker is broken
|
// the linker is broken
|
||||||
sess.dcx().emit_note(errors::RepairVSBuildTools);
|
sess.dcx().emit_note(errors::RepairVSBuildTools);
|
||||||
|
|||||||
@@ -550,6 +550,11 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for LinkingFailed<'_> {
|
|||||||
#[diag(codegen_ssa_link_exe_unexpected_error)]
|
#[diag(codegen_ssa_link_exe_unexpected_error)]
|
||||||
pub(crate) struct LinkExeUnexpectedError;
|
pub(crate) struct LinkExeUnexpectedError;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_link_exe_status_stack_buffer_overrun)]
|
||||||
|
#[note]
|
||||||
|
pub(crate) struct LinkExeStatusStackBufferOverrun;
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(codegen_ssa_repair_vs_build_tools)]
|
#[diag(codegen_ssa_repair_vs_build_tools)]
|
||||||
pub(crate) struct RepairVSBuildTools;
|
pub(crate) struct RepairVSBuildTools;
|
||||||
|
|||||||
Reference in New Issue
Block a user