Coredump før main()
Det verste med en coredump før main() er at du ikke engang har fått kjøre en eneste linje av din egen kode. Programmet er dødt før det har begynt.
Jeg fikk en slik i fanget som takk for å ha gjort byggesystemet raskere.

Makefiler fra en annen tid
Utgangspunktet var et byggesystem av hjemmesnekrede makefiler. Omtrent én person i selskapet forsto dem, og de klarte aldri å bruke mer enn fire kjerner, uansett hvor mange maskinen hadde. Resten satt og så på.
Så jeg skrev det om til CMake og Ninja. Det gikk overraskende greit, og plutselig ble 64 kjerner faktisk brukt. Et fullt bygg gikk fra en time eller mer til rundt femten minutter.
Fremdeles unødvendig tregt, for å være ærlig. All vår egen kode linket statisk, alt linket til alt, og på toppen av det hele tronet et C++-arvehierarki av det vannvittige slaget. Linkeren hadde mer enn nok å henge fingrene i. Men fire ganger raskere er fire ganger raskere. Folk var fornøyde. Jeg var fornøyd.
Helt til noen forsøkte å starte den ene, viktige prosessen som fremdeles brukte Motif.
Død før start
Ingen nullpeker, ingen feil i oppstartskoden. Krasjet skjedde i initialiseringen som kjører før main(), der de fleste av oss aldri har grunn til å se.
Og koden var den samme. Kompilatoren var den samme. Bibliotekene var de samme. Det eneste som var endret, var byggesystemet.
Det ble mye om og men. Feil bibliotekversjon? Manglende flagg? Noe rart med rpath? Nei, nei og nei.
Det var rekkefølgen.
To ord som byttet plass
Prosessen linket mot både Motif (-lXm) og X Toolkit (-lXt). De gamle makefilene hadde dem i én bestemt rekkefølge. I CMake-oppsettet hadde jeg pent og pyntelig listet bibliotekene alfabetisk, og dermed byttet de plass.
Det skal man altså ikke gjøre.
Motif er bygget oppå Xt, og de to er tettere vevd sammen enn man skulle ønske. Xm bruker globale strukturer fra Xt, og enkelte av dem finnes i begge bibliotekene. Hvilken versjon programmet faktisk får, avgjøres av hvem som kommer først i rekken når symbolene slås opp. Kommer de i feil rekkefølge, får Motif noe annet enn det forventer, og alt blir bare surr. Lenge før main().
Det lumske er at linkeren ikke sier et pip. Alle symboler finnes, ingenting er uløst, bygget er grønt. Det smeller først når programmet starter, eller, rett før det skulle ha startet.
Og for ordens skyld: Motif-FAQ-en anbefaler visstnok -lXm -lXt, altså nettopp den rekkefølgen som knakk alt sammen. Hvorfor vår kombinasjon av biblioteker, versjoner og plattform ville ha det motsatt, fant jeg aldri ut. Det spilte heller ingen rolle. Det som virket, var det som sto i makefilen.
Det var ikke bug-en som var poenget
Fiksen var å bytte om to ord. Det interessante er hvorfor de gamle makefilene virket.
Det var ikke fordi noen hadde dokumentert det. Det var ikke fordi det sto i en spesifikasjon. Det var fordi noen, en gang for lenge siden, hadde prøvd seg frem til en rekkefølge som virket og skrevet den inn. Uten kommentar. Den linjen i makefilen var en bærende vegg som ingen visste var bærende, og jeg rev den under oppussingen.
Et byggesystem er ikke bare en oppskrift for å kompilere filer. Det er et arkiv over år med avhengigheter, rekkefølger og workarounds som ingen husker hvorfor er der. Noe av det er der av gode grunner. Noe er ren overtro. Du vet ikke hva som er hva før du fjerner det.
Så neste gang du ser en rar linje i en makefil og får lyst til å rydde: Spør deg om noen kanskje brukte en uke på å finne ut at den måtte være akkurat sånn.
Og skriv en kommentar når det er du som har brukt den uken.