lab.nexedi.com will be down from Thursday, 20 March 2025, 07:30:00 UTC for a duration of approximately 2 hours

Commit ecfa7375 authored by David Crawshaw's avatar David Crawshaw

cmd/link: move ELF reader to its own package

Along the way, switch to using relocation constants from debug/elf.

For #22095

Change-Id: I1a64353619f95dde5aa39060c4b9d001af7dc1e4
Reviewed-on: https://go-review.googlesource.com/69013
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 70576947
...@@ -68,6 +68,7 @@ var bootstrapDirs = []string{ ...@@ -68,6 +68,7 @@ var bootstrapDirs = []string{
"cmd/link/internal/arm64", "cmd/link/internal/arm64",
"cmd/link/internal/ld", "cmd/link/internal/ld",
"cmd/link/internal/loadmacho", "cmd/link/internal/loadmacho",
"cmd/link/internal/loadelf",
"cmd/link/internal/mips", "cmd/link/internal/mips",
"cmd/link/internal/mips64", "cmd/link/internal/mips64",
"cmd/link/internal/objfile", "cmd/link/internal/objfile",
......
...@@ -109,7 +109,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -109,7 +109,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
// Handle relocations found in ELF object files. // Handle relocations found in ELF object files.
case 256 + ld.R_X86_64_PC32: case 256 + objabi.RelocType(elf.R_X86_64_PC32):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -120,7 +120,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -120,7 +120,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += 4 r.Add += 4
return true return true
case 256 + ld.R_X86_64_PC64: case 256 + objabi.RelocType(elf.R_X86_64_PC64):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_X86_64_PC64 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_X86_64_PC64 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -131,7 +131,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -131,7 +131,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += 8 r.Add += 8
return true return true
case 256 + ld.R_X86_64_PLT32: case 256 + objabi.RelocType(elf.R_X86_64_PLT32):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Add += 4 r.Add += 4
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
...@@ -142,7 +142,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -142,7 +142,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_X86_64_GOTPCREL, 256 + ld.R_X86_64_GOTPCRELX, 256 + ld.R_X86_64_REX_GOTPCRELX: case 256 + objabi.RelocType(elf.R_X86_64_GOTPCREL), 256 + objabi.RelocType(elf.R_X86_64_GOTPCRELX), 256 + objabi.RelocType(elf.R_X86_64_REX_GOTPCRELX):
if targ.Type != sym.SDYNIMPORT { if targ.Type != sym.SDYNIMPORT {
// have symbol // have symbol
if r.Off >= 2 && s.P[r.Off-2] == 0x8b { if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
...@@ -165,7 +165,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -165,7 +165,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += int64(targ.Got) r.Add += int64(targ.Got)
return true return true
case 256 + ld.R_X86_64_64: case 256 + objabi.RelocType(elf.R_X86_64_64):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -322,10 +322,10 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -322,10 +322,10 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
rela := ctxt.Syms.Lookup(".rela", 0) rela := ctxt.Syms.Lookup(".rela", 0)
rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off))
if r.Siz == 8 { if r.Siz == 8 {
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_64)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_X86_64_64)))
} else { } else {
// TODO: never happens, remove. // TODO: never happens, remove.
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_32)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_X86_64_32)))
} }
rela.AddUint64(ctxt.Arch, uint64(r.Add)) rela.AddUint64(ctxt.Arch, uint64(r.Add))
r.Type = 256 // ignore during relocsym r.Type = 256 // ignore during relocsym
...@@ -370,21 +370,21 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -370,21 +370,21 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
return false return false
case objabi.R_ADDR: case objabi.R_ADDR:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write64(ld.R_X86_64_32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32)
} else if r.Siz == 8 { } else if r.Siz == 8 {
ctxt.Out.Write64(ld.R_X86_64_64 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32)
} else { } else {
return false return false
} }
case objabi.R_TLS_LE: case objabi.R_TLS_LE:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write64(ld.R_X86_64_TPOFF32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32)
} else { } else {
return false return false
} }
case objabi.R_TLS_IE: case objabi.R_TLS_IE:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write64(ld.R_X86_64_GOTTPOFF | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32)
} else { } else {
return false return false
} }
...@@ -392,12 +392,12 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -392,12 +392,12 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
if r.Siz == 4 { if r.Siz == 4 {
if r.Xsym.Type == sym.SDYNIMPORT { if r.Xsym.Type == sym.SDYNIMPORT {
if ctxt.DynlinkingGo() { if ctxt.DynlinkingGo() {
ctxt.Out.Write64(ld.R_X86_64_PLT32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32)
} else { } else {
ctxt.Out.Write64(ld.R_X86_64_GOTPCREL | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32)
} }
} else { } else {
ctxt.Out.Write64(ld.R_X86_64_PC32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32)
} }
} else { } else {
return false return false
...@@ -405,16 +405,16 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -405,16 +405,16 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
case objabi.R_PCREL: case objabi.R_PCREL:
if r.Siz == 4 { if r.Siz == 4 {
if r.Xsym.Type == sym.SDYNIMPORT && r.Xsym.ElfType == elf.STT_FUNC { if r.Xsym.Type == sym.SDYNIMPORT && r.Xsym.ElfType == elf.STT_FUNC {
ctxt.Out.Write64(ld.R_X86_64_PLT32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32)
} else { } else {
ctxt.Out.Write64(ld.R_X86_64_PC32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32)
} }
} else { } else {
return false return false
} }
case objabi.R_GOTPCREL: case objabi.R_GOTPCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write64(ld.R_X86_64_GOTPCREL | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32)
} else { } else {
return false return false
} }
...@@ -597,7 +597,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -597,7 +597,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
// rela // rela
rela.AddAddrPlus(ctxt.Arch, got, got.Size-8) rela.AddAddrPlus(ctxt.Arch, got, got.Size-8)
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_JMP_SLOT)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_JMP_SLOT)))
rela.AddUint64(ctxt.Arch, 0) rela.AddUint64(ctxt.Arch, 0)
s.Plt = int32(plt.Size - 16) s.Plt = int32(plt.Size - 16)
...@@ -641,7 +641,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -641,7 +641,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if ld.Iself { if ld.Iself {
rela := ctxt.Syms.Lookup(".rela", 0) rela := ctxt.Syms.Lookup(".rela", 0)
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got)) rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_GLOB_DAT)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_GLOB_DAT)))
rela.AddUint64(ctxt.Arch, 0) rela.AddUint64(ctxt.Arch, 0)
} else if ld.Headtype == objabi.Hdarwin { } else if ld.Headtype == objabi.Hdarwin {
ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid))
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"fmt" "fmt"
"log" "log"
) )
...@@ -125,7 +126,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -125,7 +126,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
// Handle relocations found in ELF object files. // Handle relocations found in ELF object files.
case 256 + ld.R_ARM_PLT32: case 256 + objabi.RelocType(elf.R_ARM_PLT32):
r.Type = objabi.R_CALLARM r.Type = objabi.R_CALLARM
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
...@@ -136,11 +137,11 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -136,11 +137,11 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_ARM_THM_PC22: // R_ARM_THM_CALL case 256 + objabi.RelocType(elf.R_ARM_THM_PC22): // R_ARM_THM_CALL
ld.Exitf("R_ARM_THM_CALL, are you using -marm?") ld.Exitf("R_ARM_THM_CALL, are you using -marm?")
return false return false
case 256 + ld.R_ARM_GOT32: // R_ARM_GOT_BREL case 256 + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL
if targ.Type != sym.SDYNIMPORT { if targ.Type != sym.SDYNIMPORT {
addgotsyminternal(ctxt, targ) addgotsyminternal(ctxt, targ)
} else { } else {
...@@ -152,7 +153,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -152,7 +153,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += int64(targ.Got) r.Add += int64(targ.Got)
return true return true
case 256 + ld.R_ARM_GOT_PREL: // GOT(nil) + A - nil case 256 + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil
if targ.Type != sym.SDYNIMPORT { if targ.Type != sym.SDYNIMPORT {
addgotsyminternal(ctxt, targ) addgotsyminternal(ctxt, targ)
} else { } else {
...@@ -164,19 +165,19 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -164,19 +165,19 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += int64(targ.Got) + 4 r.Add += int64(targ.Got) + 4
return true return true
case 256 + ld.R_ARM_GOTOFF: // R_ARM_GOTOFF32 case 256 + objabi.RelocType(elf.R_ARM_GOTOFF): // R_ARM_GOTOFF32
r.Type = objabi.R_GOTOFF r.Type = objabi.R_GOTOFF
return true return true
case 256 + ld.R_ARM_GOTPC: // R_ARM_BASE_PREL case 256 + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0) r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += 4 r.Add += 4
return true return true
case 256 + ld.R_ARM_CALL: case 256 + objabi.RelocType(elf.R_ARM_CALL):
r.Type = objabi.R_CALLARM r.Type = objabi.R_CALLARM
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ) addpltsym(ctxt, targ)
...@@ -186,13 +187,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -186,13 +187,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_ARM_REL32: // R_ARM_REL32 case 256 + objabi.RelocType(elf.R_ARM_REL32): // R_ARM_REL32
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Add += 4 r.Add += 4
return true return true
case 256 + ld.R_ARM_ABS32: case 256 + objabi.RelocType(elf.R_ARM_ABS32):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -200,7 +201,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -200,7 +201,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
// we can just ignore this, because we are targeting ARM V5+ anyway // we can just ignore this, because we are targeting ARM V5+ anyway
case 256 + ld.R_ARM_V4BX: case 256 + objabi.RelocType(elf.R_ARM_V4BX):
if r.Sym != nil { if r.Sym != nil {
// R_ARM_V4BX is ABS relocation, so this symbol is a dummy symbol, ignore it // R_ARM_V4BX is ABS relocation, so this symbol is a dummy symbol, ignore it
r.Sym.Type = 0 r.Sym.Type = 0
...@@ -209,8 +210,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -209,8 +210,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Sym = nil r.Sym = nil
return true return true
case 256 + ld.R_ARM_PC24, case 256 + objabi.RelocType(elf.R_ARM_PC24),
256 + ld.R_ARM_JUMP24: 256 + objabi.RelocType(elf.R_ARM_JUMP24):
r.Type = objabi.R_CALLARM r.Type = objabi.R_CALLARM
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ) addpltsym(ctxt, targ)
...@@ -241,7 +242,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -241,7 +242,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
ld.Adddynsym(ctxt, targ) ld.Adddynsym(ctxt, targ)
rel := ctxt.Syms.Lookup(".rel", 0) rel := ctxt.Syms.Lookup(".rel", 0)
rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_ARM_GLOB_DAT)) // we need a nil + A dynamic reloc rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), uint32(elf.R_ARM_GLOB_DAT))) // we need a nil + A dynamic reloc
r.Type = objabi.R_CONST // write r->add during relocsym r.Type = objabi.R_CONST // write r->add during relocsym
r.Sym = nil r.Sym = nil
return true return true
...@@ -260,33 +261,33 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -260,33 +261,33 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
return false return false
case objabi.R_ADDR: case objabi.R_ADDR:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_ARM_ABS32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_ABS32) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
case objabi.R_PCREL: case objabi.R_PCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_ARM_REL32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_REL32) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
case objabi.R_CALLARM: case objabi.R_CALLARM:
if r.Siz == 4 { if r.Siz == 4 {
if r.Add&0xff000000 == 0xeb000000 { // BL if r.Add&0xff000000 == 0xeb000000 { // BL
ctxt.Out.Write32(ld.R_ARM_CALL | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8)
} else { } else {
ctxt.Out.Write32(ld.R_ARM_JUMP24 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8)
} }
} else { } else {
return false return false
} }
case objabi.R_TLS_LE: case objabi.R_TLS_LE:
ctxt.Out.Write32(ld.R_ARM_TLS_LE32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_TLS_LE32) | uint32(elfsym)<<8)
case objabi.R_TLS_IE: case objabi.R_TLS_IE:
ctxt.Out.Write32(ld.R_ARM_TLS_IE32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_TLS_IE32) | uint32(elfsym)<<8)
case objabi.R_GOTPCREL: case objabi.R_GOTPCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_ARM_GOT_PREL | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_ARM_GOT_PREL) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
...@@ -696,7 +697,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -696,7 +697,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
// rel // rel
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got)) rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_ARM_JUMP_SLOT)) rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_JUMP_SLOT)))
} else { } else {
ld.Errorf(s, "addpltsym: unsupported binary format") ld.Errorf(s, "addpltsym: unsupported binary format")
} }
...@@ -731,7 +732,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -731,7 +732,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if ld.Iself { if ld.Iself {
rel := ctxt.Syms.Lookup(".rel", 0) rel := ctxt.Syms.Lookup(".rel", 0)
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got)) rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_ARM_GLOB_DAT)) rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_GLOB_DAT)))
} else { } else {
ld.Errorf(s, "addgotsym: unsupported binary format") ld.Errorf(s, "addgotsym: unsupported binary format")
} }
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log" "log"
...@@ -103,35 +104,35 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -103,35 +104,35 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
case objabi.R_ADDR: case objabi.R_ADDR:
switch r.Siz { switch r.Siz {
case 4: case 4:
ctxt.Out.Write64(ld.R_AARCH64_ABS32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS32) | uint64(elfsym)<<32)
case 8: case 8:
ctxt.Out.Write64(ld.R_AARCH64_ABS64 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS64) | uint64(elfsym)<<32)
default: default:
return false return false
} }
case objabi.R_ADDRARM64: case objabi.R_ADDRARM64:
// two relocations: R_AARCH64_ADR_PREL_PG_HI21 and R_AARCH64_ADD_ABS_LO12_NC // two relocations: R_AARCH64_ADR_PREL_PG_HI21 and R_AARCH64_ADD_ABS_LO12_NC
ctxt.Out.Write64(ld.R_AARCH64_ADR_PREL_PG_HI21 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_PREL_PG_HI21) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_AARCH64_ADD_ABS_LO12_NC | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_ADD_ABS_LO12_NC) | uint64(elfsym)<<32)
case objabi.R_ARM64_TLS_LE: case objabi.R_ARM64_TLS_LE:
ctxt.Out.Write64(ld.R_AARCH64_TLSLE_MOVW_TPREL_G0 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSLE_MOVW_TPREL_G0) | uint64(elfsym)<<32)
case objabi.R_ARM64_TLS_IE: case objabi.R_ARM64_TLS_IE:
ctxt.Out.Write64(ld.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) | uint64(elfsym)<<32)
case objabi.R_ARM64_GOTPCREL: case objabi.R_ARM64_GOTPCREL:
ctxt.Out.Write64(ld.R_AARCH64_ADR_GOT_PAGE | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_GOT_PAGE) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_AARCH64_LD64_GOT_LO12_NC | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_LD64_GOT_LO12_NC) | uint64(elfsym)<<32)
case objabi.R_CALLARM64: case objabi.R_CALLARM64:
if r.Siz != 4 { if r.Siz != 4 {
return false return false
} }
ctxt.Out.Write64(ld.R_AARCH64_CALL26 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_AARCH64_CALL26) | uint64(elfsym)<<32)
} }
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
......
This diff is collapsed.
...@@ -36,6 +36,7 @@ import ( ...@@ -36,6 +36,7 @@ import (
"cmd/internal/bio" "cmd/internal/bio"
"cmd/internal/objabi" "cmd/internal/objabi"
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/loadelf"
"cmd/link/internal/loadmacho" "cmd/link/internal/loadmacho"
"cmd/link/internal/objfile" "cmd/link/internal/objfile"
"cmd/link/internal/sym" "cmd/link/internal/sym"
...@@ -1384,6 +1385,15 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, ...@@ -1384,6 +1385,15 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4) magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4)
if magic == 0x7f454c46 { // \x7F E L F if magic == 0x7f454c46 { // \x7F E L F
ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
textp, flags, err := loadelf.Load(ctxt.Arch, ctxt.Syms, f, pkg, length, pn, ehdr.flags)
if err != nil {
Errorf(nil, "%v", err)
return
}
ehdr.flags = flags
ctxt.Textp = append(ctxt.Textp, textp...)
}
return ldhostobj(ldelf, f, pkg, length, pn, file) return ldhostobj(ldelf, f, pkg, length, pn, file)
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package ld package ld
import ( import (
"bytes"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
...@@ -24,14 +23,6 @@ func Cputime() float64 { ...@@ -24,14 +23,6 @@ func Cputime() float64 {
return time.Since(startTime).Seconds() return time.Since(startTime).Seconds()
} }
func cstring(x []byte) string {
i := bytes.IndexByte(x, '\x00')
if i >= 0 {
x = x[:i]
}
return string(x)
}
func tokenize(s string) []string { func tokenize(s string) []string {
var f []string var f []string
for { for {
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"fmt" "fmt"
"log" "log"
) )
...@@ -59,15 +60,15 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -59,15 +60,15 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
if r.Siz != 4 { if r.Siz != 4 {
return false return false
} }
ctxt.Out.Write32(ld.R_MIPS_32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8)
case objabi.R_ADDRMIPS: case objabi.R_ADDRMIPS:
ctxt.Out.Write32(ld.R_MIPS_LO16 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_MIPS_LO16) | uint32(elfsym)<<8)
case objabi.R_ADDRMIPSU: case objabi.R_ADDRMIPSU:
ctxt.Out.Write32(ld.R_MIPS_HI16 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_MIPS_HI16) | uint32(elfsym)<<8)
case objabi.R_ADDRMIPSTLS: case objabi.R_ADDRMIPSTLS:
ctxt.Out.Write32(ld.R_MIPS_TLS_TPREL_LO16 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_MIPS_TLS_TPREL_LO16) | uint32(elfsym)<<8)
case objabi.R_CALLMIPS, objabi.R_JMPMIPS: case objabi.R_CALLMIPS, objabi.R_JMPMIPS:
ctxt.Out.Write32(ld.R_MIPS_26 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_MIPS_26) | uint32(elfsym)<<8)
} }
return true return true
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"fmt" "fmt"
"log" "log"
) )
...@@ -69,21 +70,21 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -69,21 +70,21 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
case objabi.R_ADDR: case objabi.R_ADDR:
switch r.Siz { switch r.Siz {
case 4: case 4:
ctxt.Out.Write8(ld.R_MIPS_32) ctxt.Out.Write8(uint8(elf.R_MIPS_32))
case 8: case 8:
ctxt.Out.Write8(ld.R_MIPS_64) ctxt.Out.Write8(uint8(elf.R_MIPS_64))
default: default:
return false return false
} }
case objabi.R_ADDRMIPS: case objabi.R_ADDRMIPS:
ctxt.Out.Write8(ld.R_MIPS_LO16) ctxt.Out.Write8(uint8(elf.R_MIPS_LO16))
case objabi.R_ADDRMIPSU: case objabi.R_ADDRMIPSU:
ctxt.Out.Write8(ld.R_MIPS_HI16) ctxt.Out.Write8(uint8(elf.R_MIPS_HI16))
case objabi.R_ADDRMIPSTLS: case objabi.R_ADDRMIPSTLS:
ctxt.Out.Write8(ld.R_MIPS_TLS_TPREL_LO16) ctxt.Out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16))
case objabi.R_CALLMIPS, case objabi.R_CALLMIPS,
objabi.R_JMPMIPS: objabi.R_JMPMIPS:
ctxt.Out.Write8(ld.R_MIPS_26) ctxt.Out.Write8(uint8(elf.R_MIPS_26))
} }
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log" "log"
...@@ -93,7 +94,7 @@ func genplt(ctxt *ld.Link) { ...@@ -93,7 +94,7 @@ func genplt(ctxt *ld.Link) {
for _, s := range ctxt.Textp { for _, s := range ctxt.Textp {
for i := range s.R { for i := range s.R {
r := &s.R[i] r := &s.R[i]
if r.Type != 256+ld.R_PPC64_REL24 || r.Sym.Type != sym.SDYNIMPORT { if r.Type != 256+objabi.RelocType(elf.R_PPC64_REL24) || r.Sym.Type != sym.SDYNIMPORT {
continue continue
} }
...@@ -269,7 +270,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -269,7 +270,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
// Handle relocations found in ELF object files. // Handle relocations found in ELF object files.
case 256 + ld.R_PPC64_REL24: case 256 + objabi.RelocType(elf.R_PPC64_REL24):
r.Type = objabi.R_CALLPOWER r.Type = objabi.R_CALLPOWER
// This is a local call, so the caller isn't setting // This is a local call, so the caller isn't setting
...@@ -286,7 +287,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -286,7 +287,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_PPC_REL32: case 256 + objabi.RelocType(elf.R_PPC_REL32):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Add += 4 r.Add += 4
...@@ -296,7 +297,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -296,7 +297,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_PPC64_ADDR64: case 256 + objabi.RelocType(elf.R_PPC64_ADDR64):
r.Type = objabi.R_ADDR r.Type = objabi.R_ADDR
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
// These happen in .toc sections // These happen in .toc sections
...@@ -304,56 +305,56 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -304,56 +305,56 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
rela := ctxt.Syms.Lookup(".rela", 0) rela := ctxt.Syms.Lookup(".rela", 0)
rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_PPC64_ADDR64)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_PPC64_ADDR64)))
rela.AddUint64(ctxt.Arch, uint64(r.Add)) rela.AddUint64(ctxt.Arch, uint64(r.Add))
r.Type = 256 // ignore during relocsym r.Type = 256 // ignore during relocsym
} }
return true return true
case 256 + ld.R_PPC64_TOC16: case 256 + objabi.RelocType(elf.R_PPC64_TOC16):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_LO | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_LO | sym.RV_CHECK_OVERFLOW
return true return true
case 256 + ld.R_PPC64_TOC16_LO: case 256 + objabi.RelocType(elf.R_PPC64_TOC16_LO):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_LO r.Variant = sym.RV_POWER_LO
return true return true
case 256 + ld.R_PPC64_TOC16_HA: case 256 + objabi.RelocType(elf.R_PPC64_TOC16_HA):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW
return true return true
case 256 + ld.R_PPC64_TOC16_HI: case 256 + objabi.RelocType(elf.R_PPC64_TOC16_HI):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW
return true return true
case 256 + ld.R_PPC64_TOC16_DS: case 256 + objabi.RelocType(elf.R_PPC64_TOC16_DS):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_DS | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_DS | sym.RV_CHECK_OVERFLOW
return true return true
case 256 + ld.R_PPC64_TOC16_LO_DS: case 256 + objabi.RelocType(elf.R_PPC64_TOC16_LO_DS):
r.Type = objabi.R_POWER_TOC r.Type = objabi.R_POWER_TOC
r.Variant = sym.RV_POWER_DS r.Variant = sym.RV_POWER_DS
return true return true
case 256 + ld.R_PPC64_REL16_LO: case 256 + objabi.RelocType(elf.R_PPC64_REL16_LO):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_POWER_LO r.Variant = sym.RV_POWER_LO
r.Add += 2 // Compensate for relocation size of 2 r.Add += 2 // Compensate for relocation size of 2
return true return true
case 256 + ld.R_PPC64_REL16_HI: case 256 + objabi.RelocType(elf.R_PPC64_REL16_HI):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW
r.Add += 2 r.Add += 2
return true return true
case 256 + ld.R_PPC64_REL16_HA: case 256 + objabi.RelocType(elf.R_PPC64_REL16_HA):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW
r.Add += 2 r.Add += 2
...@@ -380,57 +381,57 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -380,57 +381,57 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
case objabi.R_ADDR: case objabi.R_ADDR:
switch r.Siz { switch r.Siz {
case 4: case 4:
ctxt.Out.Write64(ld.R_PPC64_ADDR32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32)
case 8: case 8:
ctxt.Out.Write64(ld.R_PPC64_ADDR64 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR64) | uint64(elfsym)<<32)
default: default:
return false return false
} }
case objabi.R_POWER_TLS: case objabi.R_POWER_TLS:
ctxt.Out.Write64(ld.R_PPC64_TLS | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TLS) | uint64(elfsym)<<32)
case objabi.R_POWER_TLS_LE: case objabi.R_POWER_TLS_LE:
ctxt.Out.Write64(ld.R_PPC64_TPREL16 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TPREL16) | uint64(elfsym)<<32)
case objabi.R_POWER_TLS_IE: case objabi.R_POWER_TLS_IE:
ctxt.Out.Write64(ld.R_PPC64_GOT_TPREL16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_GOT_TPREL16_LO_DS | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_LO_DS) | uint64(elfsym)<<32)
case objabi.R_ADDRPOWER: case objabi.R_ADDRPOWER:
ctxt.Out.Write64(ld.R_PPC64_ADDR16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_ADDR16_LO | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO) | uint64(elfsym)<<32)
case objabi.R_ADDRPOWER_DS: case objabi.R_ADDRPOWER_DS:
ctxt.Out.Write64(ld.R_PPC64_ADDR16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_ADDR16_LO_DS | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO_DS) | uint64(elfsym)<<32)
case objabi.R_ADDRPOWER_GOT: case objabi.R_ADDRPOWER_GOT:
ctxt.Out.Write64(ld.R_PPC64_GOT16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_GOT16_LO_DS | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_LO_DS) | uint64(elfsym)<<32)
case objabi.R_ADDRPOWER_PCREL: case objabi.R_ADDRPOWER_PCREL:
ctxt.Out.Write64(ld.R_PPC64_REL16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_REL16_LO | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_LO) | uint64(elfsym)<<32)
r.Xadd += 4 r.Xadd += 4
case objabi.R_ADDRPOWER_TOCREL: case objabi.R_ADDRPOWER_TOCREL:
ctxt.Out.Write64(ld.R_PPC64_TOC16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_TOC16_LO | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO) | uint64(elfsym)<<32)
case objabi.R_ADDRPOWER_TOCREL_DS: case objabi.R_ADDRPOWER_TOCREL_DS:
ctxt.Out.Write64(ld.R_PPC64_TOC16_HA | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32)
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(sectoff + 4))
ctxt.Out.Write64(ld.R_PPC64_TOC16_LO_DS | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32)
case objabi.R_CALLPOWER: case objabi.R_CALLPOWER:
if r.Siz != 4 { if r.Siz != 4 {
return false return false
} }
ctxt.Out.Write64(ld.R_PPC64_REL24 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32)
} }
ctxt.Out.Write64(uint64(r.Xadd)) ctxt.Out.Write64(uint64(r.Xadd))
...@@ -834,7 +835,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -834,7 +835,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
plt.Size += 8 plt.Size += 8
rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt)) rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_PPC64_JMP_SLOT)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_PPC64_JMP_SLOT)))
rela.AddUint64(ctxt.Arch, 0) rela.AddUint64(ctxt.Arch, 0)
} else { } else {
ld.Errorf(s, "addpltsym: unsupported binary format") ld.Errorf(s, "addpltsym: unsupported binary format")
......
...@@ -113,24 +113,24 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -113,24 +113,24 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
// Handle relocations found in ELF object files. // Handle relocations found in ELF object files.
case 256 + ld.R_390_12, case 256 + objabi.RelocType(elf.R_390_12),
256 + ld.R_390_GOT12: 256 + objabi.RelocType(elf.R_390_GOT12):
ld.Errorf(s, "s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256) ld.Errorf(s, "s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256)
return false return false
case 256 + ld.R_390_8, case 256 + objabi.RelocType(elf.R_390_8),
256 + ld.R_390_16, 256 + objabi.RelocType(elf.R_390_16),
256 + ld.R_390_32, 256 + objabi.RelocType(elf.R_390_32),
256 + ld.R_390_64: 256 + objabi.RelocType(elf.R_390_64):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_390_nn relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_390_nn relocation for dynamic symbol %s", targ.Name)
} }
r.Type = objabi.R_ADDR r.Type = objabi.R_ADDR
return true return true
case 256 + ld.R_390_PC16, case 256 + objabi.RelocType(elf.R_390_PC16),
256 + ld.R_390_PC32, 256 + objabi.RelocType(elf.R_390_PC32),
256 + ld.R_390_PC64: 256 + objabi.RelocType(elf.R_390_PC64):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name)
} }
...@@ -141,14 +141,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -141,14 +141,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
return true return true
case 256 + ld.R_390_GOT16, case 256 + objabi.RelocType(elf.R_390_GOT16),
256 + ld.R_390_GOT32, 256 + objabi.RelocType(elf.R_390_GOT32),
256 + ld.R_390_GOT64: 256 + objabi.RelocType(elf.R_390_GOT64):
ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256)
return true return true
case 256 + ld.R_390_PLT16DBL, case 256 + objabi.RelocType(elf.R_390_PLT16DBL),
256 + ld.R_390_PLT32DBL: 256 + objabi.RelocType(elf.R_390_PLT32DBL):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_390_DBL r.Variant = sym.RV_390_DBL
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
...@@ -159,8 +159,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -159,8 +159,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
return true return true
case 256 + ld.R_390_PLT32, case 256 + objabi.RelocType(elf.R_390_PLT32),
256 + ld.R_390_PLT64: 256 + objabi.RelocType(elf.R_390_PLT64):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
...@@ -170,37 +170,37 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -170,37 +170,37 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
return true return true
case 256 + ld.R_390_COPY: case 256 + objabi.RelocType(elf.R_390_COPY):
ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256)
return false return false
case 256 + ld.R_390_GLOB_DAT: case 256 + objabi.RelocType(elf.R_390_GLOB_DAT):
ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256)
return false return false
case 256 + ld.R_390_JMP_SLOT: case 256 + objabi.RelocType(elf.R_390_JMP_SLOT):
ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256)
return false return false
case 256 + ld.R_390_RELATIVE: case 256 + objabi.RelocType(elf.R_390_RELATIVE):
ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256)
return false return false
case 256 + ld.R_390_GOTOFF: case 256 + objabi.RelocType(elf.R_390_GOTOFF):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name)
} }
r.Type = objabi.R_GOTOFF r.Type = objabi.R_GOTOFF
return true return true
case 256 + ld.R_390_GOTPC: case 256 + objabi.RelocType(elf.R_390_GOTPC):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0) r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
return true return true
case 256 + ld.R_390_PC16DBL, case 256 + objabi.RelocType(elf.R_390_PC16DBL),
256 + ld.R_390_PC32DBL: 256 + objabi.RelocType(elf.R_390_PC32DBL):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_390_DBL r.Variant = sym.RV_390_DBL
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
...@@ -209,14 +209,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -209,14 +209,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
return true return true
case 256 + ld.R_390_GOTPCDBL: case 256 + objabi.RelocType(elf.R_390_GOTPCDBL):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Variant = sym.RV_390_DBL r.Variant = sym.RV_390_DBL
r.Sym = ctxt.Syms.Lookup(".got", 0) r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += int64(r.Siz) r.Add += int64(r.Siz)
return true return true
case 256 + ld.R_390_GOTENT: case 256 + objabi.RelocType(elf.R_390_GOTENT):
addgotsym(ctxt, targ) addgotsym(ctxt, targ)
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
...@@ -247,35 +247,35 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -247,35 +247,35 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
return false return false
case 4: case 4:
// WARNING - silently ignored by linker in ELF64 // WARNING - silently ignored by linker in ELF64
ctxt.Out.Write64(ld.R_390_TLS_LE32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_TLS_LE32) | uint64(elfsym)<<32)
case 8: case 8:
// WARNING - silently ignored by linker in ELF32 // WARNING - silently ignored by linker in ELF32
ctxt.Out.Write64(ld.R_390_TLS_LE64 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_TLS_LE64) | uint64(elfsym)<<32)
} }
case objabi.R_TLS_IE: case objabi.R_TLS_IE:
switch r.Siz { switch r.Siz {
default: default:
return false return false
case 4: case 4:
ctxt.Out.Write64(ld.R_390_TLS_IEENT | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_TLS_IEENT) | uint64(elfsym)<<32)
} }
case objabi.R_ADDR: case objabi.R_ADDR:
switch r.Siz { switch r.Siz {
default: default:
return false return false
case 4: case 4:
ctxt.Out.Write64(ld.R_390_32 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_32) | uint64(elfsym)<<32)
case 8: case 8:
ctxt.Out.Write64(ld.R_390_64 | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_64) | uint64(elfsym)<<32)
} }
case objabi.R_GOTPCREL: case objabi.R_GOTPCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write64(ld.R_390_GOTENT | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elf.R_390_GOTENT) | uint64(elfsym)<<32)
} else { } else {
return false return false
} }
case objabi.R_PCREL, objabi.R_PCRELDBL, objabi.R_CALL: case objabi.R_PCREL, objabi.R_PCRELDBL, objabi.R_CALL:
elfrel := ld.R_390_NONE elfrel := elf.R_390_NONE
isdbl := r.Variant&sym.RV_TYPE_MASK == sym.RV_390_DBL isdbl := r.Variant&sym.RV_TYPE_MASK == sym.RV_390_DBL
// TODO(mundaym): all DBL style relocations should be // TODO(mundaym): all DBL style relocations should be
// signalled using the variant - see issue 14218. // signalled using the variant - see issue 14218.
...@@ -287,38 +287,38 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -287,38 +287,38 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
if isdbl { if isdbl {
switch r.Siz { switch r.Siz {
case 2: case 2:
elfrel = ld.R_390_PLT16DBL elfrel = elf.R_390_PLT16DBL
case 4: case 4:
elfrel = ld.R_390_PLT32DBL elfrel = elf.R_390_PLT32DBL
} }
} else { } else {
switch r.Siz { switch r.Siz {
case 4: case 4:
elfrel = ld.R_390_PLT32 elfrel = elf.R_390_PLT32
case 8: case 8:
elfrel = ld.R_390_PLT64 elfrel = elf.R_390_PLT64
} }
} }
} else { } else {
if isdbl { if isdbl {
switch r.Siz { switch r.Siz {
case 2: case 2:
elfrel = ld.R_390_PC16DBL elfrel = elf.R_390_PC16DBL
case 4: case 4:
elfrel = ld.R_390_PC32DBL elfrel = elf.R_390_PC32DBL
} }
} else { } else {
switch r.Siz { switch r.Siz {
case 2: case 2:
elfrel = ld.R_390_PC16 elfrel = elf.R_390_PC16
case 4: case 4:
elfrel = ld.R_390_PC32 elfrel = elf.R_390_PC32
case 8: case 8:
elfrel = ld.R_390_PC64 elfrel = elf.R_390_PC64
} }
} }
} }
if elfrel == ld.R_390_NONE { if elfrel == elf.R_390_NONE {
return false // unsupported size/dbl combination return false // unsupported size/dbl combination
} }
ctxt.Out.Write64(uint64(elfrel) | uint64(elfsym)<<32) ctxt.Out.Write64(uint64(elfrel) | uint64(elfsym)<<32)
...@@ -469,7 +469,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -469,7 +469,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
// rela // rela
rela.AddAddrPlus(ctxt.Arch, got, got.Size-8) rela.AddAddrPlus(ctxt.Arch, got, got.Size-8)
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_390_JMP_SLOT)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_390_JMP_SLOT)))
rela.AddUint64(ctxt.Arch, 0) rela.AddUint64(ctxt.Arch, 0)
s.Plt = int32(plt.Size - 32) s.Plt = int32(plt.Size - 32)
...@@ -492,7 +492,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -492,7 +492,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if ld.Iself { if ld.Iself {
rela := ctxt.Syms.Lookup(".rela", 0) rela := ctxt.Syms.Lookup(".rela", 0)
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got)) rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_390_GLOB_DAT)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_390_GLOB_DAT)))
rela.AddUint64(ctxt.Arch, 0) rela.AddUint64(ctxt.Arch, 0)
} else { } else {
ld.Errorf(s, "addgotsym: unsupported binary format") ld.Errorf(s, "addgotsym: unsupported binary format")
......
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/ld" "cmd/link/internal/ld"
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf"
"log" "log"
) )
...@@ -177,7 +178,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -177,7 +178,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
} }
// Handle relocations found in ELF object files. // Handle relocations found in ELF object files.
case 256 + ld.R_386_PC32: case 256 + objabi.RelocType(elf.R_386_PC32):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -188,7 +189,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -188,7 +189,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += 4 r.Add += 4
return true return true
case 256 + ld.R_386_PLT32: case 256 + objabi.RelocType(elf.R_386_PLT32):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Add += 4 r.Add += 4
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
...@@ -199,7 +200,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -199,7 +200,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
return true return true
case 256 + ld.R_386_GOT32, 256 + ld.R_386_GOT32X: case 256 + objabi.RelocType(elf.R_386_GOT32), 256 + objabi.RelocType(elf.R_386_GOT32X):
if targ.Type != sym.SDYNIMPORT { if targ.Type != sym.SDYNIMPORT {
// have symbol // have symbol
if r.Off >= 2 && s.P[r.Off-2] == 0x8b { if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
...@@ -230,17 +231,17 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -230,17 +231,17 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Add += int64(targ.Got) r.Add += int64(targ.Got)
return true return true
case 256 + ld.R_386_GOTOFF: case 256 + objabi.RelocType(elf.R_386_GOTOFF):
r.Type = objabi.R_GOTOFF r.Type = objabi.R_GOTOFF
return true return true
case 256 + ld.R_386_GOTPC: case 256 + objabi.RelocType(elf.R_386_GOTPC):
r.Type = objabi.R_PCREL r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0) r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += 4 r.Add += 4
return true return true
case 256 + ld.R_386_32: case 256 + objabi.RelocType(elf.R_386_32):
if targ.Type == sym.SDYNIMPORT { if targ.Type == sym.SDYNIMPORT {
ld.Errorf(s, "unexpected R_386_32 relocation for dynamic symbol %s", targ.Name) ld.Errorf(s, "unexpected R_386_32 relocation for dynamic symbol %s", targ.Name)
} }
...@@ -307,7 +308,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { ...@@ -307,7 +308,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
ld.Adddynsym(ctxt, targ) ld.Adddynsym(ctxt, targ)
rel := ctxt.Syms.Lookup(".rel", 0) rel := ctxt.Syms.Lookup(".rel", 0)
rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_386_32)) rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), uint32(elf.R_386_32)))
r.Type = objabi.R_CONST // write r->add during relocsym r.Type = objabi.R_CONST // write r->add during relocsym
r.Sym = nil r.Sym = nil
return true return true
...@@ -351,16 +352,16 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -351,16 +352,16 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
return false return false
case objabi.R_ADDR: case objabi.R_ADDR:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_386_32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_32) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
case objabi.R_GOTPCREL: case objabi.R_GOTPCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_386_GOTPC) ctxt.Out.Write32(uint32(elf.R_386_GOTPC))
if r.Xsym.Name != "_GLOBAL_OFFSET_TABLE_" { if r.Xsym.Name != "_GLOBAL_OFFSET_TABLE_" {
ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(sectoff))
ctxt.Out.Write32(ld.R_386_GOT32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_GOT32) | uint32(elfsym)<<8)
} }
} else { } else {
return false return false
...@@ -368,30 +369,30 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ...@@ -368,30 +369,30 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
case objabi.R_CALL: case objabi.R_CALL:
if r.Siz == 4 { if r.Siz == 4 {
if r.Xsym.Type == sym.SDYNIMPORT { if r.Xsym.Type == sym.SDYNIMPORT {
ctxt.Out.Write32(ld.R_386_PLT32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_PLT32) | uint32(elfsym)<<8)
} else { } else {
ctxt.Out.Write32(ld.R_386_PC32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8)
} }
} else { } else {
return false return false
} }
case objabi.R_PCREL: case objabi.R_PCREL:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_386_PC32 | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
case objabi.R_TLS_LE: case objabi.R_TLS_LE:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_386_TLS_LE | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_TLS_LE) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
case objabi.R_TLS_IE: case objabi.R_TLS_IE:
if r.Siz == 4 { if r.Siz == 4 {
ctxt.Out.Write32(ld.R_386_GOTPC) ctxt.Out.Write32(uint32(elf.R_386_GOTPC))
ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(sectoff))
ctxt.Out.Write32(ld.R_386_TLS_GOTIE | uint32(elfsym)<<8) ctxt.Out.Write32(uint32(elf.R_386_TLS_GOTIE) | uint32(elfsym)<<8)
} else { } else {
return false return false
} }
...@@ -568,7 +569,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -568,7 +569,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
// rel // rel
rel.AddAddrPlus(ctxt.Arch, got, got.Size-4) rel.AddAddrPlus(ctxt.Arch, got, got.Size-4)
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_386_JMP_SLOT)) rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_386_JMP_SLOT)))
s.Plt = int32(plt.Size - 16) s.Plt = int32(plt.Size - 16)
} else if ld.Headtype == objabi.Hdarwin { } else if ld.Headtype == objabi.Hdarwin {
...@@ -604,7 +605,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) { ...@@ -604,7 +605,7 @@ func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if ld.Iself { if ld.Iself {
rel := ctxt.Syms.Lookup(".rel", 0) rel := ctxt.Syms.Lookup(".rel", 0)
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got)) rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_386_GLOB_DAT)) rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_386_GLOB_DAT)))
} else if ld.Headtype == objabi.Hdarwin { } else if ld.Headtype == objabi.Hdarwin {
ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid))
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment