1
0
mirror of https://github.com/golang/go synced 2024-11-20 01:14:40 -07:00

cmd: linker changes for shared library initialization

Suggested by iant@, this change:
  - looks for a symbol _rt0_<GOARCH>_<GOOS>_lib,
  - if the symbol is present, adds a new entry into the .init_array ELF
    section that points to the symbol.

The end-effect is that the symbol _rt0_<GOARCH>_<GOOS>_lib will be
invoked as soon as the (ELF) shared library is loaded, which will in turn
initialize the runtime. (To be implemented.)

Change-Id: I99911a180215a6df18f8a18483d12b9b497b48f4
Reviewed-on: https://go-review.googlesource.com/7692
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Srdjan Petrovic 2015-03-17 09:47:01 -07:00 committed by Ian Lance Taylor
parent ff1f3a11e4
commit 8da54a4eec
3 changed files with 22 additions and 0 deletions

View File

@ -936,6 +936,15 @@ func Addstring(s *LSym, str string) int64 {
return int64(r) return int64(r)
} }
func addinitarrdata(s *LSym) {
p := s.Name + ".ptr"
sp := Linklookup(Ctxt, p, 0)
sp.Type = SINITARR
sp.Size = 0
sp.Dupok = 1
Addaddr(Ctxt, sp, s)
}
func dosymtype() { func dosymtype() {
for s := Ctxt.Allsym; s != nil; s = s.Allsym { for s := Ctxt.Allsym; s != nil; s = s.Allsym {
if len(s.P) > 0 { if len(s.P) > 0 {
@ -946,6 +955,11 @@ func dosymtype() {
s.Type = SNOPTRDATA s.Type = SNOPTRDATA
} }
} }
// Create a new entry in the .init_array section that points to the
// library initializer function.
if Flag_shared != 0 && s.Name == INITENTRY {
addinitarrdata(s)
}
} }
} }

View File

@ -1362,6 +1362,7 @@ func genasmsym(put func(*LSym, string, int, int64, int64, int, *LSym)) {
SRODATA, SRODATA,
SSYMTAB, SSYMTAB,
SPCLNTAB, SPCLNTAB,
SINITARR,
SDATA, SDATA,
SNOPTRDATA, SNOPTRDATA,
SELFROSECT, SELFROSECT,

View File

@ -10,6 +10,13 @@ TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
MOVQ $main(SB), AX MOVQ $main(SB), AX
JMP AX JMP AX
// When linking with -shared, this symbol is called when the shared library
// is loaded.
TEXT _rt0_amd64_linux_lib(SB),NOSPLIT,$0
// TODO(spetrovic): Do something useful, like calling $main. (Note that
// this has to be done in a separate thread, as main is expected to block.)
RET
TEXT main(SB),NOSPLIT,$-8 TEXT main(SB),NOSPLIT,$-8
MOVQ $runtime·rt0_go(SB), AX MOVQ $runtime·rt0_go(SB), AX
JMP AX JMP AX