summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorgwright@antiope.com <unknown>2011-02-14 15:09:24 +0000
committergwright@antiope.com <unknown>2011-02-14 15:09:24 +0000
commit796a3b3637f61ae04d2f9bfdb7937cd796272f72 (patch)
treebdacd04c262d6d4215c28b3252ccca387fef2efb /rts
parent42ce2cffe25f8e94b6f5735955ba6d8390d7fbd6 (diff)
downloadhaskell-796a3b3637f61ae04d2f9bfdb7937cd796272f72.tar.gz
Fix #4867 (updated; corrects address calculation)
This is a corrected fix for ticket #4867, "ghci displays negative floats incorrectly". The previous patch sometimes gave incorrect offset to values in the __const section of the __TEXT segment. The new patch arranges a zero fixup for non-external, not-global offset table signed relocations. This is apparently what is required, though documentation on this point is scarce. With this change Doubles are negated properly, because the sign bit mask is loaded from the correct offset. This was tested both on HEAD and the 7.0 branch.
Diffstat (limited to 'rts')
-rw-r--r--rts/Linker.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index ee7a9c9e38..2a45aac757 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -4690,7 +4690,12 @@ static int relocateSection(
}
else
{
- value = relocateAddress(oc, nSections, sections, reloc->r_address);
+ // If the relocation is not through the global offset table
+ // or external, then set the value to the baseValue. This
+ // will leave displacements into the __const section
+ // unchanged (as they ought to be).
+
+ value = baseValue;
}
IF_DEBUG(linker, debugBelch("relocateSection: value = %p\n", (void *)value));