Skip to content

GHCi segfaults with the flag -llibopenal, but not with -lopenal

I noticed this bug when I installed the OpenAL library from Hackage, ran it in GHCi 8.0.2, and segfaulted. Note that I've also reproduced the same error in GHC HEAD.

To reproduce this bug, you'll need MSYS2. First install OpenAL:

pacman -S mingw-w64-$(uname -m)-openal

With this Haskell file:

module Main (main) where

import Foreign.C.Types

foreign import ccall unsafe "alGetError"
   alGetError :: IO CInt

main :: IO ()
main = alGetError >>= print

You can compile and run it without issue, using either the flag -llibopenal or -lopenal to link against OpenAL:

$ ghc-8.0.2/bin/ghc -fforce-recomp -llibopenal OpenAL.hs
[1 of 1] Compiling Main             ( OpenAL.hs, OpenAL.o )
Linking OpenAL.exe ...

$ ./OpenAL
40964

$ ghc-8.0.2/bin/ghc -fforce-recomp -lopenal OpenAL.hs

$ ./OpenAL
40964

$ ghc/inplace/bin/ghc-stage2 -fforce-recomp -llibopenal OpenAL.hs
[1 of 1] Compiling Main             ( OpenAL.hs, OpenAL.o )
Linking OpenAL.exe ...

$ ./OpenAL
40964

$ ghc/inplace/bin/ghc-stage2 -fforce-recomp -lopenal OpenAL.hs
[1 of 1] Compiling Main             ( OpenAL.hs, OpenAL.o )
Linking OpenAL.exe ...

$ ./OpenAL
40964

With GHCi, however, it gets funkier. If you pass the -lopenal flag, it seems to work OK:

$ ghc-8.0.2/bin/runghc -lopenal OpenAL.hs
40964

$ ghc/inplace/bin/runghc -lopenal OpenAL.hs
40964

But if you use the -llibopenal flag, it segfaults!

$ runghc -llibopenal -v3 OpenAL.hs
Glasgow Haskell Compiler, Version 8.0.2, stage 2 booted by GHC version 8.0.1
Using binary package database: C:\Users\RyanGlScott\Software\ghc-8.0.2\lib\package.conf.d\package.cache
Using binary package database: C:\Users\RyanGlScott\AppData\Roaming\ghc\x86_64-mingw32-8.0.2\package.conf.d\package.cache
loading package database C:\Users\RyanGlScott\Software\ghc-8.0.2\lib\package.conf.d
loading package database C:\Users\RyanGlScott\AppData\Roaming\ghc\x86_64-mingw32-8.0.2\package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
wired-in package base mapped to base-4.9.1.0
wired-in package rts mapped to rts
wired-in package template-haskell mapped to template-haskell-2.11.1.0
wired-in package ghc mapped to ghc-8.0.2
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags:
*** Parser [source]:
!!! Parser [source]: finished in 0.00 milliseconds, allocated 0.212 megabytes
*** Desugar:
*** Simplify [expr]:
!!! Simplify [expr]: finished in 0.00 milliseconds, allocated 0.133 megabytes
*** CorePrep [expr]:
!!! CorePrep [expr]: finished in 0.00 milliseconds, allocated 2.731 megabytes
*** ByteCodeGen [Ghci1]:
!!! ByteCodeGen [Ghci1]: finished in 0.00 milliseconds, allocated 0.182 megabytes
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "mingw32.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingw32.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingw32.dll.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "mingw32.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingw32.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingw32.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "mingwex.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingwex.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingwex.dll.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "mingwex.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingwex.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\ghc-prim-0.5.0.0" "--print-file-name" "libmingwex.a"
Loading package ghc-prim-0.5.0.0 ... linking ... done.
Loading package integer-gmp-1.0.0.1 ... linking ... done.
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "mingw32.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingw32.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingw32.dll.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "mingw32.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingw32.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingw32.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "mingwex.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingwex.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingwex.dll.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "mingwex.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingwex.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-BC:\Users\RyanGlScott\Software\ghc-8.0.2\lib\base-4.9.1.0" "--print-file-name" "libmingwex.a"
Loading package base-4.9.1.0 ... linking ... done.
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "libopenal.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "liblibopenal.lib"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "liblibopenal.dll.a"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "libopenal.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "liblibopenal.dll"
*** gcc:
"C:\Users\RyanGlScott\Software\ghc-8.0.2\lib/../mingw/bin/gcc.exe" "-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "--print-file-name" "liblibopenal.a"
Loading object (dynamic) libopenal ... ghc.exe: addDLL: libopenal (Win32 error 126): The specified module could not be found.

At that point, GHC segfaults and force-quits (if you run this on PowerShell, a "ghc.exe has stopped working" message box will pop up).

I don't know if #12771 (closed) is relevant. You can't test this on GHC 8.0.1 or earlier because they didn't have support for Windows import libs, which OpenAL uses.

Trac metadata
Trac field Value
Version 8.0.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Runtime System (Linker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC Phyx-
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information