[GHC] #14523: Confusing link error when specifying the same object repeatedly

GHC ghc-devs at haskell.org
Fri Nov 24 14:26:38 UTC 2017


#14523: Confusing link error when specifying the same object repeatedly
-------------------------------------+-------------------------------------
           Reporter:  NeilMitchell   |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Poor/confusing
  Unknown/Multiple                   |  error message
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Given {{{foo.hs}}} containing {{{main = print 1}}} and {{{foo.c}}}
 containing {{{void foo(){} }}}, if you run:

 {{{
 $ ghc foo.o foo.hs
 C:\Neil\temp\dupe-name>ghc foo.hs foo.o
 [1 of 1] Compiling Main             ( foo.hs, foo.o )
 Linking foo.exe ...
 foo.o:fake:(.data+0x0): multiple definition of `__stginit_Main'
 foo.o:fake:(.data+0x0): first defined here
 foo.o:fake:(.data+0x10): multiple definition of `Main_main_closure'
 foo.o:fake:(.data+0x10): first defined here
 foo.o:fake:(.text+0x18): multiple definition of `Main_main_info'
 foo.o:fake:(.text+0x18): first defined here
 foo.o:fake:(.data+0x30): multiple definition of `ZCMain_main_closure'
 foo.o:fake:(.data+0x30): first defined here
 foo.o:fake:(.text+0x88): multiple definition of `ZCMain_main_info'
 foo.o:fake:(.text+0x88): first defined here
 foo.o:fake:(.data+0x70): multiple definition of `Main_zdtrModule_closure'
 foo.o:fake:(.data+0x70): first defined here
 collect2.exe: error: ld returned 1 exit status
 `gcc.exe' failed in phase `Linker'. (Exit code: 1)
 }}}

 It seems GHC compiles both {{{foo.hs}}} and {{{foo.c}}} to {{{foo.o}}},
 and then links {{{foo.o}}} twice. Sometimes {{{foo.hs}}} writes last,
 sometimes {{{foo.c}}} so the error can change. I found the error quite
 confusing, until I realised what it was doing.

 One solution might be before linking {{{.o}}} files GHC does
 {{{canonicalizePath}}} on all the object files, and if any are duplicates,
 it raises a cleaner error. That check would also catch {{{ghc foo.hs bar.o
 bar.o}}} as well.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14523>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list