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