blob: ea505f864811bf251cc6ed725021f2cd39e72aed [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
14using llvm::StringRef;
15using llvm::MemoryBuffer;
16using llvm::ErrorOr;
17
18using namespace lld::mach_o::normalized;
19using namespace llvm::MachO;
20
Rui Ueyama7c13c442014-01-13 23:21:33 +000021static std::unique_ptr<NormalizedFile>
Joey Gouly010b3762014-01-14 22:32:38 +000022fromBinary(const uint8_t bytes[], unsigned length, StringRef archStr) {
Nick Kledzike34182f2013-11-06 21:36:55 +000023 StringRef sr((const char*)bytes, length);
24 std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(sr, "", false));
Joey Gouly010b3762014-01-14 22:32:38 +000025 ErrorOr<std::unique_ptr<NormalizedFile>> r =
26 lld::mach_o::normalized::readBinary(
27 mb, lld::MachOLinkingContext::archFromName(archStr));
Nick Kledzike34182f2013-11-06 21:36:55 +000028 EXPECT_FALSE(!r);
29 return std::move(*r);
30}
31
Rui Ueyamaa81cb052014-11-07 02:54:52 +000032// The Mach-O object reader uses functions such as read32 or read64
33// which don't allow unaligned access. Our in-memory object file
34// needs to be aligned to a larger boundary than uint8_t's.
35#if _MSC_VER
36#define FILEBYTES __declspec(align(64)) const uint8_t fileBytes[]
37#else
38#define FILEBYTES const uint8_t fileBytes[] __attribute__((aligned(64)))
39#endif
Nick Kledzike34182f2013-11-06 21:36:55 +000040
41TEST(BinaryReaderTest, empty_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000042 FILEBYTES = {
Rui Ueyama7c13c442014-01-13 23:21:33 +000043 0xcf, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x01,
Nick Kledzike34182f2013-11-06 21:36:55 +000044 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000045 0x01, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000046 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000047 0x19, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000052 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
55 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x5f, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58 0x5f, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000064 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +000066 std::unique_ptr<NormalizedFile> f =
67 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Nick Kledzike34182f2013-11-06 21:36:55 +000068 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
69 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
70 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
71 EXPECT_TRUE(f->localSymbols.empty());
72 EXPECT_TRUE(f->globalSymbols.empty());
73 EXPECT_TRUE(f->undefinedSymbols.empty());
74}
75
Nick Kledzike34182f2013-11-06 21:36:55 +000076TEST(BinaryReaderTest, empty_obj_x86) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000077 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +000078 0xce, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x00,
79 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
80 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
81 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
82 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
87 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
89 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
91 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +000097 std::unique_ptr<NormalizedFile> f =
98 fromBinary(fileBytes, sizeof(fileBytes), "i386");
Nick Kledzike34182f2013-11-06 21:36:55 +000099 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
100 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
101 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
102 EXPECT_TRUE(f->localSymbols.empty());
103 EXPECT_TRUE(f->globalSymbols.empty());
104 EXPECT_TRUE(f->undefinedSymbols.empty());
105}
106
Nick Kledzike34182f2013-11-06 21:36:55 +0000107TEST(BinaryReaderTest, empty_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000108 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000109 0xfe, 0xed, 0xfa, 0xce, 0x00, 0x00, 0x00, 0x12,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
111 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c,
112 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
113 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
118 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01,
119 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
120 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
122 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000128 std::unique_ptr<NormalizedFile> f =
129 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Nick Kledzike34182f2013-11-06 21:36:55 +0000130 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
131 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
132 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
133 EXPECT_TRUE(f->localSymbols.empty());
134 EXPECT_TRUE(f->globalSymbols.empty());
135 EXPECT_TRUE(f->undefinedSymbols.empty());
136}
137
Nick Kledzike34182f2013-11-06 21:36:55 +0000138TEST(BinaryReaderTest, empty_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000139 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000140 0xce, 0xfa, 0xed, 0xfe, 0x0c, 0x00, 0x00, 0x00,
141 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
142 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
143 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
144 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
149 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
151 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
153 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000159 std::unique_ptr<NormalizedFile> f =
160 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Nick Kledzike34182f2013-11-06 21:36:55 +0000161 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
162 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
163 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
164 EXPECT_TRUE(f->localSymbols.empty());
165 EXPECT_TRUE(f->globalSymbols.empty());
166 EXPECT_TRUE(f->undefinedSymbols.empty());
167}
168
Joey Gouly010b3762014-01-14 22:32:38 +0000169TEST(BinaryReaderTest, empty_obj_x86_64_arm7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000170 FILEBYTES = {
Joey Gouly010b3762014-01-14 22:32:38 +0000171#include "empty_obj_x86_armv7.txt"
172 };
173 std::unique_ptr<NormalizedFile> f =
174 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
175 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
176 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
177 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
178 EXPECT_TRUE(f->localSymbols.empty());
179 EXPECT_TRUE(f->globalSymbols.empty());
180 EXPECT_TRUE(f->undefinedSymbols.empty());
Nick Kledzike34182f2013-11-06 21:36:55 +0000181
Joey Gouly010b3762014-01-14 22:32:38 +0000182 std::unique_ptr<NormalizedFile> f2 =
183 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
184 EXPECT_EQ(f2->arch, lld::MachOLinkingContext::arch_armv7);
185 EXPECT_EQ((int)(f2->fileType), MH_OBJECT);
186 EXPECT_EQ((int)(f2->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
187 EXPECT_TRUE(f2->localSymbols.empty());
188 EXPECT_TRUE(f2->globalSymbols.empty());
189 EXPECT_TRUE(f2->undefinedSymbols.empty());
190}
Nick Kledzike34182f2013-11-06 21:36:55 +0000191
192TEST(BinaryReaderTest, hello_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000193 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000194 0xCF, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x01,
195 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
196 0x03, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00,
197 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0x19, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
206 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x5F, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x70, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
214 0xA4, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
215 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
218 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x9D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
228 0xB4, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
229 0xE4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
230 0x0B, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
232 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
233 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x55, 0x48, 0x89, 0xE5, 0x48, 0x83, 0xEC, 0x10,
241 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00, 0xC7,
242 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00,
243 0xE8, 0x00, 0x00, 0x00, 0x00, 0xB9, 0x00, 0x00,
244 0x00, 0x00, 0x89, 0x45, 0xF8, 0x89, 0xC8, 0x48,
245 0x83, 0xC4, 0x10, 0x5D, 0xC3, 0x68, 0x65, 0x6C,
246 0x6C, 0x6F, 0x0A, 0x00, 0x19, 0x00, 0x00, 0x00,
247 0x02, 0x00, 0x00, 0x2D, 0x0B, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x1D, 0x0F, 0x00, 0x00, 0x00,
249 0x0E, 0x02, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
251 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
253 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6D, 0x61,
255 0x69, 0x6E, 0x00, 0x5F, 0x70, 0x72, 0x69, 0x6E,
256 0x74, 0x66, 0x00, 0x4C, 0x5F, 0x2E, 0x73, 0x74,
257 0x72, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000258 std::unique_ptr<NormalizedFile> f =
259 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000260
Nick Kledzike34182f2013-11-06 21:36:55 +0000261 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
262 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
263 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
264 EXPECT_EQ(f->sections.size(), 2UL);
265 const Section& text = f->sections[0];
266 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
267 EXPECT_TRUE(text.sectionName.equals("__text"));
268 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000269 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000270 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000271 EXPECT_EQ((uint16_t)text.alignment, 16U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000272 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000273 EXPECT_EQ(text.content.size(), 45UL);
274 EXPECT_EQ((int)(text.content[0]), 0x55);
275 EXPECT_EQ((int)(text.content[1]), 0x48);
276 EXPECT_TRUE(text.indirectSymbols.empty());
277 EXPECT_EQ(text.relocations.size(), 2UL);
278 const Relocation& call = text.relocations[0];
279 EXPECT_EQ(call.offset, Hex32(0x19));
280 EXPECT_EQ(call.type, X86_64_RELOC_BRANCH);
281 EXPECT_EQ(call.length, 2);
282 EXPECT_EQ(call.isExtern, true);
283 EXPECT_EQ(call.symbol, 2U);
284 const Relocation& str = text.relocations[1];
285 EXPECT_EQ(str.offset, Hex32(0xB));
286 EXPECT_EQ(str.type, X86_64_RELOC_SIGNED);
287 EXPECT_EQ(str.length, 2);
288 EXPECT_EQ(str.isExtern, true);
289 EXPECT_EQ(str.symbol, 0U);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000290
Nick Kledzike34182f2013-11-06 21:36:55 +0000291 const Section& cstring = f->sections[1];
292 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
293 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
294 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
295 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000296 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000297 EXPECT_EQ(cstring.address, Hex64(0x02D));
Nick Kledzike34182f2013-11-06 21:36:55 +0000298 EXPECT_EQ(cstring.content.size(), 7UL);
299 EXPECT_EQ((int)(cstring.content[0]), 0x68);
300 EXPECT_EQ((int)(cstring.content[1]), 0x65);
301 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
302 EXPECT_TRUE(cstring.indirectSymbols.empty());
303 EXPECT_TRUE(cstring.relocations.empty());
304
305 EXPECT_EQ(f->localSymbols.size(), 1UL);
306 const Symbol& strLabel = f->localSymbols[0];
307 EXPECT_EQ(strLabel.type, N_SECT);
308 EXPECT_EQ(strLabel.sect, 2);
309 EXPECT_EQ(strLabel.value, Hex64(0x2D));
310 EXPECT_EQ(f->globalSymbols.size(), 1UL);
311 const Symbol& mainLabel = f->globalSymbols[0];
312 EXPECT_TRUE(mainLabel.name.equals("_main"));
313 EXPECT_EQ(mainLabel.type, N_SECT);
314 EXPECT_EQ(mainLabel.sect, 1);
315 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
316 EXPECT_EQ(mainLabel.value, Hex64(0x0));
317 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
318 const Symbol& printfLabel = f->undefinedSymbols[0];
319 EXPECT_TRUE(printfLabel.name.equals("_printf"));
320 EXPECT_EQ(printfLabel.type, N_UNDF);
321 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
322}
323
Nick Kledzike34182f2013-11-06 21:36:55 +0000324TEST(BinaryReaderTest, hello_obj_x86) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000325 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000326 0xCE, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x00,
327 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
328 0x03, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00,
329 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
330 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x37, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
334 0x37, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
335 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
337 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
339 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x30, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
342 0x04, 0x00, 0x00, 0x00, 0x7C, 0x01, 0x00, 0x00,
343 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
346 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
350 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
354 0x18, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00,
355 0x02, 0x00, 0x00, 0x00, 0xAC, 0x01, 0x00, 0x00,
356 0x10, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
357 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
360 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x55, 0x89, 0xE5, 0x83,
367 0xEC, 0x18, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x58,
368 0x8D, 0x80, 0x25, 0x00, 0x00, 0x00, 0xC7, 0x45,
369 0xFC, 0x00, 0x00, 0x00, 0x00, 0x89, 0x04, 0x24,
370 0xE8, 0xDF, 0xFF, 0xFF, 0xFF, 0xB9, 0x00, 0x00,
371 0x00, 0x00, 0x89, 0x45, 0xF8, 0x89, 0xC8, 0x83,
372 0xC4, 0x18, 0x5D, 0xC3, 0x68, 0x65, 0x6C, 0x6C,
373 0x6F, 0x0A, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00,
374 0x01, 0x00, 0x00, 0x0D, 0x0E, 0x00, 0x00, 0xA4,
375 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1,
376 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
377 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6D, 0x61,
380 0x69, 0x6E, 0x00, 0x5F, 0x70, 0x72, 0x69, 0x6E,
381 0x74, 0x66, 0x00, 0x00
382 };
Joey Gouly010b3762014-01-14 22:32:38 +0000383 std::unique_ptr<NormalizedFile> f =
384 fromBinary(fileBytes, sizeof(fileBytes), "i386");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000385
Nick Kledzike34182f2013-11-06 21:36:55 +0000386 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
387 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
388 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
389 EXPECT_EQ(f->sections.size(), 2UL);
390 const Section& text = f->sections[0];
391 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
392 EXPECT_TRUE(text.sectionName.equals("__text"));
393 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000394 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000395 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000396 EXPECT_EQ((uint16_t)text.alignment, 16U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000397 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000398 EXPECT_EQ(text.content.size(), 48UL);
399 EXPECT_EQ((int)(text.content[0]), 0x55);
400 EXPECT_EQ((int)(text.content[1]), 0x89);
401 EXPECT_TRUE(text.indirectSymbols.empty());
402 EXPECT_EQ(text.relocations.size(), 3UL);
403 const Relocation& call = text.relocations[0];
404 EXPECT_EQ(call.offset, Hex32(0x1D));
405 EXPECT_EQ(call.scattered, false);
406 EXPECT_EQ(call.type, GENERIC_RELOC_VANILLA);
407 EXPECT_EQ(call.pcRel, true);
408 EXPECT_EQ(call.length, 2);
409 EXPECT_EQ(call.isExtern, true);
410 EXPECT_EQ(call.symbol, 1U);
411 const Relocation& sectDiff = text.relocations[1];
412 EXPECT_EQ(sectDiff.offset, Hex32(0xE));
413 EXPECT_EQ(sectDiff.scattered, true);
414 EXPECT_EQ(sectDiff.type, GENERIC_RELOC_LOCAL_SECTDIFF);
415 EXPECT_EQ(sectDiff.pcRel, false);
416 EXPECT_EQ(sectDiff.length, 2);
417 EXPECT_EQ(sectDiff.value, 0x30U);
418 const Relocation& pair = text.relocations[2];
419 EXPECT_EQ(pair.offset, Hex32(0x0));
420 EXPECT_EQ(pair.scattered, true);
421 EXPECT_EQ(pair.type, GENERIC_RELOC_PAIR);
422 EXPECT_EQ(pair.pcRel, false);
423 EXPECT_EQ(pair.length, 2);
424 EXPECT_EQ(pair.value, 0x0BU);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000425
Nick Kledzike34182f2013-11-06 21:36:55 +0000426 const Section& cstring = f->sections[1];
427 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
428 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
429 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
430 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000431 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000432 EXPECT_EQ(cstring.address, Hex64(0x030));
Nick Kledzike34182f2013-11-06 21:36:55 +0000433 EXPECT_EQ(cstring.content.size(), 7UL);
434 EXPECT_EQ((int)(cstring.content[0]), 0x68);
435 EXPECT_EQ((int)(cstring.content[1]), 0x65);
436 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
437 EXPECT_TRUE(cstring.indirectSymbols.empty());
438 EXPECT_TRUE(cstring.relocations.empty());
439
440 EXPECT_EQ(f->localSymbols.size(), 0UL);
441 EXPECT_EQ(f->globalSymbols.size(), 1UL);
442 const Symbol& mainLabel = f->globalSymbols[0];
443 EXPECT_TRUE(mainLabel.name.equals("_main"));
444 EXPECT_EQ(mainLabel.type, N_SECT);
445 EXPECT_EQ(mainLabel.sect, 1);
446 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
447 EXPECT_EQ(mainLabel.value, Hex64(0x0));
448 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
449 const Symbol& printfLabel = f->undefinedSymbols[0];
450 EXPECT_TRUE(printfLabel.name.equals("_printf"));
451 EXPECT_EQ(printfLabel.type, N_UNDF);
452 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
453}
454
Nick Kledzike34182f2013-11-06 21:36:55 +0000455TEST(BinaryReaderTest, hello_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000456 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000457 0xCE, 0xFA, 0xED, 0xFE, 0x0C, 0x00, 0x00, 0x00,
458 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
459 0x03, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00,
460 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
461 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x31, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
465 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
466 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
467 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
468 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
470 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x2A, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
473 0x02, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
474 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
477 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
481 0x6E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
485 0x18, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00,
486 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00,
487 0x10, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
488 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
491 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 0x00, 0x00, 0x00, 0x00, 0x80, 0xB5, 0x6F, 0x46,
498 0x82, 0xB0, 0x40, 0xF2, 0x18, 0x00, 0xC0, 0xF2,
499 0x00, 0x00, 0x78, 0x44, 0x00, 0x21, 0xC0, 0xF2,
500 0x00, 0x01, 0x01, 0x91, 0xFF, 0xF7, 0xF2, 0xFF,
501 0x00, 0x21, 0xC0, 0xF2, 0x00, 0x01, 0x00, 0x90,
502 0x08, 0x46, 0x02, 0xB0, 0x80, 0xBD, 0x68, 0x65,
503 0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00, 0x00, 0x00,
504 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x6D,
505 0x0A, 0x00, 0x00, 0xB9, 0x2A, 0x00, 0x00, 0x00,
506 0x18, 0x00, 0x00, 0xB1, 0x0E, 0x00, 0x00, 0x00,
507 0x06, 0x00, 0x00, 0xA9, 0x2A, 0x00, 0x00, 0x00,
508 0x00, 0x00, 0x00, 0xA1, 0x0E, 0x00, 0x00, 0x00,
509 0x01, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x08, 0x00,
510 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
511 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
512 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
513 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
514 };
Joey Gouly010b3762014-01-14 22:32:38 +0000515 std::unique_ptr<NormalizedFile> f =
516 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000517
Nick Kledzike34182f2013-11-06 21:36:55 +0000518 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
519 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
520 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
521 EXPECT_EQ(f->sections.size(), 2UL);
522 const Section& text = f->sections[0];
523 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
524 EXPECT_TRUE(text.sectionName.equals("__text"));
525 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000526 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000527 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000528 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000529 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000530 EXPECT_EQ(text.content.size(), 42UL);
531 EXPECT_EQ((int)(text.content[0]), 0x80);
532 EXPECT_EQ((int)(text.content[1]), 0xB5);
533 EXPECT_TRUE(text.indirectSymbols.empty());
534 EXPECT_EQ(text.relocations.size(), 5UL);
535 const Relocation& call = text.relocations[0];
536 EXPECT_EQ(call.offset, Hex32(0x18));
537 EXPECT_EQ(call.scattered, false);
538 EXPECT_EQ(call.type, ARM_THUMB_RELOC_BR22);
539 EXPECT_EQ(call.length, 2);
540 EXPECT_EQ(call.isExtern, true);
541 EXPECT_EQ(call.symbol, 1U);
542 const Relocation& movt = text.relocations[1];
543 EXPECT_EQ(movt.offset, Hex32(0xA));
544 EXPECT_EQ(movt.scattered, true);
545 EXPECT_EQ(movt.type, ARM_RELOC_HALF_SECTDIFF);
546 EXPECT_EQ(movt.length, 3);
547 EXPECT_EQ(movt.value, Hex32(0x2A));
548 const Relocation& movtPair = text.relocations[2];
549 EXPECT_EQ(movtPair.offset, Hex32(0x18));
550 EXPECT_EQ(movtPair.scattered, true);
551 EXPECT_EQ(movtPair.type, ARM_RELOC_PAIR);
552 EXPECT_EQ(movtPair.length, 3);
553 EXPECT_EQ(movtPair.value, Hex32(0xE));
554 const Relocation& movw = text.relocations[3];
555 EXPECT_EQ(movw.offset, Hex32(0x6));
556 EXPECT_EQ(movw.scattered, true);
557 EXPECT_EQ(movw.type, ARM_RELOC_HALF_SECTDIFF);
558 EXPECT_EQ(movw.length, 2);
559 EXPECT_EQ(movw.value, Hex32(0x2A));
560 const Relocation& movwPair = text.relocations[4];
561 EXPECT_EQ(movwPair.offset, Hex32(0x0));
562 EXPECT_EQ(movwPair.scattered, true);
563 EXPECT_EQ(movwPair.type, ARM_RELOC_PAIR);
564 EXPECT_EQ(movwPair.length, 2);
565 EXPECT_EQ(movwPair.value, Hex32(0xE));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000566
Nick Kledzike34182f2013-11-06 21:36:55 +0000567 const Section& cstring = f->sections[1];
568 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
569 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
570 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
571 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000572 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000573 EXPECT_EQ(cstring.address, Hex64(0x02A));
Nick Kledzike34182f2013-11-06 21:36:55 +0000574 EXPECT_EQ(cstring.content.size(), 7UL);
575 EXPECT_EQ((int)(cstring.content[0]), 0x68);
576 EXPECT_EQ((int)(cstring.content[1]), 0x65);
577 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
578 EXPECT_TRUE(cstring.indirectSymbols.empty());
579 EXPECT_TRUE(cstring.relocations.empty());
580
581 EXPECT_EQ(f->localSymbols.size(), 0UL);
582 EXPECT_EQ(f->globalSymbols.size(), 1UL);
583 const Symbol& mainLabel = f->globalSymbols[0];
584 EXPECT_TRUE(mainLabel.name.equals("_main"));
585 EXPECT_EQ(mainLabel.type, N_SECT);
586 EXPECT_EQ(mainLabel.sect, 1);
587 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
588 EXPECT_EQ(mainLabel.value, Hex64(0x0));
589 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
590 const Symbol& printfLabel = f->undefinedSymbols[0];
591 EXPECT_TRUE(printfLabel.name.equals("_printf"));
592 EXPECT_EQ(printfLabel.type, N_UNDF);
593 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
594}
595
Nick Kledzike34182f2013-11-06 21:36:55 +0000596TEST(BinaryReaderTest, hello_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000597 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000598 0xFE, 0xED, 0xFA, 0xCE, 0x00, 0x00, 0x00, 0x12,
599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
600 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x28,
601 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
602 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x01, 0x44,
606 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07,
607 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02,
608 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
609 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
611 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x44,
614 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x90,
615 0x00, 0x00, 0x00, 0x05, 0x80, 0x00, 0x04, 0x00,
616 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
618 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07,
622 0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00, 0x02,
623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
626 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xB8,
627 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xD0,
628 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B,
629 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
631 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
632 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
635 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638 0x00, 0x00, 0x00, 0x00, 0x7C, 0x08, 0x02, 0xA6,
639 0xBF, 0xC1, 0xFF, 0xF8, 0x90, 0x01, 0x00, 0x08,
640 0x94, 0x21, 0xFF, 0xB0, 0x7C, 0x3E, 0x0B, 0x78,
641 0x42, 0x9F, 0x00, 0x05, 0x7F, 0xE8, 0x02, 0xA6,
642 0x3C, 0x5F, 0x00, 0x00, 0x38, 0x62, 0x00, 0x2C,
643 0x4B, 0xFF, 0xFF, 0xDD, 0x38, 0x00, 0x00, 0x00,
644 0x7C, 0x03, 0x03, 0x78, 0x80, 0x21, 0x00, 0x00,
645 0x80, 0x01, 0x00, 0x08, 0x7C, 0x08, 0x03, 0xA6,
646 0xBB, 0xC1, 0xFF, 0xF8, 0x4E, 0x80, 0x00, 0x20,
647 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00,
648 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0xD3,
649 0xAB, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x44,
650 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
651 0xAC, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x44,
652 0xA1, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x18,
653 0x00, 0x00, 0x00, 0x01, 0x0F, 0x01, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
655 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
657 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
658 };
Joey Gouly010b3762014-01-14 22:32:38 +0000659 std::unique_ptr<NormalizedFile> f =
660 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000661
Nick Kledzike34182f2013-11-06 21:36:55 +0000662 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
663 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
664 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
665 EXPECT_EQ(f->sections.size(), 2UL);
666 const Section& text = f->sections[0];
667 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
668 EXPECT_TRUE(text.sectionName.equals("__text"));
669 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000670 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000671 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000672 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000673 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000674 EXPECT_EQ(text.content.size(), 68UL);
675 EXPECT_EQ((int)(text.content[0]), 0x7C);
676 EXPECT_EQ((int)(text.content[1]), 0x08);
677 EXPECT_TRUE(text.indirectSymbols.empty());
678 EXPECT_EQ(text.relocations.size(), 5UL);
679 const Relocation& bl = text.relocations[0];
680 EXPECT_EQ(bl.offset, Hex32(0x24));
681 EXPECT_EQ(bl.type, PPC_RELOC_BR24);
682 EXPECT_EQ(bl.length, 2);
683 EXPECT_EQ(bl.isExtern, true);
684 EXPECT_EQ(bl.symbol, 1U);
685 const Relocation& lo = text.relocations[1];
686 EXPECT_EQ(lo.offset, Hex32(0x20));
687 EXPECT_EQ(lo.scattered, true);
688 EXPECT_EQ(lo.type, PPC_RELOC_LO16_SECTDIFF);
689 EXPECT_EQ(lo.length, 2);
690 EXPECT_EQ(lo.value, Hex32(0x44));
691 const Relocation& loPair = text.relocations[2];
692 EXPECT_EQ(loPair.offset, Hex32(0x0));
693 EXPECT_EQ(loPair.scattered, true);
694 EXPECT_EQ(loPair.type, PPC_RELOC_PAIR);
695 EXPECT_EQ(loPair.length, 2);
696 EXPECT_EQ(loPair.value, Hex32(0x18));
697 const Relocation& ha = text.relocations[3];
698 EXPECT_EQ(ha.offset, Hex32(0x1C));
699 EXPECT_EQ(ha.scattered, true);
700 EXPECT_EQ(ha.type, PPC_RELOC_HA16_SECTDIFF);
701 EXPECT_EQ(ha.length, 2);
702 EXPECT_EQ(ha.value, Hex32(0x44));
703 const Relocation& haPair = text.relocations[4];
704 EXPECT_EQ(haPair.offset, Hex32(0x2c));
705 EXPECT_EQ(haPair.scattered, true);
706 EXPECT_EQ(haPair.type, PPC_RELOC_PAIR);
707 EXPECT_EQ(haPair.length, 2);
708 EXPECT_EQ(haPair.value, Hex32(0x18));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000709
Nick Kledzike34182f2013-11-06 21:36:55 +0000710 const Section& cstring = f->sections[1];
711 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
712 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
713 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
714 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000715 EXPECT_EQ((uint16_t)cstring.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000716 EXPECT_EQ(cstring.address, Hex64(0x044));
Nick Kledzike34182f2013-11-06 21:36:55 +0000717 EXPECT_EQ(cstring.content.size(), 7UL);
718 EXPECT_EQ((int)(cstring.content[0]), 0x68);
719 EXPECT_EQ((int)(cstring.content[1]), 0x65);
720 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
721 EXPECT_TRUE(cstring.indirectSymbols.empty());
722 EXPECT_TRUE(cstring.relocations.empty());
Rui Ueyama7c13c442014-01-13 23:21:33 +0000723
Nick Kledzike34182f2013-11-06 21:36:55 +0000724 EXPECT_EQ(f->localSymbols.size(), 0UL);
725 EXPECT_EQ(f->globalSymbols.size(), 1UL);
726 const Symbol& mainLabel = f->globalSymbols[0];
727 EXPECT_TRUE(mainLabel.name.equals("_main"));
728 EXPECT_EQ(mainLabel.type, N_SECT);
729 EXPECT_EQ(mainLabel.sect, 1);
730 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
731 EXPECT_EQ(mainLabel.value, Hex64(0x0));
732 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
733 const Symbol& printfLabel = f->undefinedSymbols[0];
734 EXPECT_TRUE(printfLabel.name.equals("_printf"));
735 EXPECT_EQ(printfLabel.type, N_UNDF);
736 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000737
Pete Cooperfefbd222016-03-30 23:10:39 +0000738 auto ec = writeBinary(*f, "/tmp/foo.o");
Pete Cooper8eaf62ca2016-03-30 23:28:49 +0000739 // FIXME: We want to do EXPECT_FALSE(ec) but that fails on some Windows bots,
740 // probably due to /tmp not being available.
741 // For now just check if an error happens as we need to mark it as checked.
742 bool failed = (bool)ec;
743 (void)failed;
Nick Kledzike34182f2013-11-06 21:36:55 +0000744}