blob: 6827a732fbd893fd24b4b31d54c0dcf68cd2474c [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"
Nick Kledzike34182f2013-11-06 21:36:55 +000011#include "../../lib/ReaderWriter/MachO/MachONormalizedFile.h"
Shankar Easwaran2b67fca2014-10-18 05:33:55 +000012#include "llvm/Support/MachO.h"
Nick Kledzike34182f2013-11-06 21:36:55 +000013#include <assert.h>
14#include <vector>
15
16using llvm::StringRef;
17using llvm::MemoryBuffer;
18using llvm::ErrorOr;
19
20using namespace lld::mach_o::normalized;
21using namespace llvm::MachO;
22
Rui Ueyama7c13c442014-01-13 23:21:33 +000023static std::unique_ptr<NormalizedFile>
Joey Gouly010b3762014-01-14 22:32:38 +000024fromBinary(const uint8_t bytes[], unsigned length, StringRef archStr) {
Nick Kledzike34182f2013-11-06 21:36:55 +000025 StringRef sr((const char*)bytes, length);
26 std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(sr, "", false));
Joey Gouly010b3762014-01-14 22:32:38 +000027 ErrorOr<std::unique_ptr<NormalizedFile>> r =
28 lld::mach_o::normalized::readBinary(
29 mb, lld::MachOLinkingContext::archFromName(archStr));
Nick Kledzike34182f2013-11-06 21:36:55 +000030 EXPECT_FALSE(!r);
31 return std::move(*r);
32}
33
Rui Ueyamaa81cb052014-11-07 02:54:52 +000034// 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
Nick Kledzike34182f2013-11-06 21:36:55 +000042
43TEST(BinaryReaderTest, empty_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000044 FILEBYTES = {
Rui Ueyama7c13c442014-01-13 23:21:33 +000045 0xcf, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x01,
Nick Kledzike34182f2013-11-06 21:36:55 +000046 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000047 0x01, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000048 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000049 0x19, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000054 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000055 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,
Nick Kledzike34182f2013-11-06 21:36:55 +000066 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +000068 std::unique_ptr<NormalizedFile> f =
69 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Nick Kledzike34182f2013-11-06 21:36:55 +000070 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
79TEST(BinaryReaderTest, empty_obj_x86) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000080 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +000081 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000100 std::unique_ptr<NormalizedFile> f =
101 fromBinary(fileBytes, sizeof(fileBytes), "i386");
Nick Kledzike34182f2013-11-06 21:36:55 +0000102 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
111TEST(BinaryReaderTest, empty_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000112 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000113 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000132 std::unique_ptr<NormalizedFile> f =
133 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Nick Kledzike34182f2013-11-06 21:36:55 +0000134 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
143TEST(BinaryReaderTest, empty_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000144 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000145 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000164 std::unique_ptr<NormalizedFile> f =
165 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Nick Kledzike34182f2013-11-06 21:36:55 +0000166 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
Joey Gouly010b3762014-01-14 22:32:38 +0000174TEST(BinaryReaderTest, empty_obj_x86_64_arm7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000175 FILEBYTES = {
Joey Gouly010b3762014-01-14 22:32:38 +0000176#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());
Nick Kledzike34182f2013-11-06 21:36:55 +0000186
Joey Gouly010b3762014-01-14 22:32:38 +0000187 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}
Nick Kledzike34182f2013-11-06 21:36:55 +0000196
197TEST(BinaryReaderTest, hello_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000198 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000199 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000263 std::unique_ptr<NormalizedFile> f =
264 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000265
Nick Kledzike34182f2013-11-06 21:36:55 +0000266 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000274 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000275 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000276 EXPECT_EQ((uint16_t)text.alignment, 16U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000277 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000278 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000295
Nick Kledzike34182f2013-11-06 21:36:55 +0000296 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));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000301 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000302 EXPECT_EQ(cstring.address, Hex64(0x02D));
Nick Kledzike34182f2013-11-06 21:36:55 +0000303 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
330TEST(BinaryReaderTest, hello_obj_x86) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000331 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000332 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000389 std::unique_ptr<NormalizedFile> f =
390 fromBinary(fileBytes, sizeof(fileBytes), "i386");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000391
Nick Kledzike34182f2013-11-06 21:36:55 +0000392 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000400 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000401 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000402 EXPECT_EQ((uint16_t)text.alignment, 16U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000403 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000404 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000431
Nick Kledzike34182f2013-11-06 21:36:55 +0000432 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));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000437 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000438 EXPECT_EQ(cstring.address, Hex64(0x030));
Nick Kledzike34182f2013-11-06 21:36:55 +0000439 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
462TEST(BinaryReaderTest, hello_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000463 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000464 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000522 std::unique_ptr<NormalizedFile> f =
523 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000524
Nick Kledzike34182f2013-11-06 21:36:55 +0000525 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000533 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000534 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000535 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000536 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000537 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));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000573
Nick Kledzike34182f2013-11-06 21:36:55 +0000574 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));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000579 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000580 EXPECT_EQ(cstring.address, Hex64(0x02A));
Nick Kledzike34182f2013-11-06 21:36:55 +0000581 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
604TEST(BinaryReaderTest, hello_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000605 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000606 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 };
Joey Gouly010b3762014-01-14 22:32:38 +0000667 std::unique_ptr<NormalizedFile> f =
668 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000669
Nick Kledzike34182f2013-11-06 21:36:55 +0000670 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);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000678 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000679 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000680 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000681 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000682 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));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000717
Nick Kledzike34182f2013-11-06 21:36:55 +0000718 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));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000723 EXPECT_EQ((uint16_t)cstring.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000724 EXPECT_EQ(cstring.address, Hex64(0x044));
Nick Kledzike34182f2013-11-06 21:36:55 +0000725 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());
Rui Ueyama7c13c442014-01-13 23:21:33 +0000731
Nick Kledzike34182f2013-11-06 21:36:55 +0000732 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));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000745
Nick Kledzike34182f2013-11-06 21:36:55 +0000746 writeBinary(*f, "/tmp/foo.o");
747
748}