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^;+&#7*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