[GHC] #10531: modules that can be linked successfully when compiled with optimizations, fail to link with: multiple definition of `__stginit_ZCMain'
GHC
ghc-devs at haskell.org
Mon Jun 15 17:37:19 UTC 2015
#10531: modules that can be linked successfully when compiled with optimizations,
fail to link with: multiple definition of `__stginit_ZCMain'
-------------------------------------+-------------------------------------
Reporter: imz | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.1
Keywords: | Operating System: Linux
Architecture: x86_64 | Type of failure: GHC rejects
(amd64) | valid program
Test Case: attached | Blocked By:
Blocking: | Related Tickets:
Differential Revisions: |
-------------------------------------+-------------------------------------
When compiling a set of 3 modules (in a certain order), linking of the
final executable fails because there conflicting symbols in some of the
`.o`.
When doing the compilation in the same order, but with optimizations, it
succeeds.
The simple test case:
A.hs:
{{{#!hs
module A where
main :: IO ()
main = putStrLn "A"
}}}
B.hs:
{{{#!hs
module B where
import A()
main :: IO ()
main = putStrLn "B"
}}}
C.hs:
{{{#!hs
import B()
main :: IO ()
main = putStrLn "hi"
}}}
When I compile it with in the order specified by the attached `./bug-
reproduce.sh` and `Makefile`, the following happens:
{{{
./bug-reproduce.sh
rm -fv a A.o A.hi
removed 'a'
removed 'A.o'
removed 'A.hi'
rm -fv b B.o B.hi
removed 'b'
removed 'B.o'
removed 'B.hi'
rm -fv c C.o C.hi
removed 'c'
removed 'C.o'
removed 'C.hi'
ghc -Wall A.hs -main-is A.main -o a
[1 of 1] Compiling A ( A.hs, A.o )
Linking a ...
ghc -Wall B.hs -main-is B.main -o b
[1 of 2] Compiling A ( A.hs, A.o ) [flags changed]
[2 of 2] Compiling B ( B.hs, B.o )
Linking b ...
ghc -Wall C.hs -o c
[2 of 3] Compiling B ( B.hs, B.o ) [flags changed]
[3 of 3] Compiling Main ( C.hs, C.o )
Linking c ...
removed 'A.o'
ghc -Wall A.hs -main-is A.main -o a
[1 of 1] Compiling A ( A.hs, A.o )
Linking a ...
ghc -Wall B.hs -main-is B.main -o b
[2 of 2] Compiling B ( B.hs, B.o ) [flags changed]
Linking b ...
./A.o: In function `siv_closure':
(.data+0x0): multiple definition of `__stginit_ZCMain'
B.o:(.data+0x0): first defined here
./A.o: In function `ZCMain_main_srt':
(.data+0x70): multiple definition of `ZCMain_main_closure'
B.o:(.data+0x70): first defined here
./A.o:(.text+0xb8): multiple definition of `ZCMain_main_info'
B.o:(.text+0xb8): first defined here
collect2: error: ld returned 1 exit status
make: *** [B.o] Error 1
}}}
But it succeeds if done as `./bug-reproduce.sh GHC_OPTS=-O1` (probably,
the optimizations remove the conflicting symbols):
{{{
./bug-reproduce.sh GHC_OPTS=-O1
rm -fv a A.o A.hi
removed 'a'
removed 'A.o'
removed 'A.hi'
rm -fv b B.o B.hi
removed 'b'
removed 'B.o'
removed 'B.hi'
rm -fv c C.o C.hi
removed 'c'
removed 'C.o'
removed 'C.hi'
ghc -Wall -O1 A.hs -main-is A.main -o a
[1 of 1] Compiling A ( A.hs, A.o )
Linking a ...
ghc -Wall -O1 B.hs -main-is B.main -o b
[1 of 2] Compiling A ( A.hs, A.o ) [flags changed]
[2 of 2] Compiling B ( B.hs, B.o )
Linking b ...
ghc -Wall -O1 C.hs -o c
[2 of 3] Compiling B ( B.hs, B.o ) [flags changed]
[3 of 3] Compiling Main ( C.hs, C.o )
Linking c ...
removed 'A.o'
ghc -Wall -O1 A.hs -main-is A.main -o a
[1 of 1] Compiling A ( A.hs, A.o )
Linking a ...
ghc -Wall -O1 B.hs -main-is B.main -o b
[1 of 2] Compiling A ( A.hs, A.o ) [flags changed]
[2 of 2] Compiling B ( B.hs, B.o ) [flags changed]
Linking b ...
ghc -Wall -O1 C.hs -o c
[2 of 3] Compiling B ( B.hs, B.o ) [flags changed]
Linking c ...
}}}
Couldn't the compiler detect and handle such cases?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10531>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list