#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