cmd/internal/ld, cmd/7l: external linking support for linux/arm64

Based on Michael Hudson-Doyle's patch:
b735215ee4

Change-Id: I309e3df7608b9eef9339196fdc50dedf5f9439f0
Reviewed-on: https://go-review.googlesource.com/8437
Reviewed-by: Aram Hăvărneanu <aram@mgk.ro>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Shenghou Ma 2015-04-03 04:37:11 -04:00 committed by Minux Ma
parent a50b24c649
commit f55b2a11f4
6 changed files with 68 additions and 23 deletions

View file

@ -66,8 +66,33 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
}
func elfreloc1(r *ld.Reloc, sectoff int64) int {
// TODO(minux)
return -1
ld.Thearch.Vput(uint64(sectoff))
elfsym := r.Xsym.Elfsym
switch r.Type {
default:
return -1
case ld.R_ADDR:
switch r.Siz {
case 4:
ld.Thearch.Vput(ld.R_AARCH64_ABS32 | uint64(elfsym)<<32)
case 8:
ld.Thearch.Vput(ld.R_AARCH64_ABS64 | uint64(elfsym)<<32)
default:
return -1
}
case ld.R_CALLARM64:
if r.Siz != 4 {
return -1
}
ld.Thearch.Vput(ld.R_AARCH64_CALL26 | uint64(elfsym)<<32)
}
ld.Thearch.Vput(uint64(r.Xadd))
return 0
}
func elfsetupplt() {
@ -81,8 +106,18 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
if ld.Linkmode == ld.LinkExternal {
// TODO(minux): translate R_CALLARM64 into standard ELF relocation.
return -1
switch r.Type {
default:
return -1
case ld.R_CALLARM64:
r.Done = 0
r.Xsym = r.Sym
*val = int64(0xfc000000 & uint32(r.Add))
r.Xadd = int64((uint32(r.Add) &^ 0xfc000000) * 4)
r.Add = 0
return 0
}
}
switch r.Type {
@ -108,7 +143,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.LSym, t int64) int64 {
}
func adddynsym(ctxt *ld.Link, s *ld.LSym) {
log.Fatalf("adddynsym not implemented")
// TODO(minux): implement when needed.
}
func adddynlib(lib string) {