Subject: bug#78824: [igc] segfault in temacs during build => charset-table

From: Jeff Walsh <[email-masked]>
Date: Wed, 18 Jun 2025 21:45:39 +1000

When building the latest of the IGC branch, commit:
887db2ff38ce82bb5f33aa128c76b578caba216d

I am getting a SEGFAULT during temacs execution.

running under a debugger, this occurs in root_find in igc.c
`if (r->d.start == start)` (r is null in this case)

walking the list of roots:
p
*global_igc->roots->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next

provides:
(igc_root_list) {
  next = NULL
  prev = 0x00000000006d5f00
  d = {
    gc = 0x0000000000726e00
    root = 0x00007fffe80012a8
    start = 0x00000000006142e0
    end = 0x0000000000622f20
    label = 0x0000000000233fb9 "charset-table"
    ambig = true
  }
}

(lldb) p start
(void *) 0x0000000000000000

(lldb) bt
* thread #1, name = 'temacs', stop reason = signal SIGSEGV: address not
mapped to object (fault address=0x20)
    frame #0: 0x000000000051c953 temacs`igc_xpalloc_lisp_objs_exact
[inlined] root_find(start=0x0000000000000000) at igc.c:3111:8
    frame #1: 0x000000000051c940 temacs`igc_xpalloc_lisp_objs_exact
[inlined] igc_destroy_root_with_start(start=0x0000000000000000) at
igc.c:3135:33
  * frame #2: 0x000000000051c940
temacs`igc_xpalloc_lisp_objs_exact(pa=(struct Lisp_Symbol *) $7 =
0x0000000000685300, nitems=0x0000000000628e18,
nitems_incr_min=<unavailable>, nitems_max=<unavailable>,
item_size=<unavailable>, label="lface-id-to-name") at igc.c:3520:3
    frame #3: 0x0000000000392fd1
temacs`Finternal_make_lisp_face(face=(struct Lisp_Symbol *) $13 =
0x000000000068d0c8, frame=<unavailable>) at xfaces.c:2993:8
    frame #4: 0x000000000048981a temacs`eval_sub(form=<unavailable>) at
eval.c:2703:15
    frame #5: 0x000000000048d980 temacs`Flet [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #6: 0x000000000048d961 temacs`Flet(args=(struct Lisp_Cons *) $16
= 0x00007fffe71676d8) at eval.c:1203:9
    frame #7: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #8: 0x000000000048ccf0 temacs`Fwhile [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #9: 0x000000000048ccd3 temacs`Fwhile [inlined]
prog_ignore(body=<unavailable>) at eval.c:466:3
    frame #10: 0x000000000048ccd3 temacs`Fwhile(args=<unavailable>) at
eval.c:1224:7
    frame #11: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #12: 0x000000000048d980 temacs`Flet [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #13: 0x000000000048d961 temacs`Flet(args=(struct Lisp_Cons *) $17
= 0x00007fffe7167768) at eval.c:1203:9
    frame #14: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #15: 0x0000000000489b60 temacs`Fif [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #16: 0x0000000000489b40 temacs`Fif(args=<unavailable>) at
eval.c:411:10
    frame #17: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #18: 0x0000000000489de1 temacs`funcall_lambda [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #19: 0x0000000000489dd0 temacs`funcall_lambda(fun=(struct
Lisp_Vector *) $19 = 0x00007fffe716fb80, nargs=39200, arg_vector=(struct
Lisp_Symbol *) $25 = 0x0000800000681830) at eval.c:3452:15
    frame #20: 0x000000000048ab14 temacs`apply_lambda(fun=(struct
Lisp_Vector *) $19 = 0x00007fffe716fb80, args=<unavailable>,
count=<unavailable>) at eval.c:3317:9
    frame #21: 0x0000000000489028 temacs`eval_sub(form=<unavailable>) at
eval.c:2789:9
    frame #22: 0x0000000000489de1 temacs`funcall_lambda [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #23: 0x0000000000489dd0 temacs`funcall_lambda(fun=(struct
Lisp_Vector *) $26 = 0x00007fffe7174d30, nargs=39200, arg_vector=(struct
Lisp_Symbol *) $28 = 0x00008000006819d0) at eval.c:3452:15
    frame #24: 0x000000000048ab14 temacs`apply_lambda(fun=(struct
Lisp_Vector *) $26 = 0x00007fffe7174d30, args=<unavailable>,
count=<unavailable>) at eval.c:3317:9
    frame #25: 0x0000000000489028 temacs`eval_sub(form=<unavailable>) at
eval.c:2789:9
    frame #26: 0x0000000000489de1 temacs`funcall_lambda [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #27: 0x0000000000489dd0 temacs`funcall_lambda(fun=(struct
Lisp_Vector *) $29 = 0x00007fffe7736e38, nargs=140737068522315,
arg_vector=(struct Lisp_Symbol *) $31 = 0x0000800000681b70) at
eval.c:3452:15
    frame #28: 0x000000000048ab14 temacs`apply_lambda(fun=(struct
Lisp_Vector *) $29 = 0x00007fffe7736e38, args=<unavailable>,
count=<unavailable>) at eval.c:3317:9
    frame #29: 0x0000000000489028 temacs`eval_sub(form=<unavailable>) at
eval.c:2789:9
    frame #30: 0x0000000000489b60 temacs`Fif [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #31: 0x0000000000489b40 temacs`Fif(args=<unavailable>) at
eval.c:411:10
    frame #32: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #33: 0x0000000000489de1 temacs`funcall_lambda [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #34: 0x0000000000489dd0 temacs`funcall_lambda(fun=(struct
Lisp_Vector *) $32 = 0x00007fffe6fac7e8, nargs=140737078856675,
arg_vector=(struct Lisp_Symbol *) $34 = 0x0000800000681df0) at
eval.c:3452:15
    frame #35: 0x000000000048ab14 temacs`apply_lambda(fun=(struct
Lisp_Vector *) $32 = 0x00007fffe6fac7e8, args=<unavailable>,
count=<unavailable>) at eval.c:3317:9
    frame #36: 0x0000000000489028 temacs`eval_sub(form=<unavailable>) at
eval.c:2789:9
    frame #37: 0x00000000004b76e6
temacs`readevalloop_eager_expand_eval(val=<unavailable>,
macroexpand=(struct Lisp_Symbol *) $36 = 0x0000800000681400) at
lread.c:2389:13
    frame #38: 0x00000000004bfa6e temacs`readevalloop(readcharfun=error:
error: error: Multiple internal symbols found for 'buffer'
id = {0x0000046a}, range = [0x00007ffff31feea8-0x00007ffff31feeb0),
name="buffer"
id = {0x00000427}, range = [0x00007ffff31fec00-0x00007ffff31fec08),
name="buffer"
id = {0x00000439}, range = [0x00007ffff31fece8-0x00007ffff31fecf0),
name="buffer"
id = {0x000004cd}, range = [0x00007ffff31ff420-0x00007ffff31ff428),
name="buffer"
id = {0x00000422}, range = [0x00007ffff31feba8-0x00007ffff31febb0),
name="buffer"
id = {0x00000432}, range = [0x00007ffff31feca8-0x00007ffff31fecb0),
name="buffer"
id = {0x000004bb}, range = [0x00007ffff31ff330-0x00007ffff31ff338),
name="buffer"
id = {0x000004bf}, range = [0x00007ffff31ff360-0x00007ffff31ff368),
name="buffer"
id = {0x0000041e}, range = [0x00007ffff31feb68-0x00007ffff31feb70),
name="buffer"
id = {0x000004c4}, range = [0x00007ffff31ff398-0x00007ffff31ff3a0),
name="buffer"
id = {0x00000417}, range = [0x00007ffff31feb00-0x00007ffff31feb08),
name="buffer"
id = {0x0000043e}, range = [0x00007ffff31fed40-0x00007ffff31fed48),
name="buffer"
id = {0x000004b7}, range = [0x00007ffff31ff2f8-0x00007ffff31ff300),
name="buffer"
id = {0x000004b3}, range = [0x00007ffff31ff298-0x00007ffff31ff2a0),
name="buffer"
id = {0x00000466}, range = [0x00007ffff31fee68-0x00007ffff31fee70),
name="buffer"
id = {0x0000046e}, range = [0x00007ffff31feee8-0x00007ffff31feef0),
name="buffer"
id = {0x0000042e}, range = [0x00007ffff31fec68-0x00007ffff31fec70),
name="buffer"
id = {0x00000445}, range = [0x00007ffff31feda8-0x00007ffff31fedb0),
name="buffer"
id = {0x000004e2}, range = [0x00007ffff31ff5a8-0x00007ffff31ff5b0),
name="buffer"
id = {0x000004dd}, range = [0x00007ffff31ff530-0x00007ffff31ff538),
name="buffer"
id = {0x000004e9}, range = [0x00007ffff31ff630-0x00007ffff31ff638),
name="buffer"
id = {0x0000048d}, range = [0x00007ffff31ff088-0x00007ffff31ff090),
name="buffer"
id = {0x000005ca}, range = [0x00007ffff31ffa70-0x00007ffff31ffa8e),
name="buffer"
id = {0x00000488}, range = [0x00007ffff31ff050-0x00007ffff31ff058),
name="buffer"
id = {0x000005c6}, range = [0x00007ffff31ffa60-0x00007ffff31ffa68),
name="buffer"
id = {0x000004ac}, range = [0x00007ffff31ff230-0x00007ffff31ff238),
name="buffer"
id = {0x00000484}, range = [0x00007ffff31ff020-0x00007ffff31ff028),
name="buffer"
id = {0x00000495}, range = [0x00007ffff31ff0e0-0x00007ffff31ff0e8),
name="buffer"
id = {0x000004d9}, range = [0x00007ffff31ff4c8-0x00007ffff31ff4d0),
name="buffer"
id = {0x0000047e}, range = [0x00007ffff31fef88-0x00007ffff31fef90),
name="buffer"
id = {0x000005c5}, range = [0x00007ffff31ffa58-0x00007ffff31ffa60),
name="buffer"
id = {0x0000049a}, range = [0x00007ffff31ff118-0x00007ffff31ff120),
name="buffer"
id = {0x000004d5}, range = [0x00007ffff31ff488-0x00007ffff31ff490),
name="buffer"
id = {0x000005c4}, range = [0x00007ffff31ffa48-0x00007ffff31ffa50),
name="buffer"
id = {0x00000473}, range = [0x00007ffff31fef40-0x00007ffff31fef48),
name="buffer"
id = {0x000004a2}, range = [0x00007ffff31ff170-0x00007ffff31ff178),
name="buffer"
id = {0x000004a6}, range = [0x00007ffff31ff1b8-0x00007ffff31ff1c0),
name="buffer", infile0=0x0000000000000000, sourcename=(struct Lisp_String
*) $39 = 0x00007fffe70d1d30, printflag=false, unibyte=(struct Lisp_Symbol
*) $7 = 0x0000000000685300, readfun=(struct Lisp_Symbol *) $7 =
0x0000000000685300, start=(struct Lisp_Symbol *) $7 = 0x0000000000685300,
end=<unavailable>) at lread.c:2571:15
    frame #39: 0x00000000004c0e6f temacs`Feval_buffer(buffer=<unavailable>,
printflag=(struct Lisp_Symbol *) $41 = 0x00007fffe7757238, filename=(struct
Lisp_Symbol *) $7 = 0x0000000000685300, unibyte=(struct Lisp_Symbol *) $7 =
0x0000000000685300, do_allow_print=<unavailable>) at lread.c:2651:3
    frame #40: 0x00000000004897d8 temacs`eval_sub(form=<unavailable>) at
eval.c:2714:15
    frame #41: 0x0000000000489b60 temacs`Fif [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #42: 0x0000000000489b40 temacs`Fif(args=<unavailable>) at
eval.c:411:10
    frame #43: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #44: 0x000000000048d980 temacs`Flet [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #45: 0x000000000048d961 temacs`Flet(args=(struct Lisp_Cons *) $43
= 0x00007fffe236d5b8) at eval.c:1203:9
    frame #46: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #47: 0x000000000048d980 temacs`Flet [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #48: 0x000000000048d961 temacs`Flet(args=(struct Lisp_Cons *) $44
= 0x00007fffe236d0d8) at eval.c:1203:9
    frame #49: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #50: 0x00000000004899f4 temacs`Funwind_protect(args=(struct
Lisp_Cons *) $45 = 0x00007fffe236d810) at eval.c:1491:9
    frame #51: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #52: 0x000000000048d980 temacs`Flet [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #53: 0x000000000048d961 temacs`Flet(args=(struct Lisp_Cons *) $46
= 0x00007fffe236cc50) at eval.c:1203:9
    frame #54: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #55: 0x0000000000489b60 temacs`Fif [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #56: 0x0000000000489b40 temacs`Fif(args=<unavailable>) at
eval.c:411:10
    frame #57: 0x0000000000489676 temacs`eval_sub(form=<unavailable>) at
eval.c:2651:30
    frame #58: 0x0000000000489de1 temacs`funcall_lambda [inlined]
Fprogn(body=<unavailable>) at eval.c:455:13
    frame #59: 0x0000000000489dd0 temacs`funcall_lambda(fun=<unavailable>,
nargs=<unavailable>, arg_vector=<unavailable>) at eval.c:3452:15
    frame #60: 0x000000000048a432 temacs`Ffuncall(nargs=<unavailable>,
args=(struct Lisp_Symbol *) $48 = 0x0000000000685840) at eval.c:3195:21
    frame #61: 0x00000000004c0a15 temacs`Fload(file=(struct Lisp_Symbol *)
$7 = 0x0000000000685300, noerror=<unavailable>, nomessage=(struct
Lisp_Symbol *) $7 = 0x0000000000685300, nosuffix=<unavailable>,
must_suffix=<unavailable>) at lread.c:1649:10
    frame #62: 0x00000000004897d8 temacs`eval_sub(form=<unavailable>) at
eval.c:2714:15
    frame #63: 0x00000000004bfc45 temacs`readevalloop(readcharfun=(struct
Lisp_Symbol *) $51 = 0x0000000000690708, infile0=0x00007fffffffd820,
sourcename=(struct Lisp_String *) $53 = 0x00007ffff1cb6930,
printflag=false, unibyte=(struct Lisp_Symbol *) $7 = 0x0000000000685300,
readfun=(struct Lisp_Symbol *) $7 = 0x0000000000685300, start=(struct
Lisp_Symbol *) $7 = 0x0000000000685300, end=<unavailable>) at
lread.c:2573:15
    frame #64: 0x00000000004c089c temacs`Fload(file=(struct Lisp_Cons *)
$54 = 0x00007fffe70d1a18, noerror=<unavailable>, nomessage=(struct
Lisp_Symbol *) $7 = 0x0000000000685300, nosuffix=<unavailable>,
must_suffix=<unavailable>) at lread.c:1761:9
    frame #65: 0x00000000004897d8 temacs`eval_sub(form=(struct Lisp_Cons *)
$55 = 0x00007ffff1cb6670) at eval.c:2714:15
    frame #66: 0x0000000000489a50 temacs`Feval(form=(struct Lisp_Cons *)
$55 = 0x00007ffff1cb6670, lexical=(struct Lisp_Symbol *) $57 =
0x0000000000685338) at eval.c:2551:10
    frame #67: 0x00000000003f7822 temacs`top_level_2 at keyboard.c:1196:21
    frame #68: 0x0000000000487293
temacs`internal_condition_case(bfun=(temacs`top_level_2 at
keyboard.c:1192:6), handlers=(struct Lisp_Symbol *) $60 =
0x00000000006853a8, hfun=(temacs`cmd_error at keyboard.c:982:1)) at
eval.c:1707:25
    frame #69: 0x00000000003f85b2 temacs`top_level_1(ignore=<unavailable>)
at keyboard.c:1208:5
    frame #70: 0x00000000004871bf temacs`internal_catch(tag=(struct
Lisp_Symbol *) $63 = 0x000000000069aaa8, func=(temacs`top_level_1 at
keyboard.c:1205:1), arg=(struct Lisp_Symbol *) $7 = 0x0000000000685300) at
eval.c:1387:25
    frame #71: 0x00000000003f7743 temacs`command_loop at keyboard.c:1157:2
    frame #72: 0x00000000003ff726 temacs`recursive_edit_1 at
keyboard.c:766:9
    frame #73: 0x00000000003ffad6 temacs`Frecursive_edit at keyboard.c:849:3
    frame #74: 0x00000000003f7077 temacs`main(argc=<unavailable>,
argv=<unavailable>) at emacs.c:2604:3
    frame #75: 0x00007ffff30115f5 libc.so.6`__libc_start_call_main + 117
    frame #76: 0x00007ffff30116a8 libc.so.6`__libc_start_main@@GLIBC_2.34 +
136
    frame #77: 0x00000000002befa5 temacs`_start + 37