A wrote a book on how debuggers work!
It guides you through writing a complete native debugger from scratch.
Available Spring 2025 from @nostarch (probably not with this cover)
Here’s my #mbsync #GCC workaround for #Fedora:
commit ebf6bcea7ebdba15553692777d292e59ec1d5e2e (HEAD -> master)
Author: Jarkko Sakkinen <jarkko@kernel.org>
Date: Thu Aug 1 21:36:37 2024 +0300
work around a GCC-14 optimizer issue
mbsync throws SIGSEGV in sync_opened(). As it turns out for some
reason the second entry in the local array 'boxes' is optimized
out:
(gdb) print boxes
$1 = {0x5555556c4540, <optimized out>}
Fix this by pinning the variable using a dummy inline assembly
statement:
__asm__ __volatile__("" :: "m" (boxes));
This sets an invariant, which should guarantee that the compiler
leaves 'boxes' untouched.
As a comparative measure mbsync was compiled also with clang without the
fix, and the resulting ELF binary does not have this issue.
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2302132
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
diff --git a/src/main_sync.c b/src/main_sync.c
index 226e324..afb23ca 100644
--- a/src/main_sync.c
+++ b/src/main_sync.c
@@ -623,6 +623,7 @@ sync_opened( main_vars_t *mvars, int t )
if (!mvars->chanptr->boxlist && mvars->chan->patterns) {
mvars->chanptr->boxlist = 2;
char **boxes[2];
+ __asm__ __volatile__("" :: "m" (boxes));
boxes[F] = filter_boxes( mvars->boxes[F], mvars->chan->boxes[F], mvars->chan->patterns );
boxes[N] = filter_boxes( mvars->boxes[N], mvars->chan->boxes[N], mvars->chan->patterns );
box_ent_t **mboxapp = &mvars->chanptr->boxes;
Also attached to https://bugzilla.redhat.com/show_bug.cgi?id=2302132