re PR go/69357 (libgo refers to _end in a non-weak way)

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
This commit is contained in:
Ian Lance Taylor 2016-02-09 00:34:55 +00:00
parent 41798077bf
commit cc240aa7d1
4 changed files with 16 additions and 3 deletions

View 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.

View File

@ -30,6 +30,11 @@
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 ();

View 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)

View 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));