blob: a3c445a93619ed449c1f90ecad9260af52915fdf [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"
Eugene Zelenko1a299ea2016-04-21 17:14:10 +000012#include "lld/ReaderWriter/MachOLinkingContext.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/Support/Error.h"
Shankar Easwaran2b67fca2014-10-18 05:33:55 +000015#include "llvm/Support/MachO.h"
Eugene Zelenko1a299ea2016-04-21 17:14:10 +000016#include "llvm/Support/MemoryBuffer.h"
17#include "llvm/Support/YAMLTraits.h"
18#include <cstdint>
19#include <memory>
Nick Kledzike34182f2013-11-06 21:36:55 +000020
21using llvm::StringRef;
22using llvm::MemoryBuffer;
Nick Kledzike34182f2013-11-06 21:36:55 +000023
24using namespace lld::mach_o::normalized;
25using namespace llvm::MachO;
26
Rui Ueyama7c13c442014-01-13 23:21:33 +000027static std::unique_ptr<NormalizedFile>
Joey Gouly010b3762014-01-14 22:32:38 +000028fromBinary(const uint8_t bytes[], unsigned length, StringRef archStr) {
Nick Kledzike34182f2013-11-06 21:36:55 +000029 StringRef sr((const char*)bytes, length);
30 std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(sr, "", false));
Pete Cooperc6e7b812016-03-30 23:58:24 +000031 llvm::Expected<std::unique_ptr<NormalizedFile>> r =
Joey Gouly010b3762014-01-14 22:32:38 +000032 lld::mach_o::normalized::readBinary(
33 mb, lld::MachOLinkingContext::archFromName(archStr));
Nick Kledzike34182f2013-11-06 21:36:55 +000034 EXPECT_FALSE(!r);
35 return std::move(*r);
36}
37
Rui Ueyamaa81cb052014-11-07 02:54:52 +000038// The Mach-O object reader uses functions such as read32 or read64
39// which don't allow unaligned access. Our in-memory object file
40// needs to be aligned to a larger boundary than uint8_t's.
41#if _MSC_VER
42#define FILEBYTES __declspec(align(64)) const uint8_t fileBytes[]
43#else
44#define FILEBYTES const uint8_t fileBytes[] __attribute__((aligned(64)))
45#endif
Nick Kledzike34182f2013-11-06 21:36:55 +000046
47TEST(BinaryReaderTest, empty_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000048 FILEBYTES = {
Rui Ueyama7c13c442014-01-13 23:21:33 +000049 0xcf, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x01,
Nick Kledzike34182f2013-11-06 21:36:55 +000050 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000051 0x01, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000052 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000053 0x19, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000058 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
61 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x5f, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x5f, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Nick Kledzike34182f2013-11-06 21:36:55 +000070 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
Rui Ueyama7c13c442014-01-13 23:21:33 +000071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +000072 std::unique_ptr<NormalizedFile> f =
73 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Nick Kledzike34182f2013-11-06 21:36:55 +000074 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
75 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
76 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
77 EXPECT_TRUE(f->localSymbols.empty());
78 EXPECT_TRUE(f->globalSymbols.empty());
79 EXPECT_TRUE(f->undefinedSymbols.empty());
80}
81
Nick Kledzike34182f2013-11-06 21:36:55 +000082TEST(BinaryReaderTest, empty_obj_x86) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +000083 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +000084 0xce, 0xfa, 0xed, 0xfe, 0x07, 0x00, 0x00, 0x00,
85 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
86 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
87 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
88 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
93 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
95 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
97 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000103 std::unique_ptr<NormalizedFile> f =
104 fromBinary(fileBytes, sizeof(fileBytes), "i386");
Nick Kledzike34182f2013-11-06 21:36:55 +0000105 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
106 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
107 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
108 EXPECT_TRUE(f->localSymbols.empty());
109 EXPECT_TRUE(f->globalSymbols.empty());
110 EXPECT_TRUE(f->undefinedSymbols.empty());
111}
112
Nick Kledzike34182f2013-11-06 21:36:55 +0000113TEST(BinaryReaderTest, empty_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000114 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000115 0xfe, 0xed, 0xfa, 0xce, 0x00, 0x00, 0x00, 0x12,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
117 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c,
118 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
119 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
124 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01,
125 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
126 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
128 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000134 std::unique_ptr<NormalizedFile> f =
135 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Nick Kledzike34182f2013-11-06 21:36:55 +0000136 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
137 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
138 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
139 EXPECT_TRUE(f->localSymbols.empty());
140 EXPECT_TRUE(f->globalSymbols.empty());
141 EXPECT_TRUE(f->undefinedSymbols.empty());
142}
143
Nick Kledzike34182f2013-11-06 21:36:55 +0000144TEST(BinaryReaderTest, empty_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000145 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000146 0xce, 0xfa, 0xed, 0xfe, 0x0c, 0x00, 0x00, 0x00,
147 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
148 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
149 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
150 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
155 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x74, 0x65,
157 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x54, 0x45,
159 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000165 std::unique_ptr<NormalizedFile> f =
166 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Nick Kledzike34182f2013-11-06 21:36:55 +0000167 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
168 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
169 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
170 EXPECT_TRUE(f->localSymbols.empty());
171 EXPECT_TRUE(f->globalSymbols.empty());
172 EXPECT_TRUE(f->undefinedSymbols.empty());
173}
174
Joey Gouly010b3762014-01-14 22:32:38 +0000175TEST(BinaryReaderTest, empty_obj_x86_64_arm7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000176 FILEBYTES = {
Joey Gouly010b3762014-01-14 22:32:38 +0000177#include "empty_obj_x86_armv7.txt"
178 };
179 std::unique_ptr<NormalizedFile> f =
180 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
181 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
182 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
183 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
184 EXPECT_TRUE(f->localSymbols.empty());
185 EXPECT_TRUE(f->globalSymbols.empty());
186 EXPECT_TRUE(f->undefinedSymbols.empty());
Nick Kledzike34182f2013-11-06 21:36:55 +0000187
Joey Gouly010b3762014-01-14 22:32:38 +0000188 std::unique_ptr<NormalizedFile> f2 =
189 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
190 EXPECT_EQ(f2->arch, lld::MachOLinkingContext::arch_armv7);
191 EXPECT_EQ((int)(f2->fileType), MH_OBJECT);
192 EXPECT_EQ((int)(f2->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
193 EXPECT_TRUE(f2->localSymbols.empty());
194 EXPECT_TRUE(f2->globalSymbols.empty());
195 EXPECT_TRUE(f2->undefinedSymbols.empty());
196}
Nick Kledzike34182f2013-11-06 21:36:55 +0000197
198TEST(BinaryReaderTest, hello_obj_x86_64) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000199 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000200 0xCF, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x01,
201 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
202 0x03, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00,
203 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x19, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
212 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x5F, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 0x70, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
220 0xA4, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
221 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
224 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x9D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
234 0xB4, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
235 0xE4, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
236 0x0B, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
238 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
239 0x02, 0x00, 0x00, 0x00, 0x01, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x55, 0x48, 0x89, 0xE5, 0x48, 0x83, 0xEC, 0x10,
247 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00, 0xC7,
248 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00,
249 0xE8, 0x00, 0x00, 0x00, 0x00, 0xB9, 0x00, 0x00,
250 0x00, 0x00, 0x89, 0x45, 0xF8, 0x89, 0xC8, 0x48,
251 0x83, 0xC4, 0x10, 0x5D, 0xC3, 0x68, 0x65, 0x6C,
252 0x6C, 0x6F, 0x0A, 0x00, 0x19, 0x00, 0x00, 0x00,
253 0x02, 0x00, 0x00, 0x2D, 0x0B, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x1D, 0x0F, 0x00, 0x00, 0x00,
255 0x0E, 0x02, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
257 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
259 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6D, 0x61,
261 0x69, 0x6E, 0x00, 0x5F, 0x70, 0x72, 0x69, 0x6E,
262 0x74, 0x66, 0x00, 0x4C, 0x5F, 0x2E, 0x73, 0x74,
263 0x72, 0x00, 0x00, 0x00 };
Joey Gouly010b3762014-01-14 22:32:38 +0000264 std::unique_ptr<NormalizedFile> f =
265 fromBinary(fileBytes, sizeof(fileBytes), "x86_64");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000266
Nick Kledzike34182f2013-11-06 21:36:55 +0000267 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
268 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
269 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
270 EXPECT_EQ(f->sections.size(), 2UL);
271 const Section& text = f->sections[0];
272 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
273 EXPECT_TRUE(text.sectionName.equals("__text"));
274 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000275 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000276 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000277 EXPECT_EQ((uint16_t)text.alignment, 16U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000278 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000279 EXPECT_EQ(text.content.size(), 45UL);
280 EXPECT_EQ((int)(text.content[0]), 0x55);
281 EXPECT_EQ((int)(text.content[1]), 0x48);
282 EXPECT_TRUE(text.indirectSymbols.empty());
283 EXPECT_EQ(text.relocations.size(), 2UL);
284 const Relocation& call = text.relocations[0];
285 EXPECT_EQ(call.offset, Hex32(0x19));
286 EXPECT_EQ(call.type, X86_64_RELOC_BRANCH);
287 EXPECT_EQ(call.length, 2);
288 EXPECT_EQ(call.isExtern, true);
289 EXPECT_EQ(call.symbol, 2U);
290 const Relocation& str = text.relocations[1];
291 EXPECT_EQ(str.offset, Hex32(0xB));
292 EXPECT_EQ(str.type, X86_64_RELOC_SIGNED);
293 EXPECT_EQ(str.length, 2);
294 EXPECT_EQ(str.isExtern, true);
295 EXPECT_EQ(str.symbol, 0U);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000296
Nick Kledzike34182f2013-11-06 21:36:55 +0000297 const Section& cstring = f->sections[1];
298 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
299 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
300 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
301 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000302 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000303 EXPECT_EQ(cstring.address, Hex64(0x02D));
Nick Kledzike34182f2013-11-06 21:36:55 +0000304 EXPECT_EQ(cstring.content.size(), 7UL);
305 EXPECT_EQ((int)(cstring.content[0]), 0x68);
306 EXPECT_EQ((int)(cstring.content[1]), 0x65);
307 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
308 EXPECT_TRUE(cstring.indirectSymbols.empty());
309 EXPECT_TRUE(cstring.relocations.empty());
310
311 EXPECT_EQ(f->localSymbols.size(), 1UL);
312 const Symbol& strLabel = f->localSymbols[0];
313 EXPECT_EQ(strLabel.type, N_SECT);
314 EXPECT_EQ(strLabel.sect, 2);
315 EXPECT_EQ(strLabel.value, Hex64(0x2D));
316 EXPECT_EQ(f->globalSymbols.size(), 1UL);
317 const Symbol& mainLabel = f->globalSymbols[0];
318 EXPECT_TRUE(mainLabel.name.equals("_main"));
319 EXPECT_EQ(mainLabel.type, N_SECT);
320 EXPECT_EQ(mainLabel.sect, 1);
321 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
322 EXPECT_EQ(mainLabel.value, Hex64(0x0));
323 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
324 const Symbol& printfLabel = f->undefinedSymbols[0];
325 EXPECT_TRUE(printfLabel.name.equals("_printf"));
326 EXPECT_EQ(printfLabel.type, N_UNDF);
327 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
328}
329
Nick Kledzike34182f2013-11-06 21:36:55 +0000330TEST(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
Nick Kledzike34182f2013-11-06 21:36:55 +0000461TEST(BinaryReaderTest, hello_obj_armv7) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000462 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000463 0xCE, 0xFA, 0xED, 0xFE, 0x0C, 0x00, 0x00, 0x00,
464 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
465 0x03, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00,
466 0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
467 0xC0, 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 0x31, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
471 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
472 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
474 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
476 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 0x2A, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00,
479 0x02, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
480 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
483 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
487 0x6E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
491 0x18, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00,
492 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00,
493 0x10, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
494 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
497 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x00, 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, 0x80, 0xB5, 0x6F, 0x46,
504 0x82, 0xB0, 0x40, 0xF2, 0x18, 0x00, 0xC0, 0xF2,
505 0x00, 0x00, 0x78, 0x44, 0x00, 0x21, 0xC0, 0xF2,
506 0x00, 0x01, 0x01, 0x91, 0xFF, 0xF7, 0xF2, 0xFF,
507 0x00, 0x21, 0xC0, 0xF2, 0x00, 0x01, 0x00, 0x90,
508 0x08, 0x46, 0x02, 0xB0, 0x80, 0xBD, 0x68, 0x65,
509 0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00, 0x00, 0x00,
510 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x6D,
511 0x0A, 0x00, 0x00, 0xB9, 0x2A, 0x00, 0x00, 0x00,
512 0x18, 0x00, 0x00, 0xB1, 0x0E, 0x00, 0x00, 0x00,
513 0x06, 0x00, 0x00, 0xA9, 0x2A, 0x00, 0x00, 0x00,
514 0x00, 0x00, 0x00, 0xA1, 0x0E, 0x00, 0x00, 0x00,
515 0x01, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x08, 0x00,
516 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
517 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
518 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
519 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
520 };
Joey Gouly010b3762014-01-14 22:32:38 +0000521 std::unique_ptr<NormalizedFile> f =
522 fromBinary(fileBytes, sizeof(fileBytes), "armv7");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000523
Nick Kledzike34182f2013-11-06 21:36:55 +0000524 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
525 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
526 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
527 EXPECT_EQ(f->sections.size(), 2UL);
528 const Section& text = f->sections[0];
529 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
530 EXPECT_TRUE(text.sectionName.equals("__text"));
531 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000532 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000533 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000534 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000535 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000536 EXPECT_EQ(text.content.size(), 42UL);
537 EXPECT_EQ((int)(text.content[0]), 0x80);
538 EXPECT_EQ((int)(text.content[1]), 0xB5);
539 EXPECT_TRUE(text.indirectSymbols.empty());
540 EXPECT_EQ(text.relocations.size(), 5UL);
541 const Relocation& call = text.relocations[0];
542 EXPECT_EQ(call.offset, Hex32(0x18));
543 EXPECT_EQ(call.scattered, false);
544 EXPECT_EQ(call.type, ARM_THUMB_RELOC_BR22);
545 EXPECT_EQ(call.length, 2);
546 EXPECT_EQ(call.isExtern, true);
547 EXPECT_EQ(call.symbol, 1U);
548 const Relocation& movt = text.relocations[1];
549 EXPECT_EQ(movt.offset, Hex32(0xA));
550 EXPECT_EQ(movt.scattered, true);
551 EXPECT_EQ(movt.type, ARM_RELOC_HALF_SECTDIFF);
552 EXPECT_EQ(movt.length, 3);
553 EXPECT_EQ(movt.value, Hex32(0x2A));
554 const Relocation& movtPair = text.relocations[2];
555 EXPECT_EQ(movtPair.offset, Hex32(0x18));
556 EXPECT_EQ(movtPair.scattered, true);
557 EXPECT_EQ(movtPair.type, ARM_RELOC_PAIR);
558 EXPECT_EQ(movtPair.length, 3);
559 EXPECT_EQ(movtPair.value, Hex32(0xE));
560 const Relocation& movw = text.relocations[3];
561 EXPECT_EQ(movw.offset, Hex32(0x6));
562 EXPECT_EQ(movw.scattered, true);
563 EXPECT_EQ(movw.type, ARM_RELOC_HALF_SECTDIFF);
564 EXPECT_EQ(movw.length, 2);
565 EXPECT_EQ(movw.value, Hex32(0x2A));
566 const Relocation& movwPair = text.relocations[4];
567 EXPECT_EQ(movwPair.offset, Hex32(0x0));
568 EXPECT_EQ(movwPair.scattered, true);
569 EXPECT_EQ(movwPair.type, ARM_RELOC_PAIR);
570 EXPECT_EQ(movwPair.length, 2);
571 EXPECT_EQ(movwPair.value, Hex32(0xE));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000572
Nick Kledzike34182f2013-11-06 21:36:55 +0000573 const Section& cstring = f->sections[1];
574 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
575 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
576 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
577 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000578 EXPECT_EQ((uint16_t)cstring.alignment, 1U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000579 EXPECT_EQ(cstring.address, Hex64(0x02A));
Nick Kledzike34182f2013-11-06 21:36:55 +0000580 EXPECT_EQ(cstring.content.size(), 7UL);
581 EXPECT_EQ((int)(cstring.content[0]), 0x68);
582 EXPECT_EQ((int)(cstring.content[1]), 0x65);
583 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
584 EXPECT_TRUE(cstring.indirectSymbols.empty());
585 EXPECT_TRUE(cstring.relocations.empty());
586
587 EXPECT_EQ(f->localSymbols.size(), 0UL);
588 EXPECT_EQ(f->globalSymbols.size(), 1UL);
589 const Symbol& mainLabel = f->globalSymbols[0];
590 EXPECT_TRUE(mainLabel.name.equals("_main"));
591 EXPECT_EQ(mainLabel.type, N_SECT);
592 EXPECT_EQ(mainLabel.sect, 1);
593 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
594 EXPECT_EQ(mainLabel.value, Hex64(0x0));
595 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
596 const Symbol& printfLabel = f->undefinedSymbols[0];
597 EXPECT_TRUE(printfLabel.name.equals("_printf"));
598 EXPECT_EQ(printfLabel.type, N_UNDF);
599 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
600}
601
Nick Kledzike34182f2013-11-06 21:36:55 +0000602TEST(BinaryReaderTest, hello_obj_ppc) {
Rui Ueyamaa81cb052014-11-07 02:54:52 +0000603 FILEBYTES = {
Nick Kledzike34182f2013-11-06 21:36:55 +0000604 0xFE, 0xED, 0xFA, 0xCE, 0x00, 0x00, 0x00, 0x12,
605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
606 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x28,
607 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01,
608 0x00, 0x00, 0x00, 0xC0, 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, 0x4B, 0x00, 0x00, 0x01, 0x44,
612 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x07,
613 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02,
614 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x74, 0x65,
615 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
616 0x00, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x54, 0x45,
617 0x58, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x44,
620 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x90,
621 0x00, 0x00, 0x00, 0x05, 0x80, 0x00, 0x04, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
623 0x5F, 0x5F, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E,
624 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625 0x5F, 0x5F, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00,
626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
627 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07,
628 0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00, 0x02,
629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
631 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
632 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xB8,
633 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xD0,
634 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0B,
635 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
636 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
638 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
639 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640 0x00, 0x00, 0x00, 0x00, 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, 0x7C, 0x08, 0x02, 0xA6,
645 0xBF, 0xC1, 0xFF, 0xF8, 0x90, 0x01, 0x00, 0x08,
646 0x94, 0x21, 0xFF, 0xB0, 0x7C, 0x3E, 0x0B, 0x78,
647 0x42, 0x9F, 0x00, 0x05, 0x7F, 0xE8, 0x02, 0xA6,
648 0x3C, 0x5F, 0x00, 0x00, 0x38, 0x62, 0x00, 0x2C,
649 0x4B, 0xFF, 0xFF, 0xDD, 0x38, 0x00, 0x00, 0x00,
650 0x7C, 0x03, 0x03, 0x78, 0x80, 0x21, 0x00, 0x00,
651 0x80, 0x01, 0x00, 0x08, 0x7C, 0x08, 0x03, 0xA6,
652 0xBB, 0xC1, 0xFF, 0xF8, 0x4E, 0x80, 0x00, 0x20,
653 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x0A, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x01, 0xD3,
655 0xAB, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x44,
656 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
657 0xAC, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x44,
658 0xA1, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x18,
659 0x00, 0x00, 0x00, 0x01, 0x0F, 0x01, 0x00, 0x00,
660 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
661 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
662 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x5F,
663 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x00, 0x00
664 };
Joey Gouly010b3762014-01-14 22:32:38 +0000665 std::unique_ptr<NormalizedFile> f =
666 fromBinary(fileBytes, sizeof(fileBytes), "ppc");
Rui Ueyama7c13c442014-01-13 23:21:33 +0000667
Nick Kledzike34182f2013-11-06 21:36:55 +0000668 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
669 EXPECT_EQ((int)(f->fileType), MH_OBJECT);
670 EXPECT_EQ((int)(f->flags), MH_SUBSECTIONS_VIA_SYMBOLS);
671 EXPECT_EQ(f->sections.size(), 2UL);
672 const Section& text = f->sections[0];
673 EXPECT_TRUE(text.segmentName.equals("__TEXT"));
674 EXPECT_TRUE(text.sectionName.equals("__text"));
675 EXPECT_EQ(text.type, S_REGULAR);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000676 EXPECT_EQ(text.attributes,SectionAttr(S_ATTR_PURE_INSTRUCTIONS
Nick Kledzike34182f2013-11-06 21:36:55 +0000677 | S_ATTR_SOME_INSTRUCTIONS));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000678 EXPECT_EQ((uint16_t)text.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000679 EXPECT_EQ(text.address, Hex64(0x0));
Nick Kledzike34182f2013-11-06 21:36:55 +0000680 EXPECT_EQ(text.content.size(), 68UL);
681 EXPECT_EQ((int)(text.content[0]), 0x7C);
682 EXPECT_EQ((int)(text.content[1]), 0x08);
683 EXPECT_TRUE(text.indirectSymbols.empty());
684 EXPECT_EQ(text.relocations.size(), 5UL);
685 const Relocation& bl = text.relocations[0];
686 EXPECT_EQ(bl.offset, Hex32(0x24));
687 EXPECT_EQ(bl.type, PPC_RELOC_BR24);
688 EXPECT_EQ(bl.length, 2);
689 EXPECT_EQ(bl.isExtern, true);
690 EXPECT_EQ(bl.symbol, 1U);
691 const Relocation& lo = text.relocations[1];
692 EXPECT_EQ(lo.offset, Hex32(0x20));
693 EXPECT_EQ(lo.scattered, true);
694 EXPECT_EQ(lo.type, PPC_RELOC_LO16_SECTDIFF);
695 EXPECT_EQ(lo.length, 2);
696 EXPECT_EQ(lo.value, Hex32(0x44));
697 const Relocation& loPair = text.relocations[2];
698 EXPECT_EQ(loPair.offset, Hex32(0x0));
699 EXPECT_EQ(loPair.scattered, true);
700 EXPECT_EQ(loPair.type, PPC_RELOC_PAIR);
701 EXPECT_EQ(loPair.length, 2);
702 EXPECT_EQ(loPair.value, Hex32(0x18));
703 const Relocation& ha = text.relocations[3];
704 EXPECT_EQ(ha.offset, Hex32(0x1C));
705 EXPECT_EQ(ha.scattered, true);
706 EXPECT_EQ(ha.type, PPC_RELOC_HA16_SECTDIFF);
707 EXPECT_EQ(ha.length, 2);
708 EXPECT_EQ(ha.value, Hex32(0x44));
709 const Relocation& haPair = text.relocations[4];
710 EXPECT_EQ(haPair.offset, Hex32(0x2c));
711 EXPECT_EQ(haPair.scattered, true);
712 EXPECT_EQ(haPair.type, PPC_RELOC_PAIR);
713 EXPECT_EQ(haPair.length, 2);
714 EXPECT_EQ(haPair.value, Hex32(0x18));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000715
Nick Kledzike34182f2013-11-06 21:36:55 +0000716 const Section& cstring = f->sections[1];
717 EXPECT_TRUE(cstring.segmentName.equals("__TEXT"));
718 EXPECT_TRUE(cstring.sectionName.equals("__cstring"));
719 EXPECT_EQ(cstring.type, S_CSTRING_LITERALS);
720 EXPECT_EQ(cstring.attributes, SectionAttr(0));
Rui Ueyamaf217ef02015-03-26 02:03:44 +0000721 EXPECT_EQ((uint16_t)cstring.alignment, 4U);
Nick Kledzikf3e89cb2013-11-06 22:20:56 +0000722 EXPECT_EQ(cstring.address, Hex64(0x044));
Nick Kledzike34182f2013-11-06 21:36:55 +0000723 EXPECT_EQ(cstring.content.size(), 7UL);
724 EXPECT_EQ((int)(cstring.content[0]), 0x68);
725 EXPECT_EQ((int)(cstring.content[1]), 0x65);
726 EXPECT_EQ((int)(cstring.content[2]), 0x6c);
727 EXPECT_TRUE(cstring.indirectSymbols.empty());
728 EXPECT_TRUE(cstring.relocations.empty());
Rui Ueyama7c13c442014-01-13 23:21:33 +0000729
Nick Kledzike34182f2013-11-06 21:36:55 +0000730 EXPECT_EQ(f->localSymbols.size(), 0UL);
731 EXPECT_EQ(f->globalSymbols.size(), 1UL);
732 const Symbol& mainLabel = f->globalSymbols[0];
733 EXPECT_TRUE(mainLabel.name.equals("_main"));
734 EXPECT_EQ(mainLabel.type, N_SECT);
735 EXPECT_EQ(mainLabel.sect, 1);
736 EXPECT_EQ(mainLabel.scope, SymbolScope(N_EXT));
737 EXPECT_EQ(mainLabel.value, Hex64(0x0));
738 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
739 const Symbol& printfLabel = f->undefinedSymbols[0];
740 EXPECT_TRUE(printfLabel.name.equals("_printf"));
741 EXPECT_EQ(printfLabel.type, N_UNDF);
742 EXPECT_EQ(printfLabel.scope, SymbolScope(N_EXT));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000743
Pete Cooperfefbd222016-03-30 23:10:39 +0000744 auto ec = writeBinary(*f, "/tmp/foo.o");
Pete Cooper8eaf62ca2016-03-30 23:28:49 +0000745 // FIXME: We want to do EXPECT_FALSE(ec) but that fails on some Windows bots,
746 // probably due to /tmp not being available.
Pete Cooper4b35a642016-04-04 16:56:09 +0000747 // For now just consume the error without checking it.
748 consumeError(std::move(ec));
Nick Kledzike34182f2013-11-06 21:36:55 +0000749}