From 2c39e50995bb02325b2c17f253b10f5ada0e337f Mon Sep 17 00:00:00 2001 From: Vladimir Stefanovic Date: Tue, 18 Oct 2016 23:50:48 +0200 Subject: [PATCH] debug/elf: add support for GOARCH=mips{,le} Change-Id: Ia6f8ae7e56a49ad66b60a24c4afb606f3cfe5efd Reviewed-on: https://go-review.googlesource.com/31482 Run-TryBot: Brad Fitzpatrick Reviewed-by: Cherry Zhang --- src/debug/elf/file.go | 42 +++++++++++++++++- src/debug/elf/file_test.go | 38 ++++++++++++++++ .../go-relocation-test-gcc492-mipsle.obj | Bin 0 -> 2864 bytes .../go-relocation-test-gcc540-mips.obj | Bin 0 -> 3064 bytes 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc492-mipsle.obj create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc540-mips.obj diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index c1cbfa6225..0c547669a9 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -579,7 +579,7 @@ func (f *File) Section(name string) *Section { } // applyRelocations applies relocations to dst. rels is a relocations section -// in RELA format. +// in REL or RELA format. func (f *File) applyRelocations(dst []byte, rels []byte) error { switch { case f.Class == ELFCLASS64 && f.Machine == EM_X86_64: @@ -594,6 +594,8 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error { return f.applyRelocationsPPC(dst, rels) case f.Class == ELFCLASS64 && f.Machine == EM_PPC64: return f.applyRelocationsPPC64(dst, rels) + case f.Class == ELFCLASS32 && f.Machine == EM_MIPS: + return f.applyRelocationsMIPS(dst, rels) case f.Class == ELFCLASS64 && f.Machine == EM_MIPS: return f.applyRelocationsMIPS64(dst, rels) case f.Class == ELFCLASS64 && f.Machine == EM_S390: @@ -863,6 +865,44 @@ func (f *File) applyRelocationsPPC64(dst []byte, rels []byte) error { return nil } +func (f *File) applyRelocationsMIPS(dst []byte, rels []byte) error { + // 8 is the size of Rel32. + if len(rels)%8 != 0 { + return errors.New("length of relocation section is not a multiple of 8") + } + + symbols, _, err := f.getSymbols(SHT_SYMTAB) + if err != nil { + return err + } + + b := bytes.NewReader(rels) + var rel Rel32 + + for b.Len() > 0 { + binary.Read(b, f.ByteOrder, &rel) + symNo := rel.Info >> 8 + t := R_MIPS(rel.Info & 0xff) + + if symNo == 0 || symNo > uint32(len(symbols)) { + continue + } + sym := &symbols[symNo-1] + + switch t { + case R_MIPS_32: + if rel.Off+4 >= uint32(len(dst)) { + continue + } + val := f.ByteOrder.Uint32(dst[rel.Off : rel.Off+4]) + val += uint32(sym.Value) + f.ByteOrder.PutUint32(dst[rel.Off:rel.Off+4], val) + } + } + + return nil +} + func (f *File) applyRelocationsMIPS64(dst []byte, rels []byte) error { // 24 is the size of Rela64. if len(rels)%24 != 0 { diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go index f1e28a0671..58bdf277d3 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -510,6 +510,44 @@ var relocationTests = []relocationTest{ }}, }, }, + { + "testdata/go-relocation-test-gcc492-mipsle.obj", + []relocationTestEntry{ + {0, &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 -mel -march=mips2 -mtune=mips32 -mllsc -mno-shared -mabi=32 -g", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), 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(0x58), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, + }}, + }, + }, + { + "testdata/go-relocation-test-gcc540-mips.obj", + []relocationTestEntry{ + {0, &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 5.4.0 20160609 -meb -mips32 -mtune=mips32r2 -mfpxx -mllsc -mno-shared -mabi=32 -g -gdwarf-2", 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: uint64(0x5c), Class: dwarf.ClassAddress}, + {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-gcc492-mipsle.obj b/src/debug/elf/testdata/go-relocation-test-gcc492-mipsle.obj new file mode 100644 index 0000000000000000000000000000000000000000..a5fbcfbbdd24265cf41850440a90719d2545e263 GIT binary patch literal 2864 zcma)8ONbm*6uni|zt~QvlZi27el;?~M9oxUG6;!AM>CoXMvaK5AatsGDm|^$)lGFx zJ}M}JqN^bb#YNCSHZGJwbP*)cEEHTQxE1^a+z4)>C`1gj=e(-d^D+_i!mD$C@7()d zy?Wg*KX~XN%d$j^B_&z5MBJiCu`1Omm9R~2k(+g@!b|-N6Px7or491g(&*(gj>x8a zL{3js<@}N>Uo4HumrEixd^2MruP%;$H7%>IxXyUVm8yKdIQq*)2lE#(f6^7IKa|CQeJY3PF*LE(SmTx9vQybuS!1m& zRPk2qF)5etg$r$DY6<05!#g{SQl53+h*Q~HzPmgz!a36$-hN=jLZpzF)IU3HZvgiu zmST}?XQ=6|pneyIt#;J1{;mw+J*WeOcVVUb>ou5$l8R-$JvLnW5X_bpcA}=M9^9pc zsMl&n!JJD&d9U|e?{3Wd@$ytX_(d30mBCL zS}z32$!@?-j)@%Dzkjd0Z6>I<{3z{c^3I*Nr5d;DMhqO;K92NDTZcA_OJ^qB`7k3Zop-@h7xX0#v{K2n@t@p>oQiC+gMafI@%HMk=esfcv$Sw&~GY#=ym5}@!E4ieWA(7?p;Xlq;tuo0=0B@s{8eN z92_I5j{315HG_;VO$u94fELJFLu=wSI_-9VZ8N4Fjr}%~urSY0lDJi0NI>#0Vt)KN z`EBsMGu2sfH8}8?;uvQ;&0l4PkzHP453R6yBP@%9+sqV4)|w{xZdhTjTVbmkW8ib7 zFwm(u!gstZj^M*J#F6!)SHSbK7V9@VWOtj5eATT!tLpoy)v)8Wu+#9vTC*$Ng@l{V zygW*=+X8TmHnwIPZQyobIa`X2C9`WAt@1qESn`?-Z_03lh-+b#h=$3-yd4>;y9M^X z%;qJ@_`?}Kli`sJn;AwKzL?=F8NN2c^1t zNoQcQrWV$vy$9oVBkx@12Pk1J<{iQ?zrSx`yBJ!?M>&XLuJ<6C&>ZU4LY(&F7$)Ck z*rw=M4NmHM9n7m5iCTXiKK$l)2O&)2TC`|Bo*%Qn!|3mQ__)S0hJGK%p__c?K)@e$ zEt>C5ILy3tXw=n7K%Ms*bhGXi)Mf9i%kNg#Jq_LDn*!fn__S!gci=GjO4wYz&*as7 zTpRgzW&{!V{>pR$`8Yn#Q0Fyqz%XwhI`1MpW`A!WZ)%X0)}?tK!|bn${`7kJ&FTL5 zU+T|(pMS-aoChECwCMHnUeRZsv9DqLpp$?)kEqWI!yll~VK{jY@rGty^0POS?<%h2 KTjA59`ThZhn>Wb- literal 0 HcmV?d00001 diff --git a/src/debug/elf/testdata/go-relocation-test-gcc540-mips.obj b/src/debug/elf/testdata/go-relocation-test-gcc540-mips.obj new file mode 100644 index 0000000000000000000000000000000000000000..270c7775968f0e6d74875fa017d5f153e88e0cf8 GIT binary patch literal 3064 zcmb7GU1%It6h3!$Hrcw_?WSq8nzR`uYoa#OZ5jiujYhND6suOO4?-lJO(vVg-PvV! z(xm<%3W5)6S|~n9(Si^5r9=>_qN#aMY!O88r4OQgl0L?QASkTgxpVJkvUv~>Idjf; z?sv~U_jmL9Y!LP5iI(3)hw-b~nDy5-vJ%;`H;ob?u|k)wl3-x5Mld`lRCHE5&J_$Sh4!QTVzn|I6Q>RxNH>X&C#`VnEQ-zmViV`qRYlvlVlE`M5oB6yOObVPr6g= z5E-zHeo7`EMu;e;Toi3?NAzeHQQQ`fbi~q!k`E;ZI=Ihx+xw4o2(+}tDU2WOGH%1D zN=!1|WtR)dz_+9&nk3^r_9vkyRQv?|DaD5?rB^Mk#%$%9s=%mh-y_7|=@el{dG1g_ za--~-kQSFabi2{tmAGW|f>*A3MN58oxfi^8spz@076TdG8rd2?^7Ql8#Qy!(gZ7A> zvxal~M{}dOgVs>RE#OnC)ej8A1`D1$79yYVTy1Fyrd+PizJD2;KK zBK~F<9e-|Um}bzpQJzEqF1I~df5$5 z*Ie#?is;D1#35@i?-ojq7tU#DE^nI@lNx_$pKWZ@TOu(+8v?*bt0}t2t`Q00>5^s8Az~`IU6kxvNO#$B71aN@wfYEcB z+7Yftv*t`lmK(vY#CnJ2QJJ2`(odJGGfsKBSfkoPP!Icnx|3_ecsseKexeS>gRqSE z5_R+1;pOhm!a}YmmF@eK9aVNr*}Sq( zD*J-6CzUNK>nZz+vTrE+wi@ppWzP^Lc-#+E`$c6@e;da!e_7uH%3>W-9LMhy;&%OX zC2$I`fgjp=?fGum4&0@H>{%yp$S&0DWczNhc;^~tWx zx`l-zw;UJ-y&CrAT(V(0>>c_}q2Rlxke|Eo-f@0SbbQAvx+=9|lss3nQ69C0ZZl+{M(!~RJAfAMm)ur}U9mJ876{~A0lmdREx~_FT00N%K!iX literal 0 HcmV?d00001 -- 2.48.1