aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2015-07-02 15:02:59 +0000
committerAndrew Turner <andrew@FreeBSD.org>2015-07-02 15:02:59 +0000
commitb339ef955c65fd672f7e3dd39f22c8f946d09f3e (patch)
tree2903597deb2c8f1d7a8d0cbec62d8e559b103154 /lib
parent74735cf1880a87da94c6fa0fdac56dd90b773818 (diff)
downloadsrc-b339ef955c65fd672f7e3dd39f22c8f946d09f3e.tar.gz
src-b339ef955c65fd672f7e3dd39f22c8f946d09f3e.zip
Force the dynamic linker to resolve _end early so we pick up the correct
copy. Sponsored by: ABT Systems Ltd
Notes
Notes: svn path=/head/; revision=285044
Diffstat (limited to 'lib')
-rw-r--r--lib/csu/aarch64/crt1.c13
1 files changed, 12 insertions, 1 deletions
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);