cmd/ld: handle weak symbols

compiler_rt introduces a weak and hidden symbol compilerrt_abort_impl
into our pre-linked _all.o object, we have to handle it.

Fixes #4273.

R=iant, rsc, r
CC=golang-dev
https://golang.org/cl/6783050
This commit is contained in:
Shenghou Ma 2012-10-30 23:58:43 +08:00
parent be6afde348
commit 78a6f75241
3 changed files with 28 additions and 0 deletions

10
misc/cgo/test/issue4273.c Normal file
View File

@ -0,0 +1,10 @@
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifdef __ELF__
__attribute__((weak))
__attribute__((visibility("hidden")))
void _compilerrt_abort_impl(const char *file, int line, const char *func) {
}
#endif

View File

@ -0,0 +1,11 @@
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifdef __ELF__
extern void _compilerrt_abort_impl(const char *file, int line, const char *func);
void __my_abort(const char *file, int line, const char *func) {
_compilerrt_abort_impl(file, line, func);
}
#endif

View File

@ -807,6 +807,13 @@ readsym(ElfObj *obj, int i, ElfSym *sym, int needSym)
s->type = SHIDDEN;
}
break;
case ElfSymBindWeak:
if(needSym) {
s = newsym(sym->name, 0);
if(sym->other == 2)
s->type = SHIDDEN;
}
break;
default:
werrstr("%s: invalid symbol binding %d", sym->name, sym->bind);
return -1;