#2013: ghci crash on startup: R_X86_64_32S relocation out of range.
---------------------+------------------------------------------------------
 Reporter:  mboes    |          Owner:                
     Type:  bug      |         Status:  new           
 Priority:  normal   |      Milestone:  6.8.3         
Component:  GHCi     |        Version:  6.9           
 Severity:  normal   |     Resolution:                
 Keywords:           |     Difficulty:  Unknown       
 Testcase:           |   Architecture:  x86_64 (amd64)
       Os:  FreeBSD  |  
---------------------+------------------------------------------------------
Changes (by mboes):

  * version:  6.8.1 => 6.9

Comment:

 The problem actually occurs before x86_64_high_symbol gets called. It
 occurs because in loadObj() oc->image gets mmapped elsewhere than in the
 low 2Gb to start with, causing do_Elf_Rela_relocations() to fail.
 Unfortunately I can't convince FreeBSD to mmap in the low 2Gb, even with a
 hint address.

 The patch above looks like a good step forward, because as I understand
 the R_X86_64_PC32S and friend ELF relocations disappear by virtue of using
 PIC code. Trouble is though that ocAllocateSymbolExtras() won't compile on
 FreeBSD due to the use of the mremap() linuxism. mremap() doesn't exist on
 FreeBSD. This would have to be replaced by a pair of munmap(); mmap()
 calls, along with passing in the fd of the file being loaded to
 ocAllocateSymbolExtras(). I tried the simpler approach of #undef USE_MMAP
 and hence using stgReallocBytes() to map in the object instead and space
 for the GOT entries, along with a call to mprotect() to set the region
 executable. This however yields limited success: base links in fine
 (what's more in the low 2Gb!) but I get a segfault shortly after that:
 {{{
 $ ./stage2/ghc-inplace +RTS -Di -RTS --interactive
 GHCi, version 6.9.20071215: http://www.haskell.org/ghc/  :? for help
 Loading package base ... linking ... done.
 Sp = 0x8029f4ef8   pc = 1      PUSH_G   0x802f7fff8
 Sp = 0x8029f4ef0   pc = 3      PUSH_G   0x802f859c8
 Sp = 0x8029f4ee8   pc = 5      PACK      2 words with itbl 0x802d48258
         Built Object 0x802a7d000 = CONSTR(0x802d48258(tag=1), 0x802f859c8,
 0x802f7fff8)
 Sp = 0x8029f4ef0   pc = 8      PUSH_L   0
 Sp = 0x8029f4ee8   pc = 10      PUSH_APPLY_P
 Sp = 0x8029f4ee0   pc = 11      PUSH_G   0x802f8a498
 Sp = 0x8029f4ed8   pc = 13      SLIDE     3 down by 1
 Sp = 0x8029f4ee0   pc = 16      ENTER

 ---------------------------------------------------------------
 Evaluating: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a7d000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x8026eb470)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x8026eb651
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x80292a6f1
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)



 ---------------------------------------------------------------
 Returning: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a7d000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x8026eb470)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x8026eb651
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x80292a6f1
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)


 Sp = 0x8029f4ef8   pc = 1      PUSH_G   0x802f7fff8
 Sp = 0x8029f4ef0   pc = 3      PUSH_G   0x802f85a40
 Sp = 0x8029f4ee8   pc = 5      PACK      2 words with itbl 0x802d48258
         Built Object 0x802a3c000 = CONSTR(0x802d48258(tag=1), 0x802f85a40,
 0x802f7fff8)
 Sp = 0x8029f4ef0   pc = 8      PUSH_L   0
 Sp = 0x8029f4ee8   pc = 10      PUSH_APPLY_P
 Sp = 0x8029f4ee0   pc = 11      PUSH_G   0x802f8a498
 Sp = 0x8029f4ed8   pc = 13      SLIDE     3 down by 1
 Sp = 0x8029f4ee0   pc = 16      ENTER

 ---------------------------------------------------------------
 Evaluating: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a3c000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x802693bb8)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x802693d99
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x802a3a641
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)



 ---------------------------------------------------------------
 Returning: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a3c000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x802693bb8)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x802693d99
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x802a3a641
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)


 Sp = 0x8029f4ef8   pc = 1      PUSH_G   0x802f7fff8
 Sp = 0x8029f4ef0   pc = 3      PUSH_G   0x802f85960
 Sp = 0x8029f4ee8   pc = 5      PACK      2 words with itbl 0x802d48258
         Built Object 0x802a40000 = CONSTR(0x802d48258(tag=1), 0x802f85960,
 0x802f7fff8)
 Sp = 0x8029f4ef0   pc = 8      PUSH_L   0
 Sp = 0x8029f4ee8   pc = 10      PUSH_APPLY_P
 Sp = 0x8029f4ee0   pc = 11      PUSH_G   0x802f8a498
 Sp = 0x8029f4ed8   pc = 13      SLIDE     3 down by 1
 Sp = 0x8029f4ee0   pc = 16      ENTER

 ---------------------------------------------------------------
 Evaluating: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a40000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x8026bdca0)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x8026bde81
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x802a3f2b1
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)



 ---------------------------------------------------------------
 Returning: Object 0x802f8a498 = FUN/2(0x802db3618)
 Sp = 0x8029f4ee8

 RET_SMALL (0x1374330)
    stk[34] (0x8029f4ef0) = 0x802a40000
 Object 0x8029f4ef8 = UPDATE_FRAME(0x1372400,0x8026bdca0)
 RET_SMALL (0x1372570)
 RET_SMALL (0x12af7a0)
    stk[29] (0x8029f4f18) = 0x8026bde81
 RET_SMALL (0x12af7a0)
    stk[27] (0x8029f4f28) = 0x802a3f2b1
 RET_SMALL (0x12af7a0)
    stk[25] (0x8029f4f38) = 0x80292a701
 RET_SMALL (0x12af7a0)
    stk[23] (0x8029f4f48) = 0x80292a711
 RET_SMALL (0x136a810)
 Object 0x8029f4f58 = CATCH_FRAME(0x136ac10,0x80292a722)
 RET_SMALL (0x12d1fe8)
    stk[17] (0x8029f4f78) = 0x80292a730
 RET_SMALL (0x136a6b8)
 Object 0x8029f4f88 = CATCH_FRAME(0x136ac10,0x80292a749)
 Object 0x8029f4fa0 = CATCH_FRAME(0x136ac10,0x80292a761)
 Object 0x8029f4fb8 = CATCH_FRAME(0x136ac10,0x80292a779)
 RET_SMALL (0x12c8dd8)
 Object 0x8029f4fd8 = CATCH_FRAME(0x136ac10,0x16f8f30)
 RET_SMALL (0x1370fe0)
 Object 0x8029f4ff8 = STOP_FRAME(0x1370a90)

 [1]    60850 segmentation fault  ./stage2/ghc-inplace --interactive +RTS
 -Di -RTS
 }}}

 Could this due to stgRealloc'ed region being still non-executable, despite
 the mprotect() call? Should I instead stick to mmap()'ing the object and
 work out some of avoiding mremap()?

 Many thanks,

 Mathieu

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2013#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to