1 //===- lld/unittest/MachOTests/MachONormalizedFileBinaryReaderTests.cpp ---===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "gtest/gtest.h"
11 #include "../../lib/ReaderWriter/MachO/MachONormalizedFile.h"
12 #include "llvm/Support/MachO.h"
16 using llvm::StringRef;
17 using llvm::MemoryBuffer;
20 using namespace lld::mach_o::normalized;
21 using namespace llvm::MachO;
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));
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.
38 #define FILEBYTES __declspec(align(64)) const uint8_t fileBytes[]
40 #define FILEBYTES const uint8_t fileBytes[] __attribute__((aligned(64)))
43 TEST(BinaryReaderTest, empty_obj_x86_64) {
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());
79 TEST(BinaryReaderTest, empty_obj_x86) {
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());
111 TEST(BinaryReaderTest, empty_obj_ppc) {
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());
143 TEST(BinaryReaderTest, empty_obj_armv7) {
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());
174 TEST(BinaryReaderTest, empty_obj_x86_64_arm7) {
176 #include "empty_obj_x86_armv7.txt"
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());
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());
197 TEST(BinaryReaderTest, hello_obj_x86_64) {
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");
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);
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());
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));
330 TEST(BinaryReaderTest, hello_obj_x86) {
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
389 std::unique_ptr<NormalizedFile> f =
390 fromBinary(fileBytes, sizeof(fileBytes), "i386");
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);
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());
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));
462 TEST(BinaryReaderTest, hello_obj_armv7) {
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
522 std::unique_ptr<NormalizedFile> f =
523 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
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));
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());
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));
604 TEST(BinaryReaderTest, hello_obj_ppc) {
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
667 std::unique_ptr<NormalizedFile> f =
668 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
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));
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());
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));
746 writeBinary(*f, "/tmp/foo.o");