From b353a69509423c8fe509d3268ae336e9a45478de Mon Sep 17 00:00:00 2001 From: Dave Cheney <dave@cheney.net> Date: Tue, 10 Mar 2015 19:39:17 +1100 Subject: [PATCH] debug/elf: fix arm build This change adds the minimum necessary to implement applyRelocations. For adg, this code uses the switch statement. Change-Id: I0989daab8d0e36c2a4f6a315ced258b832744616 Reviewed-on: https://go-review.googlesource.com/7266 Reviewed-by: Ian Lance Taylor <iant@golang.org> --- src/debug/elf/file.go | 56 +++++++++++++++--- src/debug/elf/file_test.go | 6 ++ .../go-relocation-test-gcc492-arm.obj | Bin 0 -> 2648 bytes 3 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc492-arm.obj diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index b2174d4277..7e0dcc57a5 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -524,20 +524,20 @@ func (f *File) Section(name string) *Section { // applyRelocations applies relocations to dst. rels is a relocations section // in RELA format. func (f *File) applyRelocations(dst []byte, rels []byte) error { - if f.Class == ELFCLASS64 && f.Machine == EM_X86_64 { + switch { + case f.Class == ELFCLASS64 && f.Machine == EM_X86_64: return f.applyRelocationsAMD64(dst, rels) - } - if f.Class == ELFCLASS32 && f.Machine == EM_386 { + case f.Class == ELFCLASS32 && f.Machine == EM_386: return f.applyRelocations386(dst, rels) - } - if f.Class == ELFCLASS64 && f.Machine == EM_AARCH64 { + case f.Class == ELFCLASS32 && f.Machine == EM_ARM: + return f.applyRelocationsARM(dst, rels) + case f.Class == ELFCLASS64 && f.Machine == EM_AARCH64: return f.applyRelocationsARM64(dst, rels) - } - if f.Class == ELFCLASS64 && f.Machine == EM_PPC64 { + case f.Class == ELFCLASS64 && f.Machine == EM_PPC64: return f.applyRelocationsPPC64(dst, rels) + default: + return errors.New("applyRelocations: not implemented") } - - return errors.New("not implemented") } func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error { @@ -626,6 +626,44 @@ func (f *File) applyRelocations386(dst []byte, rels []byte) error { return nil } +func (f *File) applyRelocationsARM(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_ARM(rel.Info & 0xff) + + if symNo == 0 || symNo > uint32(len(symbols)) { + continue + } + sym := &symbols[symNo-1] + + switch t { + case R_ARM_REL32: + 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) applyRelocationsARM64(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 d57aaab0ec..3e908bb1d0 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -266,6 +266,12 @@ var relocationTests = []relocationTest{ {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -g -fstack-protector"}, {Attr: dwarf.AttrLanguage, Val: int64(1)}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482.c"}, {Attr: dwarf.AttrCompDir, Val: "/tmp"}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, {Attr: dwarf.AttrHighpc, Val: int64(0x24)}, {Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, }, }, + { + "testdata/go-relocation-test-gcc492-arm.obj", + []relocationTestEntry{ + {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 20141224 (prerelease) -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mtls-dialect=gnu -g"}, {Attr: dwarf.AttrLanguage, Val: int64(1)}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc492.c"}, {Attr: dwarf.AttrCompDir, Val: "/root/go/src/debug/elf/testdata"}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, {Attr: dwarf.AttrHighpc, Val: int64(0x28)}, {Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, + }, + }, { "testdata/go-relocation-test-gcc482-ppc64le.obj", []relocationTestEntry{ diff --git a/src/debug/elf/testdata/go-relocation-test-gcc492-arm.obj b/src/debug/elf/testdata/go-relocation-test-gcc492-arm.obj new file mode 100644 index 0000000000000000000000000000000000000000..ed45be2c55fda61466e4860e42fab07cc9228978 GIT binary patch literal 2648 zcma)8+iM(E82`@9?4{Xcn@cZ=i8@M(TicmU*4Wx=Y%bNd^r8q}5$f#jWU{zBv&_!M zMho^qv>+AwpikBdzVxXm_#i^nKR_Y)B={mJg-V~qN5S~}X3yD77Kwgg&hNXP?|k36 zWZ!=3%+o>$QY5HAn-bBTbZkk@#899;G(vRJ`rY{Q%6fL~?0S}RxBCZkw_(0TG<WOo zjg7m;+Ua$=eDlt-TdxNP%{PLuUghww@fpmJA@Uf-Cm1GWwgT%xnvuyvrHSnKENPkF zI?6VKNdL*8r3|>}MylpVq-9gk0W$9~7^$CQ$c)3qFfOnlvflzyKVcB@0yvrY_$!R* zUt{Gn7`3ZWdLx$Dpj~YuJOoE#NbJjx<n;V_en<?b2lv7{Nx9sUP+=L8%_7}SXiuR* zDO(&H)AL7jkLMm5<CwY8j~2!REa?<=^ruF&QOrHTsW^%340Ea#%%8xgQHe+KSAKx7 zSKKgsg1o>A-Fi@QqFUfvk=u$auTq&gQnD*>0j1)Z_k8MU1_JAW@0szyZ98%9d2`X6 zv5(j#votk5GhHgpn1yEOVoKL(x%*A4;e?gtSto3)9JU;YOZC8sET>$XU3S7ME1K=u zm8Is&BUW|#5ag)dvZ^(w?pC5%&u^QSM{&Nk->P}OTQxcH<}$XZw=1TCeAM-hrG``U zJ5%wTPUuyrwH$<z*>z*ROdChQXGQw3smJe4H(G7FR1AY4DtbY&6;_H>x7_xMZhfi9 zy{$TtgZ)@sJZcuuy#3qtj;J5)-v9~HF6R3O;(d<y1OxByLO%Px_JLUF&l%_X2eLHJ z7tC?dToMn1O&zx8DczTu&x##dpD}Fg61&A-eN>Ezd$e(VLfn^rP>|hPZA4BP7=;~N zRvfm`j@%0o+3~{da;rsl7<2?S#?_s#`AY#@xYF}Zxg5GH@akHf(D6N&1G}nv&39D* za*<sL8Vwf>wf!J+ZFI(JMNZ}QWXw|NG!QiZ+*#X+qOewOqoF9WhxlMCGUyM!i(S&U zyh^xr_)C(WxIe7dDMj}t9Uz-M^1dx{GCRk29zNxw6Yh6{blQ=S*gw}J5A?`8<Mj-7 zwVNEPbn2D)h1?{ahP&?qpPym$!`d`=qPM$4lU1_MEKbp+L-E~dwj<txUHA@Ui1;l! z2;}!@0!pr4>+76j4W$gR4BRboj1kYv1B^KAye766B_5JEEAhC*(-L2n_?kpdqA&3+ ziI*h4%ZPj*O8E<k@j9^;+*lgM>xP;y<Y|G#uU9Qh=u-REn`wJGZS{~{WPf=|Gl zG9Z9+abAvRKRz*h##mOT^;PgmVjI%|eC+>UepB$_7*!I_mpnOYeNRX~KumRv-$<T8 z<$Vl%vW`*IaUD9YgL|OrI0;_GfQ|ocCu>o*S9<&|!C-QLB<1%4<Ye9-kc{i#ysTGw z8{kz8So#bCpCLucR)Zor-x}uQe)4>LGu3>n;5ml-$aELNaWx5KX8C(ZqVg+ZV+znI zQhryUNQBdiY6GRCvVGp;_Y(Zn-0aHhW4eYfS;sGlzHon39XG&ZiY6eY%Mcz_0#N1U udz)O+O$gupiy!-|GsWhMNc1d}eBbf2CC<zFd2Px0e#DP2{&k{A<^2bNu{ity literal 0 HcmV?d00001 -- 2.30.9