]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR go/69357 (libgo refers to _end in a non-weak way)
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 9 Feb 2016 00:34:55 +0000 (00:34 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 9 Feb 2016 00:34:55 +0000 (00:34 +0000)
PR go/69537
    runtime: Don't refer to _end symbol in shared library.

    Fixes GCC PR 69357.

    Reviewed-on: https://go-review.googlesource.com/19362

From-SVN: r233235

gcc/go/gofrontend/MERGE
libgo/runtime/go-main.c
libgo/runtime/malloc.goc
libgo/runtime/runtime.h

index ab43670dbf1bbbb4776fab0e73c3687119c51d11..1f47b1e269b0ed3393b86b24301cb66ab57ed226 100644 (file)
@@ -1,4 +1,4 @@
-91833164072078a3fde7e9b05641ec3ed4a2f5d0
+2ef5f1ca449b5cf07dbbd7b13a50910fb5567372
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 026469b2377b5294287b809ba03f5f35eb4c5f7b..ff2958c239a30eb6b945691936ad93992088219b 100644 (file)
 
 extern char **environ;
 
+/* A copy of _end that a shared library can reasonably refer to.  */
+uintptr __go_end;
+
+extern byte _end[];
+
 /* The main function.  */
 
 int
@@ -41,6 +46,7 @@ main (int argc, char **argv)
     return 0;
   runtime_isstarted = true;
 
+  __go_end = (uintptr)_end;
   runtime_check ();
   runtime_args (argc, (byte **) argv);
   runtime_osinit ();
index 473879c3da437d61665c38131558b6ee4f81a8f6..0d8629277f8f8ce9b1bded5fe0e1286f97d3b53a 100644 (file)
@@ -505,7 +505,8 @@ runtime_mallocinit(void)
 {
        byte *p, *p1;
        uintptr arena_size, bitmap_size, spans_size, p_size;
-       extern byte _end[];
+       uintptr *pend;
+       uintptr end;
        uintptr limit;
        uint64 i;
        bool reserved;
@@ -613,7 +614,12 @@ runtime_mallocinit(void)
                // So adjust it upward a little bit ourselves: 1/4 MB to get
                // away from the running binary image and then round up
                // to a MB boundary.
-               p = (byte*)ROUND((uintptr)_end + (1<<18), 1<<20);
+
+               end = 0;
+               pend = &__go_end;
+               if(pend != nil)
+                       end = *pend;
+               p = (byte*)ROUND(end + (1<<18), 1<<20);
                p_size = bitmap_size + spans_size + arena_size + PageSize;
                p = runtime_SysReserve(p, p_size, &reserved);
                if(p == nil)
index f4b170d2d0eb8fcc0e3db03cec828a4f6a3f0936..67242291db7b2182eb6b2ebef496a7d616f782bd 100644 (file)
@@ -863,3 +863,4 @@ extern void _cgo_notify_runtime_init_done (void);
 extern _Bool runtime_iscgo;
 extern _Bool runtime_cgoHasExtraM;
 extern Hchan *runtime_main_init_done;
+extern uintptr __go_end __attribute__ ((weak));