From b339ef955c65fd672f7e3dd39f22c8f946d09f3e Mon Sep 17 00:00:00 2001 From: Andrew Turner Date: Thu, 2 Jul 2015 15:02:59 +0000 Subject: [PATCH] Force the dynamic linker to resolve _end early so we pick up the correct copy. Sponsored by: ABT Systems Ltd --- lib/csu/aarch64/crt1.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/csu/aarch64/crt1.c b/lib/csu/aarch64/crt1.c index de4455e3f98c..be5931765a30 100644 --- a/lib/csu/aarch64/crt1.c +++ b/lib/csu/aarch64/crt1.c @@ -51,6 +51,8 @@ extern int eprol; extern int etext; #endif +extern long * _end; + void __start(int, char **, char **, void (*)(void)); /* The entry function. */ @@ -79,8 +81,17 @@ __start(int argc, char *argv[], char *env[], void (*cleanup)(void)) if (&_DYNAMIC != NULL) atexit(cleanup); - else + else { + /* + * Hack to resolve _end so we read the correct symbol. + * Without this it will resolve to the copy in the library + * that firsts requests it. We should fix the toolchain, + * however this is is needed until this can take place. + */ + *(volatile long *)&_end; + _init_tls(); + } #ifdef GCRT atexit(_mcleanup);