]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - unittests/MachOTests/MachONormalizedFileBinaryReaderTests.cpp
Vendor import of lld trunk r233088:
[FreeBSD/FreeBSD.git] / unittests / MachOTests / MachONormalizedFileBinaryReaderTests.cpp
1 //===- lld/unittest/MachOTests/MachONormalizedFileBinaryReaderTests.cpp ---===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "gtest/gtest.h"
11 #include "../../lib/ReaderWriter/MachO/MachONormalizedFile.h"
12 #include "llvm/Support/MachO.h"
13 #include <assert.h>
14 #include <vector>
15
16 using llvm::StringRef;
17 using llvm::MemoryBuffer;
18 using llvm::ErrorOr;
19
20 using namespace lld::mach_o::normalized;
21 using namespace llvm::MachO;
22
23 static std::unique_ptr<NormalizedFile>
24 fromBinary(const uint8_t bytes[], unsigned length, StringRef archStr) {
25   StringRef sr((const char*)bytes, length);
26   std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(sr, "", false));
27   ErrorOr<std::unique_ptr<NormalizedFile>> r =
28       lld::mach_o::normalized::readBinary(
29           mb, lld::MachOLinkingContext::archFromName(archStr));
30   EXPECT_FALSE(!r);
31   return std::move(*r);
32 }
33
34 // The Mach-O object reader uses functions such as read32 or read64
35 // which don't allow unaligned access. Our in-memory object file
36 // needs to be aligned to a larger boundary than uint8_t's.
37 #if _MSC_VER
38 #define FILEBYTES __declspec(align(64)) const uint8_t fileBytes[]
39 #else
40 #define FILEBYTES const uint8_t fileBytes[] __attribute__((aligned(64)))
41 #endif
42
43 TEST(BinaryReaderTest, empty_obj_x86_64) {
44   FILEBYTES = {
45       0xcf, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x01,
46       0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
47       0x01, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
48       0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49       0x19, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
50       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54       0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56       0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
57       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58       0x5f, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
59       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60       0x5f, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
61       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64       0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66       0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
67       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
68   std::unique_ptr<NormalizedFile> f =
69       fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
70   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
71   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
72   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
73   EXPECT_TRUE(f->localSymbols.empty());
74   EXPECT_TRUE(f->globalSymbols.empty());
75   EXPECT_TRUE(f->undefinedSymbols.empty());
76 }
77
78
79 TEST(BinaryReaderTest, empty_obj_x86) {
80   FILEBYTES = {
81       0xce, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x00,
82       0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
83       0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
84       0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
85       0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88       0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
89       0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
90       0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
91       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
92       0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
94       0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96       0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
97       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
99       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
100   std::unique_ptr<NormalizedFile> f =
101       fromBinary(fileBytes, sizeof(fileBytes), "i386");
102   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
103   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
104   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
105   EXPECT_TRUE(f->localSymbols.empty());
106   EXPECT_TRUE(f->globalSymbols.empty());
107   EXPECT_TRUE(f->undefinedSymbols.empty());
108 }
109
110
111 TEST(BinaryReaderTest, empty_obj_ppc) {
112   FILEBYTES = {
113       0xfe, 0xed, 0xfa, 0xce, 0x00, 0x00, 0x00, 0x12,
114       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
115       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c,
116       0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
117       0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
118       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
121       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
122       0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01,
123       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
124       0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
126       0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
129       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130       0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
131       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
132   std::unique_ptr<NormalizedFile> f =
133       fromBinary(fileBytes, sizeof(fileBytes), "ppc");
134   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
135   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
136   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
137   EXPECT_TRUE(f->localSymbols.empty());
138   EXPECT_TRUE(f->globalSymbols.empty());
139   EXPECT_TRUE(f->undefinedSymbols.empty());
140 }
141
142
143 TEST(BinaryReaderTest, empty_obj_armv7) {
144   FILEBYTES = {
145       0xce, 0xfa, 0xed, 0xfe, 0x0c, 0x00, 0x00, 0x00,
146       0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
147       0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
148       0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
149       0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152       0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
153       0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
154       0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
155       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
156       0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157       0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
158       0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160       0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
161       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
163       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
164   std::unique_ptr<NormalizedFile> f =
165       fromBinary(fileBytes, sizeof(fileBytes), "armv7");
166   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
167   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
168   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
169   EXPECT_TRUE(f->localSymbols.empty());
170   EXPECT_TRUE(f->globalSymbols.empty());
171   EXPECT_TRUE(f->undefinedSymbols.empty());
172 }
173
174 TEST(BinaryReaderTest, empty_obj_x86_64_arm7) {
175   FILEBYTES = {
176 #include "empty_obj_x86_armv7.txt"
177   };
178   std::unique_ptr<NormalizedFile> f =
179       fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
180   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
181   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
182   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
183   EXPECT_TRUE(f->localSymbols.empty());
184   EXPECT_TRUE(f->globalSymbols.empty());
185   EXPECT_TRUE(f->undefinedSymbols.empty());
186
187   std::unique_ptr<NormalizedFile> f2 =
188       fromBinary(fileBytes, sizeof(fileBytes), "armv7");
189   EXPECT_EQ(f2->arch, lld::MachOLinkingContext::arch_armv7);
190   EXPECT_EQ((int)(f2->fileType), MH_OBJECT);
191   EXPECT_EQ((int)(f2->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
192   EXPECT_TRUE(f2->localSymbols.empty());
193   EXPECT_TRUE(f2->globalSymbols.empty());
194   EXPECT_TRUE(f2->undefinedSymbols.empty());
195 }
196
197 TEST(BinaryReaderTest, hello_obj_x86_64) {
198   FILEBYTES = {
199     0xCF, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x01,
200     0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
201     0x03, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00,
202     0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203     0x19, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00,
204     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207     0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208     0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209     0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210     0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
211     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212     0x5F, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
213     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214     0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
215     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217     0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218     0x70, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
219     0xA4, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
220     0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
221     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222     0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
223     0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224     0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
225     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226     0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227     0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228     0x9D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232     0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
233     0xB4, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
234     0xE4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
235     0x0B, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
236     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
237     0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
238     0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
239     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245     0x55, 0x48, 0x89, 0xE5, 0x48, 0x83, 0xEC, 0x10,
246     0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00, 0xC7,
247     0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00,
248     0xE8, 0x00, 0x00, 0x00, 0x00, 0xB9, 0x00, 0x00,
249     0x00, 0x00, 0x89, 0x45, 0xF8, 0x89, 0xC8, 0x48,
250     0x83, 0xC4, 0x10, 0x5D, 0xC3, 0x68, 0x65, 0x6C,
251     0x6C, 0x6F, 0x0A, 0x00, 0x19, 0x00, 0x00, 0x00,
252     0x02, 0x00, 0x00, 0x2D, 0x0B, 0x00, 0x00, 0x00,
253     0x00, 0x00, 0x00, 0x1D, 0x0F, 0x00, 0x00, 0x00,
254     0x0E, 0x02, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00,
255     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
256     0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
258     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259     0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6D, 0x61,
260     0x69, 0x6E, 0x00, 0x5F, 0x70, 0x72, 0x69, 0x6E,
261     0x74, 0x66, 0x00, 0x4C, 0x5F, 0x2E, 0x73, 0x74,
262     0x72, 0x00, 0x00, 0x00 };
263   std::unique_ptr<NormalizedFile> f =
264       fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
265
266   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
267   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
268   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
269   EXPECT_EQ(f->sections.size(), 2UL);
270   const Section& text = f->sections[0];
271   EXPECT_TRUE(text.segmentName.equals("__TEXT"));
272   EXPECT_TRUE(text.sectionName.equals("__text"));
273   EXPECT_EQ(text.type, S_REGULAR);
274   EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
275                                       | S_ATTR_SOME_INSTRUCTIONS));
276   EXPECT_EQ(text.alignment, 4U);
277   EXPECT_EQ(text.address, Hex64(0x0));
278   EXPECT_EQ(text.content.size(), 45UL);
279   EXPECT_EQ((int)(text.content[0]), 0x55);
280   EXPECT_EQ((int)(text.content[1]), 0x48);
281   EXPECT_TRUE(text.indirectSymbols.empty());
282   EXPECT_EQ(text.relocations.size(), 2UL);
283   const Relocation& call = text.relocations[0];
284   EXPECT_EQ(call.offset, Hex32(0x19));
285   EXPECT_EQ(call.type, X86_64_RELOC_BRANCH);
286   EXPECT_EQ(call.length, 2);
287   EXPECT_EQ(call.isExtern, true);
288   EXPECT_EQ(call.symbol, 2U);
289   const Relocation& str = text.relocations[1];
290   EXPECT_EQ(str.offset, Hex32(0xB));
291   EXPECT_EQ(str.type, X86_64_RELOC_SIGNED);
292   EXPECT_EQ(str.length, 2);
293   EXPECT_EQ(str.isExtern, true);
294   EXPECT_EQ(str.symbol, 0U);
295
296   const Section& cstring = f->sections[1];
297   EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
298   EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
299   EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
300   EXPECT_EQ(cstring.attributes, SectionAttr(0));
301   EXPECT_EQ(cstring.alignment, 0U);
302   EXPECT_EQ(cstring.address, Hex64(0x02D));
303   EXPECT_EQ(cstring.content.size(), 7UL);
304   EXPECT_EQ((int)(cstring.content[0]), 0x68);
305   EXPECT_EQ((int)(cstring.content[1]), 0x65);
306   EXPECT_EQ((int)(cstring.content[2]), 0x6c);
307   EXPECT_TRUE(cstring.indirectSymbols.empty());
308   EXPECT_TRUE(cstring.relocations.empty());
309
310   EXPECT_EQ(f->localSymbols.size(), 1UL);
311   const Symbol& strLabel = f->localSymbols[0];
312   EXPECT_EQ(strLabel.type, N_SECT);
313   EXPECT_EQ(strLabel.sect, 2);
314   EXPECT_EQ(strLabel.value, Hex64(0x2D));
315   EXPECT_EQ(f->globalSymbols.size(), 1UL);
316   const Symbol& mainLabel = f->globalSymbols[0];
317   EXPECT_TRUE(mainLabel.name.equals("_main"));
318   EXPECT_EQ(mainLabel.type, N_SECT);
319   EXPECT_EQ(mainLabel.sect, 1);
320   EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
321   EXPECT_EQ(mainLabel.value, Hex64(0x0));
322   EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
323   const Symbol& printfLabel = f->undefinedSymbols[0];
324   EXPECT_TRUE(printfLabel.name.equals("_printf"));
325   EXPECT_EQ(printfLabel.type, N_UNDF);
326   EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
327 }
328
329
330 TEST(BinaryReaderTest, hello_obj_x86) {
331   FILEBYTES = {
332     0xCE, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x00,
333     0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
334     0x03, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00,
335     0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
336     0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339     0x37, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
340     0x37, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
341     0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
342     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
343     0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
345     0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347     0x30, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
348     0x04, 0x00, 0x00, 0x00, 0x7C, 0x01, 0x00, 0x00,
349     0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80,
350     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351     0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
352     0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353     0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
354     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355     0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
356     0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
360     0x18, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00,
361     0x02, 0x00, 0x00, 0x00, 0xAC, 0x01, 0x00, 0x00,
362     0x10, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
363     0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365     0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
366     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372     0x00, 0x00, 0x00, 0x00, 0x55, 0x89, 0xE5, 0x83,
373     0xEC, 0x18, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x58,
374     0x8D, 0x80, 0x25, 0x00, 0x00, 0x00, 0xC7, 0x45,
375     0xFC, 0x00, 0x00, 0x00, 0x00, 0x89, 0x04, 0x24,
376     0xE8, 0xDF, 0xFF, 0xFF, 0xFF, 0xB9, 0x00, 0x00,
377     0x00, 0x00, 0x89, 0x45, 0xF8, 0x89, 0xC8, 0x83,
378     0xC4, 0x18, 0x5D, 0xC3, 0x68, 0x65, 0x6C, 0x6C,
379     0x6F, 0x0A, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00,
380     0x01, 0x00, 0x00, 0x0D, 0x0E, 0x00, 0x00, 0xA4,
381     0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1,
382     0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
383     0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384     0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
385     0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6D, 0x61,
386     0x69, 0x6E, 0x00, 0x5F, 0x70, 0x72, 0x69, 0x6E,
387     0x74, 0x66, 0x00, 0x00
388   };
389   std::unique_ptr<NormalizedFile> f =
390       fromBinary(fileBytes, sizeof(fileBytes), "i386");
391
392   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
393   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
394   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
395   EXPECT_EQ(f->sections.size(), 2UL);
396   const Section& text = f->sections[0];
397   EXPECT_TRUE(text.segmentName.equals("__TEXT"));
398   EXPECT_TRUE(text.sectionName.equals("__text"));
399   EXPECT_EQ(text.type, S_REGULAR);
400   EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
401                                       | S_ATTR_SOME_INSTRUCTIONS));
402   EXPECT_EQ(text.alignment, 4U);
403   EXPECT_EQ(text.address, Hex64(0x0));
404   EXPECT_EQ(text.content.size(), 48UL);
405   EXPECT_EQ((int)(text.content[0]), 0x55);
406   EXPECT_EQ((int)(text.content[1]), 0x89);
407   EXPECT_TRUE(text.indirectSymbols.empty());
408   EXPECT_EQ(text.relocations.size(), 3UL);
409   const Relocation& call = text.relocations[0];
410   EXPECT_EQ(call.offset, Hex32(0x1D));
411   EXPECT_EQ(call.scattered, false);
412   EXPECT_EQ(call.type, GENERIC_RELOC_VANILLA);
413   EXPECT_EQ(call.pcRel, true);
414   EXPECT_EQ(call.length, 2);
415   EXPECT_EQ(call.isExtern, true);
416   EXPECT_EQ(call.symbol, 1U);
417   const Relocation& sectDiff = text.relocations[1];
418   EXPECT_EQ(sectDiff.offset, Hex32(0xE));
419   EXPECT_EQ(sectDiff.scattered, true);
420   EXPECT_EQ(sectDiff.type, GENERIC_RELOC_LOCAL_SECTDIFF);
421   EXPECT_EQ(sectDiff.pcRel, false);
422   EXPECT_EQ(sectDiff.length, 2);
423   EXPECT_EQ(sectDiff.value, 0x30U);
424   const Relocation& pair = text.relocations[2];
425   EXPECT_EQ(pair.offset, Hex32(0x0));
426   EXPECT_EQ(pair.scattered, true);
427   EXPECT_EQ(pair.type, GENERIC_RELOC_PAIR);
428   EXPECT_EQ(pair.pcRel, false);
429   EXPECT_EQ(pair.length, 2);
430   EXPECT_EQ(pair.value, 0x0BU);
431
432   const Section& cstring = f->sections[1];
433   EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
434   EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
435   EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
436   EXPECT_EQ(cstring.attributes, SectionAttr(0));
437   EXPECT_EQ(cstring.alignment, 0U);
438   EXPECT_EQ(cstring.address, Hex64(0x030));
439   EXPECT_EQ(cstring.content.size(), 7UL);
440   EXPECT_EQ((int)(cstring.content[0]), 0x68);
441   EXPECT_EQ((int)(cstring.content[1]), 0x65);
442   EXPECT_EQ((int)(cstring.content[2]), 0x6c);
443   EXPECT_TRUE(cstring.indirectSymbols.empty());
444   EXPECT_TRUE(cstring.relocations.empty());
445
446   EXPECT_EQ(f->localSymbols.size(), 0UL);
447   EXPECT_EQ(f->globalSymbols.size(), 1UL);
448   const Symbol& mainLabel = f->globalSymbols[0];
449   EXPECT_TRUE(mainLabel.name.equals("_main"));
450   EXPECT_EQ(mainLabel.type, N_SECT);
451   EXPECT_EQ(mainLabel.sect, 1);
452   EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
453   EXPECT_EQ(mainLabel.value, Hex64(0x0));
454   EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
455   const Symbol& printfLabel = f->undefinedSymbols[0];
456   EXPECT_TRUE(printfLabel.name.equals("_printf"));
457   EXPECT_EQ(printfLabel.type, N_UNDF);
458   EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
459 }
460
461
462 TEST(BinaryReaderTest, hello_obj_armv7) {
463   FILEBYTES = {
464     0xCE, 0xFA, 0xED, 0xFE, 0x0C, 0x00, 0x00, 0x00,
465     0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
466     0x03, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00,
467     0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
468     0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471     0x31, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
472     0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
473     0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
474     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
475     0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
477     0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479     0x2A, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
480     0x02, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
481     0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80,
482     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483     0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
484     0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485     0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
486     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487     0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
488     0x6E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491     0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
492     0x18, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00,
493     0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00,
494     0x10, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
495     0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497     0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
498     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
499     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504     0x00, 0x00, 0x00, 0x00, 0x80, 0xB5, 0x6F, 0x46,
505     0x82, 0xB0, 0x40, 0xF2, 0x18, 0x00, 0xC0, 0xF2,
506     0x00, 0x00, 0x78, 0x44, 0x00, 0x21, 0xC0, 0xF2,
507     0x00, 0x01, 0x01, 0x91, 0xFF, 0xF7, 0xF2, 0xFF,
508     0x00, 0x21, 0xC0, 0xF2, 0x00, 0x01, 0x00, 0x90,
509     0x08, 0x46, 0x02, 0xB0, 0x80, 0xBD, 0x68, 0x65,
510     0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00, 0x00, 0x00,
511     0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x6D,
512     0x0A, 0x00, 0x00, 0xB9, 0x2A, 0x00, 0x00, 0x00,
513     0x18, 0x00, 0x00, 0xB1, 0x0E, 0x00, 0x00, 0x00,
514     0x06, 0x00, 0x00, 0xA9, 0x2A, 0x00, 0x00, 0x00,
515     0x00, 0x00, 0x00, 0xA1, 0x0E, 0x00, 0x00, 0x00,
516     0x01, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x08, 0x00,
517     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
518     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
519     0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
520     0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
521   };
522   std::unique_ptr<NormalizedFile> f =
523       fromBinary(fileBytes, sizeof(fileBytes), "armv7");
524
525   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
526   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
527   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
528   EXPECT_EQ(f->sections.size(), 2UL);
529   const Section& text = f->sections[0];
530   EXPECT_TRUE(text.segmentName.equals("__TEXT"));
531   EXPECT_TRUE(text.sectionName.equals("__text"));
532   EXPECT_EQ(text.type, S_REGULAR);
533   EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
534                                       | S_ATTR_SOME_INSTRUCTIONS));
535   EXPECT_EQ(text.alignment, 2U);
536   EXPECT_EQ(text.address, Hex64(0x0));
537   EXPECT_EQ(text.content.size(), 42UL);
538   EXPECT_EQ((int)(text.content[0]), 0x80);
539   EXPECT_EQ((int)(text.content[1]), 0xB5);
540   EXPECT_TRUE(text.indirectSymbols.empty());
541   EXPECT_EQ(text.relocations.size(), 5UL);
542   const Relocation& call = text.relocations[0];
543   EXPECT_EQ(call.offset, Hex32(0x18));
544   EXPECT_EQ(call.scattered, false);
545   EXPECT_EQ(call.type, ARM_THUMB_RELOC_BR22);
546   EXPECT_EQ(call.length, 2);
547   EXPECT_EQ(call.isExtern, true);
548   EXPECT_EQ(call.symbol, 1U);
549   const Relocation& movt = text.relocations[1];
550   EXPECT_EQ(movt.offset, Hex32(0xA));
551   EXPECT_EQ(movt.scattered, true);
552   EXPECT_EQ(movt.type, ARM_RELOC_HALF_SECTDIFF);
553   EXPECT_EQ(movt.length, 3);
554   EXPECT_EQ(movt.value, Hex32(0x2A));
555   const Relocation& movtPair = text.relocations[2];
556   EXPECT_EQ(movtPair.offset, Hex32(0x18));
557   EXPECT_EQ(movtPair.scattered, true);
558   EXPECT_EQ(movtPair.type, ARM_RELOC_PAIR);
559   EXPECT_EQ(movtPair.length, 3);
560   EXPECT_EQ(movtPair.value, Hex32(0xE));
561   const Relocation& movw = text.relocations[3];
562   EXPECT_EQ(movw.offset, Hex32(0x6));
563   EXPECT_EQ(movw.scattered, true);
564   EXPECT_EQ(movw.type, ARM_RELOC_HALF_SECTDIFF);
565   EXPECT_EQ(movw.length, 2);
566   EXPECT_EQ(movw.value, Hex32(0x2A));
567   const Relocation& movwPair = text.relocations[4];
568   EXPECT_EQ(movwPair.offset, Hex32(0x0));
569   EXPECT_EQ(movwPair.scattered, true);
570   EXPECT_EQ(movwPair.type, ARM_RELOC_PAIR);
571   EXPECT_EQ(movwPair.length, 2);
572   EXPECT_EQ(movwPair.value, Hex32(0xE));
573
574   const Section& cstring = f->sections[1];
575   EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
576   EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
577   EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
578   EXPECT_EQ(cstring.attributes, SectionAttr(0));
579   EXPECT_EQ(cstring.alignment, 0U);
580   EXPECT_EQ(cstring.address, Hex64(0x02A));
581   EXPECT_EQ(cstring.content.size(), 7UL);
582   EXPECT_EQ((int)(cstring.content[0]), 0x68);
583   EXPECT_EQ((int)(cstring.content[1]), 0x65);
584   EXPECT_EQ((int)(cstring.content[2]), 0x6c);
585   EXPECT_TRUE(cstring.indirectSymbols.empty());
586   EXPECT_TRUE(cstring.relocations.empty());
587
588   EXPECT_EQ(f->localSymbols.size(), 0UL);
589   EXPECT_EQ(f->globalSymbols.size(), 1UL);
590   const Symbol& mainLabel = f->globalSymbols[0];
591   EXPECT_TRUE(mainLabel.name.equals("_main"));
592   EXPECT_EQ(mainLabel.type, N_SECT);
593   EXPECT_EQ(mainLabel.sect, 1);
594   EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
595   EXPECT_EQ(mainLabel.value, Hex64(0x0));
596   EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
597   const Symbol& printfLabel = f->undefinedSymbols[0];
598   EXPECT_TRUE(printfLabel.name.equals("_printf"));
599   EXPECT_EQ(printfLabel.type, N_UNDF);
600   EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
601 }
602
603
604 TEST(BinaryReaderTest, hello_obj_ppc) {
605   FILEBYTES = {
606     0xFE, 0xED, 0xFA, 0xCE, 0x00, 0x00, 0x00, 0x12,
607     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
608     0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x28,
609     0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
610     0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00,
611     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613     0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x01, 0x44,
614     0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07,
615     0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02,
616     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
617     0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618     0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
619     0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621     0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x44,
622     0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x90,
623     0x00, 0x00, 0x00, 0x05, 0x80, 0x00, 0x04, 0x00,
624     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625     0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
626     0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
627     0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
628     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629     0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07,
630     0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00, 0x02,
631     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632     0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
633     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
634     0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xB8,
635     0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xD0,
636     0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B,
637     0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
638     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
640     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
641     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
643     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646     0x00, 0x00, 0x00, 0x00, 0x7C, 0x08, 0x02, 0xA6,
647     0xBF, 0xC1, 0xFF, 0xF8, 0x90, 0x01, 0x00, 0x08,
648     0x94, 0x21, 0xFF, 0xB0, 0x7C, 0x3E, 0x0B, 0x78,
649     0x42, 0x9F, 0x00, 0x05, 0x7F, 0xE8, 0x02, 0xA6,
650     0x3C, 0x5F, 0x00, 0x00, 0x38, 0x62, 0x00, 0x2C,
651     0x4B, 0xFF, 0xFF, 0xDD, 0x38, 0x00, 0x00, 0x00,
652     0x7C, 0x03, 0x03, 0x78, 0x80, 0x21, 0x00, 0x00,
653     0x80, 0x01, 0x00, 0x08, 0x7C, 0x08, 0x03, 0xA6,
654     0xBB, 0xC1, 0xFF, 0xF8, 0x4E, 0x80, 0x00, 0x20,
655     0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00,
656     0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0xD3,
657     0xAB, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x44,
658     0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
659     0xAC, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x44,
660     0xA1, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x18,
661     0x00, 0x00, 0x00, 0x01, 0x0F, 0x01, 0x00, 0x00,
662     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
663     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
664     0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
665     0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
666   };
667   std::unique_ptr<NormalizedFile> f =
668       fromBinary(fileBytes, sizeof(fileBytes), "ppc");
669
670   EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
671   EXPECT_EQ((int)(f->fileType), MH_OBJECT);
672   EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
673   EXPECT_EQ(f->sections.size(), 2UL);
674   const Section& text = f->sections[0];
675   EXPECT_TRUE(text.segmentName.equals("__TEXT"));
676   EXPECT_TRUE(text.sectionName.equals("__text"));
677   EXPECT_EQ(text.type, S_REGULAR);
678   EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
679                                       | S_ATTR_SOME_INSTRUCTIONS));
680   EXPECT_EQ(text.alignment, 2U);
681   EXPECT_EQ(text.address, Hex64(0x0));
682   EXPECT_EQ(text.content.size(), 68UL);
683   EXPECT_EQ((int)(text.content[0]), 0x7C);
684   EXPECT_EQ((int)(text.content[1]), 0x08);
685   EXPECT_TRUE(text.indirectSymbols.empty());
686   EXPECT_EQ(text.relocations.size(), 5UL);
687   const Relocation& bl = text.relocations[0];
688   EXPECT_EQ(bl.offset, Hex32(0x24));
689   EXPECT_EQ(bl.type, PPC_RELOC_BR24);
690   EXPECT_EQ(bl.length, 2);
691   EXPECT_EQ(bl.isExtern, true);
692   EXPECT_EQ(bl.symbol, 1U);
693   const Relocation& lo = text.relocations[1];
694   EXPECT_EQ(lo.offset, Hex32(0x20));
695   EXPECT_EQ(lo.scattered, true);
696   EXPECT_EQ(lo.type, PPC_RELOC_LO16_SECTDIFF);
697   EXPECT_EQ(lo.length, 2);
698   EXPECT_EQ(lo.value, Hex32(0x44));
699   const Relocation& loPair = text.relocations[2];
700   EXPECT_EQ(loPair.offset, Hex32(0x0));
701   EXPECT_EQ(loPair.scattered, true);
702   EXPECT_EQ(loPair.type, PPC_RELOC_PAIR);
703   EXPECT_EQ(loPair.length, 2);
704   EXPECT_EQ(loPair.value, Hex32(0x18));
705   const Relocation& ha = text.relocations[3];
706   EXPECT_EQ(ha.offset, Hex32(0x1C));
707   EXPECT_EQ(ha.scattered, true);
708   EXPECT_EQ(ha.type, PPC_RELOC_HA16_SECTDIFF);
709   EXPECT_EQ(ha.length, 2);
710   EXPECT_EQ(ha.value, Hex32(0x44));
711   const Relocation& haPair = text.relocations[4];
712   EXPECT_EQ(haPair.offset, Hex32(0x2c));
713   EXPECT_EQ(haPair.scattered, true);
714   EXPECT_EQ(haPair.type, PPC_RELOC_PAIR);
715   EXPECT_EQ(haPair.length, 2);
716   EXPECT_EQ(haPair.value, Hex32(0x18));
717
718   const Section& cstring = f->sections[1];
719   EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
720   EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
721   EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
722   EXPECT_EQ(cstring.attributes, SectionAttr(0));
723   EXPECT_EQ(cstring.alignment, 2U);
724   EXPECT_EQ(cstring.address, Hex64(0x044));
725   EXPECT_EQ(cstring.content.size(), 7UL);
726   EXPECT_EQ((int)(cstring.content[0]), 0x68);
727   EXPECT_EQ((int)(cstring.content[1]), 0x65);
728   EXPECT_EQ((int)(cstring.content[2]), 0x6c);
729   EXPECT_TRUE(cstring.indirectSymbols.empty());
730   EXPECT_TRUE(cstring.relocations.empty());
731
732   EXPECT_EQ(f->localSymbols.size(), 0UL);
733   EXPECT_EQ(f->globalSymbols.size(), 1UL);
734   const Symbol& mainLabel = f->globalSymbols[0];
735   EXPECT_TRUE(mainLabel.name.equals("_main"));
736   EXPECT_EQ(mainLabel.type, N_SECT);
737   EXPECT_EQ(mainLabel.sect, 1);
738   EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
739   EXPECT_EQ(mainLabel.value, Hex64(0x0));
740   EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
741   const Symbol& printfLabel = f->undefinedSymbols[0];
742   EXPECT_TRUE(printfLabel.name.equals("_printf"));
743   EXPECT_EQ(printfLabel.type, N_UNDF);
744   EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
745
746   writeBinary(*f, "/tmp/foo.o");
747
748 }