summaryrefslogtreecommitdiff
path: root/rts/Linker.c
diff options
context:
space:
mode:
authorEdward Z. Yang <ezyang@mit.edu>2013-09-15 23:53:01 -0700
committerEdward Z. Yang <ezyang@mit.edu>2013-09-15 23:53:10 -0700
commit85a9e2468dc74b9e5ccde0dd61be86219fd323a2 (patch)
treed74f20c29a5f8c1fecb765e6cbf529b533a77f1c /rts/Linker.c
parentea8317406e32ee8b91896439fe0810f3601d61ca (diff)
downloadhaskell-85a9e2468dc74b9e5ccde0dd61be86219fd323a2.tar.gz
Run ctors initializers backwards, see #5435.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Diffstat (limited to 'rts/Linker.c')
-rw-r--r--rts/Linker.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index 49c7d6c5c5..e2c408157c 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -4218,11 +4218,11 @@ ocRunInit_PEi386 ( ObjectCode *oc )
char *secname = cstring_from_section_name(sectab_i->Name, strtab);
if (0 == strcmp(".ctors", (char*)secname)) {
UChar *init_startC = (UChar*)(oc->image) + sectab_i->PointerToRawData;
- init_t *init = (init_t*)init_startC;
- init_t *init_end = (init_t*)(init_startC + sectab_i->SizeOfRawData);
- // I heard that .ctors might need to be run backwards, but
- // if that is true then the MinGW toolchain ignores that.
- for (; init < init_end; init++) {
+ init_t *init_start, *init_end, *init;
+ init_start = (init_t*)init_startC;
+ init_end = (init_t*)(init_startC + sectab_i->SizeOfRawData);
+ // ctors are run *backwards*!
+ for (init = init_end - 1; init >= init_start; init--) {
(*init)(argc, argv, envv);
}
}