diff options
author | Edward Z. Yang <ezyang@mit.edu> | 2013-09-15 23:53:01 -0700 |
---|---|---|
committer | Edward Z. Yang <ezyang@mit.edu> | 2013-09-15 23:53:10 -0700 |
commit | 85a9e2468dc74b9e5ccde0dd61be86219fd323a2 (patch) | |
tree | d74f20c29a5f8c1fecb765e6cbf529b533a77f1c /rts/Linker.c | |
parent | ea8317406e32ee8b91896439fe0810f3601d61ca (diff) | |
download | haskell-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.c | 10 |
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); } } |