Detailed information on abort using macro and new __abort function

This commit is contained in:
Jeremy Soller
2023-03-09 20:19:27 -07:00
parent 04d2f296a9
commit 47bd55451f
5 changed files with 35 additions and 11 deletions
+2
View File
@@ -1,6 +1,8 @@
#ifndef _BITS_STDLIB_H
#define _BITS_STDLIB_H
# define abort() __abort(__func__, __FILE__, __LINE__)
#ifdef __cplusplus
extern "C" {
#endif
+5 -3
View File
@@ -1,10 +1,12 @@
#include <stdint.h>
void abort();
uintptr_t __stack_chk_guard = 0xd048c37519fcadfe;
// manually define detailed abort function
void __abort(const char *func, const char *file, int line);
__attribute__((noreturn))
void __stack_chk_fail(void) {
abort();
// call detailed abort function
__abort(__func__, __FILE__, __LINE__);
}
+9
View File
@@ -3,3 +3,12 @@ double strtod(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr) {
return (long double)strtod(nptr, endptr);
}
// manually define detailed abort function
void __abort(const char *func, const char *file, int line);
// backup definition of abort for programs that link it directly
void abort() {
// call detailed abort function
__abort(__func__, __FILE__, __LINE__);
}
+4 -6
View File
@@ -5,7 +5,6 @@ use crate::{
header::{stdio, stdlib},
platform::types::*,
};
use core::fmt::Write;
#[no_mangle]
pub unsafe extern "C" fn __assert_fail(
@@ -18,14 +17,13 @@ pub unsafe extern "C" fn __assert_fail(
let file = CStr::from_ptr(file).to_str().unwrap();
let cond = CStr::from_ptr(cond).to_str().unwrap();
writeln!(
*stdio::stderr,
eprintln!(
"{}: {}:{}: Assertion `{}` failed.",
func,
file,
line,
cond
)
.unwrap();
stdlib::abort();
);
core::intrinsics::abort();
}
+15 -2
View File
@@ -90,8 +90,21 @@ pub unsafe extern "C" fn a64l(s: *const c_char) -> c_long {
}
#[no_mangle]
pub unsafe extern "C" fn abort() {
eprintln!("abort() called");
pub unsafe extern "C" fn __abort(
func: *const c_char,
file: *const c_char,
line: c_int,
) {
let func = CStr::from_ptr(func).to_str().unwrap();
let file = CStr::from_ptr(file).to_str().unwrap();
eprintln!(
"{}: {}:{}: Abort",
func,
file,
line
);
intrinsics::abort();
}