From e1fc292500aa70c265937aebad00ac010031cbaf Mon Sep 17 00:00:00 2001 From: James Clarke Date: Tue, 11 Oct 2016 19:08:45 +0100 Subject: [PATCH] debug/elf: add sparc64 relocations Change-Id: I1a2504ad9ca8607588d2d366598115fe360435b5 Reviewed-on: https://go-review.googlesource.com/30870 Reviewed-by: Ian Lance Taylor --- src/debug/elf/file.go | 47 ++++++++++++++++++ src/debug/elf/file_test.go | 19 +++++++ .../go-relocation-test-gcc620-sparc64.obj | Bin 0 -> 5952 bytes 3 files changed, 66 insertions(+) create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc620-sparc64.obj diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index c173ea9331..c1cbfa6225 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -598,6 +598,8 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error { return f.applyRelocationsMIPS64(dst, rels) case f.Class == ELFCLASS64 && f.Machine == EM_S390: return f.applyRelocationss390x(dst, rels) + case f.Class == ELFCLASS64 && f.Machine == EM_SPARCV9: + return f.applyRelocationsSPARC64(dst, rels) default: return errors.New("applyRelocations: not implemented") } @@ -962,6 +964,51 @@ func (f *File) applyRelocationss390x(dst []byte, rels []byte) error { return nil } +func (f *File) applyRelocationsSPARC64(dst []byte, rels []byte) error { + // 24 is the size of Rela64. + if len(rels)%24 != 0 { + return errors.New("length of relocation section is not a multiple of 24") + } + + symbols, _, err := f.getSymbols(SHT_SYMTAB) + if err != nil { + return err + } + + b := bytes.NewReader(rels) + var rela Rela64 + + for b.Len() > 0 { + binary.Read(b, f.ByteOrder, &rela) + symNo := rela.Info >> 32 + t := R_SPARC(rela.Info & 0xffff) + + if symNo == 0 || symNo > uint64(len(symbols)) { + continue + } + sym := &symbols[symNo-1] + if SymType(sym.Info&0xf) != STT_SECTION { + // We don't handle non-section relocations for now. + continue + } + + switch t { + case R_SPARC_64, R_SPARC_UA64: + if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { + continue + } + f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], uint64(rela.Addend)) + case R_SPARC_32, R_SPARC_UA32: + if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { + continue + } + f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend)) + } + } + + return nil +} + func (f *File) DWARF() (*dwarf.Data, error) { // sectionData gets the data for s, checks its size, and // applies any applicable relations. diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go index b189219a55..f1e28a0671 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -491,6 +491,25 @@ var relocationTests = []relocationTest{ }}, }, }, + { + "testdata/go-relocation-test-gcc620-sparc64.obj", + []relocationTestEntry{ + {0, &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 6.2.0 20160914 -mcpu=v9 -g -fstack-protector-strong", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x2c), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, + }}, + }, + }, { "testdata/go-relocation-test-gcc493-mips64le.obj", []relocationTestEntry{ diff --git a/src/debug/elf/testdata/go-relocation-test-gcc620-sparc64.obj b/src/debug/elf/testdata/go-relocation-test-gcc620-sparc64.obj new file mode 100644 index 0000000000000000000000000000000000000000..d65c23e1cbeaad5acc30d7d256931443ac8aea2a GIT binary patch literal 5952 zcmbtXYiwLc6`r|w?X2zCvE#Nlw4@t}CM~hob}%Ms)5c9m8aGvm1e6K_+kITytL&@y z?j{ZeHKaU@L~sL2RiPHOAgWLh4*@MgASyrz@uvm;L`Wbc5JLUeBGE#D@O?AquIFAm zf8c2E%sJnj$IO}MK79C|Bc7*Km$cdq-T}HTV75~5)Eq06*Q%{g{^=*j&kd`wS5II1 z^iOwPde}$9qr(pv6*}Sf@fZJ?jU6rpwOVsLce)wYDroW#sthV++c%TlfX0b=rnro9 zubF%PhjRQKnX#8K! zyn^W4`v9oSt0+p!@~?qk&079-^23(@2l+9}|C4;q@^6s8+4BD)KV|uUlizFk|B#>S zN2xLVZ~|mZZebkG{<}qVmJuq zQ_8k&kI@x_jw&WYZDEnow?TVF`27xlJ9*>u2`mloJHu4(c^2#m%YJ>0{YIDVeKWL5 zi03_z?{6cDwtqDSz1I^lJ4%~9K!-x(8pHJua4M8(EcqAC>aOS?@Gq=rGZ?k1^oYJ` zXmr3Ix_)RxZ{0NfCiuNh`9rr3+%_-|8~?3pVBik4V|cu4{u`$g=TAEh`Dhf!*?*7KvZ7~BCrlV}_oh3WonNbHRD0iy%k2n-8= zxE2`UV%nP52e#Q>@7l(J%#A&Ea2s8Y_H;YpVGWYT?Qvk%hDFxO@in%~y=e5G%jh?T z29*Y(1)rYmMB!wuTAExemnWlEF)Yu{Ow_84&ho@!qcb@>S#6YSol2mLq6ix(ma6S2 zp`(;J>GEZEA!=7D!9sqCA=_tKK?D{%7;&pjusAcJ(Phs>g&+)T)u?UNFbn3iqNnSQ z9rJt)pfLaLLaDP*2pSbtXx1u)=E6c0v{eM-2CNkoqT;E*XhciRu$|*U7*#(K6l}$g zz}DJP{d8Du2ZdG}#tXILVq|vtA5O2BAg6pjfe<+Z7Y7)-0b?wPs_{M7itU z_vH>vPv>Uyd-7AcJyX-OQ~Rc8aufA(t8@FQeYuIn+{8lEE|yPDw8CaPD7Ty8MAQyp zuL|W(SSUAZoqEG`U{7JXfb1Yj!N^DE?>Ss()jH@%s~M?cxOhqxB6PFcsydCRy4VOR zx$;smq(&LzUIRE*@mg&Z*0h-)w%LKgDYF(kw#l)X=rlS}P}yUYO(vK#o8xY1Iy2$x z#VQ8U2$tcz&?;7@Z3SyeZ@1Nqt=?f%m~gT-GiI(iVY4%sLT41sP8+#l3voncL=2>a z1b13?`nbS=nu$g1dJ}7!I;Q`2Sf|>>QY~;-gjqnQk?TqpC7e`iL8IAS;Bbu|sL6J{ zWn6MCpd;$8Lx*n7-TbbgR4q2_Qka<8Eqm;i)Y{`*0_v^TRWBXhSFQF=y6!tAk_EC7Lit z>G9!RVQ}1x3F7h2F_@>E)53fb!`+r3+Vj;A<9H4j8bRsc9v^z7Yw@}G7YwQtZY6U= z%!(XWeAuw>vHuw74H`+>lCW)&9f57IBAaK@{D zWniUWOX0t^xX1I{(f4FMd#Q6nOFq3DQ~F%@Aa5rM$B(|>z{=Z`!oMZ>9Vwja3FO_4 z!u2EfjhEhcT(2PSb0}Q>{RURv7n8Whbqw;JLE-4DzZh6~KThJ_wBWx?;hz=!w@F;B z2%g$^YD{qc6?Wo!EsOi9{Oe~0r!M=PI){Dk566$*E&4qFT)fZX=Kk#kpFX#Tfo76Y2DVfe2S#3qQR^5tf|9^mnrZ{T5_$4eX!YrF#! zMhjuFE+-ns@&8f|4zxI7&Rv=lVcZ45%lbAb{s(vEIfHbIe%Vio=fx<#I8IhnxXyMu zxG#8I)nX=9$9@R2Z?V7s#h!a6_9y#|ZVkzLU-w>%<57ucLTqo0oZ@4a_m4OjSyz7_ z$ARqFP2kkS^D0HT>WRD;L47E*M6@9l8wht z{%L$y%OCSbisx_Gid}oQGs)?FCu$={h54@3apm@xe0txBUiJmc=(DK#29^6Z5ua=7 QD)Ia0&_?3iyVQ;UU&XIN4FCWD literal 0 HcmV?d00001