xref: /aosp_15_r20/system/unwinding/libunwindstack/tests/SymbolsTest.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker  *
4*eb293b8fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker  *
8*eb293b8fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker  *
10*eb293b8fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker  * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker  */
16*eb293b8fSAndroid Build Coastguard Worker 
17*eb293b8fSAndroid Build Coastguard Worker #include <elf.h>
18*eb293b8fSAndroid Build Coastguard Worker #include <errno.h>
19*eb293b8fSAndroid Build Coastguard Worker #include <signal.h>
20*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
21*eb293b8fSAndroid Build Coastguard Worker #include <stdlib.h>
22*eb293b8fSAndroid Build Coastguard Worker #include <string.h>
23*eb293b8fSAndroid Build Coastguard Worker #include <sys/mman.h>
24*eb293b8fSAndroid Build Coastguard Worker #include <sys/ptrace.h>
25*eb293b8fSAndroid Build Coastguard Worker #include <sys/types.h>
26*eb293b8fSAndroid Build Coastguard Worker #include <time.h>
27*eb293b8fSAndroid Build Coastguard Worker #include <unistd.h>
28*eb293b8fSAndroid Build Coastguard Worker 
29*eb293b8fSAndroid Build Coastguard Worker #include <vector>
30*eb293b8fSAndroid Build Coastguard Worker 
31*eb293b8fSAndroid Build Coastguard Worker #include <android-base/file.h>
32*eb293b8fSAndroid Build Coastguard Worker #include <android-base/test_utils.h>
33*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
34*eb293b8fSAndroid Build Coastguard Worker 
35*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Memory.h>
36*eb293b8fSAndroid Build Coastguard Worker 
37*eb293b8fSAndroid Build Coastguard Worker #include "Symbols.h"
38*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
39*eb293b8fSAndroid Build Coastguard Worker 
40*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
41*eb293b8fSAndroid Build Coastguard Worker 
42*eb293b8fSAndroid Build Coastguard Worker template <typename TypeParam>
43*eb293b8fSAndroid Build Coastguard Worker class SymbolsTest : public ::testing::Test {
44*eb293b8fSAndroid Build Coastguard Worker  protected:
SetUp()45*eb293b8fSAndroid Build Coastguard Worker   void SetUp() override { memory_.Clear(); }
46*eb293b8fSAndroid Build Coastguard Worker 
InitSym(TypeParam * sym,uint32_t st_value,uint32_t st_size,uint32_t st_name)47*eb293b8fSAndroid Build Coastguard Worker   void InitSym(TypeParam* sym, uint32_t st_value, uint32_t st_size, uint32_t st_name) {
48*eb293b8fSAndroid Build Coastguard Worker     memset(sym, 0, sizeof(*sym));
49*eb293b8fSAndroid Build Coastguard Worker     sym->st_info = STT_FUNC;
50*eb293b8fSAndroid Build Coastguard Worker     sym->st_value = st_value;
51*eb293b8fSAndroid Build Coastguard Worker     sym->st_size = st_size;
52*eb293b8fSAndroid Build Coastguard Worker     sym->st_name = st_name;
53*eb293b8fSAndroid Build Coastguard Worker     sym->st_shndx = SHN_COMMON;
54*eb293b8fSAndroid Build Coastguard Worker   }
55*eb293b8fSAndroid Build Coastguard Worker 
56*eb293b8fSAndroid Build Coastguard Worker   MemoryFake memory_;
57*eb293b8fSAndroid Build Coastguard Worker };
58*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(SymbolsTest);
59*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,function_bounds_check)60*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, function_bounds_check) {
61*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, sizeof(TypeParam), sizeof(TypeParam), 0x2000, 0x100);
62*eb293b8fSAndroid Build Coastguard Worker 
63*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
64*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
65*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
66*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
67*eb293b8fSAndroid Build Coastguard Worker 
68*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
69*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
70*eb293b8fSAndroid Build Coastguard Worker 
71*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
72*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
73*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
74*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
75*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
76*eb293b8fSAndroid Build Coastguard Worker 
77*eb293b8fSAndroid Build Coastguard Worker   name.clear();
78*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x500f, &this->memory_, &name, &func_offset));
79*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
80*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0xfU, func_offset);
81*eb293b8fSAndroid Build Coastguard Worker 
82*eb293b8fSAndroid Build Coastguard Worker   // Check one before and one after the function.
83*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols.GetName<TypeParam>(0x4fff, &this->memory_, &name, &func_offset));
84*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols.GetName<TypeParam>(0x5010, &this->memory_, &name, &func_offset));
85*eb293b8fSAndroid Build Coastguard Worker }
86*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,no_symbol)87*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, no_symbol) {
88*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, sizeof(TypeParam), sizeof(TypeParam), 0x2000, 0x100);
89*eb293b8fSAndroid Build Coastguard Worker 
90*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
91*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
92*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
93*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
94*eb293b8fSAndroid Build Coastguard Worker 
95*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
96*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
97*eb293b8fSAndroid Build Coastguard Worker 
98*eb293b8fSAndroid Build Coastguard Worker   // First verify that we can get the name.
99*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
100*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
101*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
102*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
103*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
104*eb293b8fSAndroid Build Coastguard Worker 
105*eb293b8fSAndroid Build Coastguard Worker   // Now modify the info field so it's no longer a function.
106*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = 0;
107*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
108*eb293b8fSAndroid Build Coastguard Worker   // Clear the cache to force the symbol data to be re-read.
109*eb293b8fSAndroid Build Coastguard Worker   symbols.ClearCache();
110*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
111*eb293b8fSAndroid Build Coastguard Worker 
112*eb293b8fSAndroid Build Coastguard Worker   // Set the function back, and set the shndx to UNDEF.
113*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_FUNC;
114*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_UNDEF;
115*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
116*eb293b8fSAndroid Build Coastguard Worker   // Clear the cache to force the symbol data to be re-read.
117*eb293b8fSAndroid Build Coastguard Worker   symbols.ClearCache();
118*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
119*eb293b8fSAndroid Build Coastguard Worker }
120*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,multiple_entries)121*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, multiple_entries) {
122*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, sizeof(TypeParam) * 3, sizeof(TypeParam), 0x2000, 0x500);
123*eb293b8fSAndroid Build Coastguard Worker 
124*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
125*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
126*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name;
127*eb293b8fSAndroid Build Coastguard Worker 
128*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
129*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
130*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_one";
131*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
132*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
133*eb293b8fSAndroid Build Coastguard Worker 
134*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x3004, 0x200, 0x100);
135*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
136*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_two";
137*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2100, fake_name.c_str(), fake_name.size() + 1);
138*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
139*eb293b8fSAndroid Build Coastguard Worker 
140*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0xa010, 0x20, 0x230);
141*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
142*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_three";
143*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2230, fake_name.c_str(), fake_name.size() + 1);
144*eb293b8fSAndroid Build Coastguard Worker 
145*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
146*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
147*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x3005, &this->memory_, &name, &func_offset));
148*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_two", name);
149*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(1U, func_offset);
150*eb293b8fSAndroid Build Coastguard Worker 
151*eb293b8fSAndroid Build Coastguard Worker   name.clear();
152*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5004, &this->memory_, &name, &func_offset));
153*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_one", name);
154*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(4U, func_offset);
155*eb293b8fSAndroid Build Coastguard Worker 
156*eb293b8fSAndroid Build Coastguard Worker   name.clear();
157*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0xa011, &this->memory_, &name, &func_offset));
158*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_three", name);
159*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(1U, func_offset);
160*eb293b8fSAndroid Build Coastguard Worker 
161*eb293b8fSAndroid Build Coastguard Worker   // Reget some of the others to verify getting one function name doesn't
162*eb293b8fSAndroid Build Coastguard Worker   // affect any of the next calls.
163*eb293b8fSAndroid Build Coastguard Worker   name.clear();
164*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5008, &this->memory_, &name, &func_offset));
165*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_one", name);
166*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(8U, func_offset);
167*eb293b8fSAndroid Build Coastguard Worker 
168*eb293b8fSAndroid Build Coastguard Worker   name.clear();
169*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x3008, &this->memory_, &name, &func_offset));
170*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_two", name);
171*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(4U, func_offset);
172*eb293b8fSAndroid Build Coastguard Worker 
173*eb293b8fSAndroid Build Coastguard Worker   name.clear();
174*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0xa01a, &this->memory_, &name, &func_offset));
175*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_three", name);
176*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0xaU, func_offset);
177*eb293b8fSAndroid Build Coastguard Worker }
178*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,multiple_entries_nonstandard_size)179*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, multiple_entries_nonstandard_size) {
180*eb293b8fSAndroid Build Coastguard Worker   uint64_t entry_size = sizeof(TypeParam) + 5;
181*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, entry_size * 3, entry_size, 0x2000, 0x500);
182*eb293b8fSAndroid Build Coastguard Worker 
183*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
184*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
185*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name;
186*eb293b8fSAndroid Build Coastguard Worker 
187*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
188*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemoryBlock(offset, entry_size, 0);
189*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
190*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_one";
191*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
192*eb293b8fSAndroid Build Coastguard Worker   offset += entry_size;
193*eb293b8fSAndroid Build Coastguard Worker 
194*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x3004, 0x200, 0x100);
195*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemoryBlock(offset, entry_size, 0);
196*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
197*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_two";
198*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2100, fake_name.c_str(), fake_name.size() + 1);
199*eb293b8fSAndroid Build Coastguard Worker   offset += entry_size;
200*eb293b8fSAndroid Build Coastguard Worker 
201*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0xa010, 0x20, 0x230);
202*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemoryBlock(offset, entry_size, 0);
203*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
204*eb293b8fSAndroid Build Coastguard Worker   fake_name = "function_three";
205*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2230, fake_name.c_str(), fake_name.size() + 1);
206*eb293b8fSAndroid Build Coastguard Worker 
207*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
208*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
209*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x3005, &this->memory_, &name, &func_offset));
210*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_two", name);
211*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(1U, func_offset);
212*eb293b8fSAndroid Build Coastguard Worker 
213*eb293b8fSAndroid Build Coastguard Worker   name.clear();
214*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5004, &this->memory_, &name, &func_offset));
215*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_one", name);
216*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(4U, func_offset);
217*eb293b8fSAndroid Build Coastguard Worker 
218*eb293b8fSAndroid Build Coastguard Worker   name.clear();
219*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0xa011, &this->memory_, &name, &func_offset));
220*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function_three", name);
221*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(1U, func_offset);
222*eb293b8fSAndroid Build Coastguard Worker }
223*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,symtab_value_out_of_bounds)224*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, symtab_value_out_of_bounds) {
225*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols_end_at_100(0x1000, sizeof(TypeParam) * 2, sizeof(TypeParam), 0x2000, 0x100);
226*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols_end_at_200(0x1000, sizeof(TypeParam) * 2, sizeof(TypeParam), 0x2000, 0x200);
227*eb293b8fSAndroid Build Coastguard Worker 
228*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
229*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
230*eb293b8fSAndroid Build Coastguard Worker 
231*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0xfb);
232*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
233*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
234*eb293b8fSAndroid Build Coastguard Worker 
235*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x3000, 0x10, 0x100);
236*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
237*eb293b8fSAndroid Build Coastguard Worker 
238*eb293b8fSAndroid Build Coastguard Worker   // Put the name across the end of the tab.
239*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
240*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x20fb, fake_name.c_str(), fake_name.size() + 1);
241*eb293b8fSAndroid Build Coastguard Worker 
242*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
243*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
244*eb293b8fSAndroid Build Coastguard Worker   // Verify that we can get the function name properly for both entries.
245*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols_end_at_200.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
246*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
247*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
248*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols_end_at_200.GetName<TypeParam>(0x3000, &this->memory_, &name, &func_offset));
249*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("function", name);
250*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
251*eb293b8fSAndroid Build Coastguard Worker 
252*eb293b8fSAndroid Build Coastguard Worker   // Now use the symbol table that ends at 0x100.
253*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols_end_at_100.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
254*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols_end_at_100.GetName<TypeParam>(0x3000, &this->memory_, &name, &func_offset));
255*eb293b8fSAndroid Build Coastguard Worker }
256*eb293b8fSAndroid Build Coastguard Worker 
257*eb293b8fSAndroid Build Coastguard Worker // Verify the entire func table is cached.
TYPED_TEST_P(SymbolsTest,symtab_read_cached)258*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, symtab_read_cached) {
259*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, 3 * sizeof(TypeParam), sizeof(TypeParam), 0xa000, 0x1000);
260*eb293b8fSAndroid Build Coastguard Worker 
261*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
262*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
263*eb293b8fSAndroid Build Coastguard Worker 
264*eb293b8fSAndroid Build Coastguard Worker   // Make sure that these entries are not in ascending order.
265*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x100);
266*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
267*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
268*eb293b8fSAndroid Build Coastguard Worker 
269*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x2000, 0x300, 0x200);
270*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
271*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
272*eb293b8fSAndroid Build Coastguard Worker 
273*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x1000, 0x100, 0x300);
274*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
275*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
276*eb293b8fSAndroid Build Coastguard Worker 
277*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name;
278*eb293b8fSAndroid Build Coastguard Worker   fake_name = "first_entry";
279*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0xa100, fake_name.c_str(), fake_name.size() + 1);
280*eb293b8fSAndroid Build Coastguard Worker   fake_name = "second_entry";
281*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0xa200, fake_name.c_str(), fake_name.size() + 1);
282*eb293b8fSAndroid Build Coastguard Worker   fake_name = "third_entry";
283*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0xa300, fake_name.c_str(), fake_name.size() + 1);
284*eb293b8fSAndroid Build Coastguard Worker 
285*eb293b8fSAndroid Build Coastguard Worker   // Do call that should cache all of the entries.
286*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
287*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
288*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
289*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x2000, &this->memory_, &name, &func_offset));
290*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x1000, &this->memory_, &name, &func_offset));
291*eb293b8fSAndroid Build Coastguard Worker   this->memory_.Clear();
292*eb293b8fSAndroid Build Coastguard Worker   ASSERT_FALSE(symbols.GetName<TypeParam>(0x6000, &this->memory_, &name, &func_offset));
293*eb293b8fSAndroid Build Coastguard Worker 
294*eb293b8fSAndroid Build Coastguard Worker   // Clear the memory.
295*eb293b8fSAndroid Build Coastguard Worker   this->memory_.Clear();
296*eb293b8fSAndroid Build Coastguard Worker 
297*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5001, &this->memory_, &name, &func_offset));
298*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("first_entry", name);
299*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(1U, func_offset);
300*eb293b8fSAndroid Build Coastguard Worker 
301*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x2002, &this->memory_, &name, &func_offset));
302*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("second_entry", name);
303*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(2U, func_offset);
304*eb293b8fSAndroid Build Coastguard Worker 
305*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x1003, &this->memory_, &name, &func_offset));
306*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("third_entry", name);
307*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(3U, func_offset);
308*eb293b8fSAndroid Build Coastguard Worker }
309*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,symtab_end_marker)310*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, symtab_end_marker) {
311*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, 3 * sizeof(TypeParam), sizeof(TypeParam), 0xa000, 0x1000);
312*eb293b8fSAndroid Build Coastguard Worker 
313*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
314*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
315*eb293b8fSAndroid Build Coastguard Worker 
316*eb293b8fSAndroid Build Coastguard Worker   // Add normal symbol function: Let's say this could be symbol from hand written assembly.
317*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x1000, 0x500, 0x100);
318*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
319*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
320*eb293b8fSAndroid Build Coastguard Worker 
321*eb293b8fSAndroid Build Coastguard Worker   // And zero-sized symbol: A programmer might do that to label the end of assembly method.
322*eb293b8fSAndroid Build Coastguard Worker   // This might be a challenge for booking since both symbols end at the same address.
323*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x1500, 0x000, 0x200);
324*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
325*eb293b8fSAndroid Build Coastguard Worker   offset += sizeof(sym);
326*eb293b8fSAndroid Build Coastguard Worker 
327*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name;
328*eb293b8fSAndroid Build Coastguard Worker   fake_name = "entry";
329*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0xa100, fake_name.c_str(), fake_name.size() + 1);
330*eb293b8fSAndroid Build Coastguard Worker   fake_name = "entry_end";
331*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0xa200, fake_name.c_str(), fake_name.size() + 1);
332*eb293b8fSAndroid Build Coastguard Worker 
333*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
334*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
335*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x1250, &this->memory_, &name, &func_offset));
336*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("entry", name);
337*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0x250U, func_offset);
338*eb293b8fSAndroid Build Coastguard Worker }
339*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,get_global)340*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, get_global) {
341*eb293b8fSAndroid Build Coastguard Worker   uint64_t start_offset = 0x1000;
342*eb293b8fSAndroid Build Coastguard Worker   uint64_t str_offset = 0xa000;
343*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(start_offset, 4 * sizeof(TypeParam), sizeof(TypeParam), str_offset, 0x1000);
344*eb293b8fSAndroid Build Coastguard Worker 
345*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
346*eb293b8fSAndroid Build Coastguard Worker   memset(&sym, 0, sizeof(sym));
347*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_COMMON;
348*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_OBJECT | (STB_GLOBAL << 4);
349*eb293b8fSAndroid Build Coastguard Worker   sym.st_name = 0x100;
350*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(start_offset, &sym, sizeof(sym));
351*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(str_offset + 0x100, "global_0");
352*eb293b8fSAndroid Build Coastguard Worker 
353*eb293b8fSAndroid Build Coastguard Worker   start_offset += sizeof(sym);
354*eb293b8fSAndroid Build Coastguard Worker   memset(&sym, 0, sizeof(sym));
355*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_COMMON;
356*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_FUNC;
357*eb293b8fSAndroid Build Coastguard Worker   sym.st_name = 0x200;
358*eb293b8fSAndroid Build Coastguard Worker   sym.st_value = 0x10000;
359*eb293b8fSAndroid Build Coastguard Worker   sym.st_size = 0x100;
360*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(start_offset, &sym, sizeof(sym));
361*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(str_offset + 0x200, "function_0");
362*eb293b8fSAndroid Build Coastguard Worker 
363*eb293b8fSAndroid Build Coastguard Worker   start_offset += sizeof(sym);
364*eb293b8fSAndroid Build Coastguard Worker   memset(&sym, 0, sizeof(sym));
365*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_COMMON;
366*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_OBJECT | (STB_GLOBAL << 4);
367*eb293b8fSAndroid Build Coastguard Worker   sym.st_name = 0x300;
368*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(start_offset, &sym, sizeof(sym));
369*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(str_offset + 0x300, "global_1");
370*eb293b8fSAndroid Build Coastguard Worker 
371*eb293b8fSAndroid Build Coastguard Worker   start_offset += sizeof(sym);
372*eb293b8fSAndroid Build Coastguard Worker   memset(&sym, 0, sizeof(sym));
373*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_COMMON;
374*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_FUNC;
375*eb293b8fSAndroid Build Coastguard Worker   sym.st_name = 0x400;
376*eb293b8fSAndroid Build Coastguard Worker   sym.st_value = 0x12000;
377*eb293b8fSAndroid Build Coastguard Worker   sym.st_size = 0x100;
378*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(start_offset, &sym, sizeof(sym));
379*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(str_offset + 0x400, "function_1");
380*eb293b8fSAndroid Build Coastguard Worker 
381*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset;
382*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_0", &offset));
383*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_1", &offset));
384*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_2", &offset));
385*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_0", &offset));
386*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_1", &offset));
387*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_2", &offset));
388*eb293b8fSAndroid Build Coastguard Worker 
389*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "function_0", &offset));
390*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "function_1", &offset));
391*eb293b8fSAndroid Build Coastguard Worker 
392*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
393*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetName<TypeParam>(0x10002, &this->memory_, &name, &offset));
394*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ("function_0", name);
395*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(2U, offset);
396*eb293b8fSAndroid Build Coastguard Worker 
397*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetName<TypeParam>(0x12004, &this->memory_, &name, &offset));
398*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ("function_1", name);
399*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(4U, offset);
400*eb293b8fSAndroid Build Coastguard Worker 
401*eb293b8fSAndroid Build Coastguard Worker   // Check that the results were cached.
402*eb293b8fSAndroid Build Coastguard Worker   this->memory_.Clear();
403*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_0", &offset));
404*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_1", &offset));
405*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_2", &offset));
406*eb293b8fSAndroid Build Coastguard Worker }
407*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,get_global_overflow)408*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, get_global_overflow) {
409*eb293b8fSAndroid Build Coastguard Worker   uint64_t start_offset = UINT64_MAX - 0x1000;
410*eb293b8fSAndroid Build Coastguard Worker   uint64_t str_offset = 0xa000;
411*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(start_offset, UINT64_MAX, UINT64_MAX / 4, str_offset, 0x1000);
412*eb293b8fSAndroid Build Coastguard Worker 
413*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
414*eb293b8fSAndroid Build Coastguard Worker   memset(&sym, 0, sizeof(sym));
415*eb293b8fSAndroid Build Coastguard Worker   sym.st_shndx = SHN_COMMON;
416*eb293b8fSAndroid Build Coastguard Worker   sym.st_info = STT_OBJECT | (STB_GLOBAL << 4);
417*eb293b8fSAndroid Build Coastguard Worker   sym.st_name = 0x100;
418*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(start_offset, &sym, sizeof(sym));
419*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(str_offset + 0x100, "global_0");
420*eb293b8fSAndroid Build Coastguard Worker 
421*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset;
422*eb293b8fSAndroid Build Coastguard Worker   EXPECT_TRUE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_0", &offset));
423*eb293b8fSAndroid Build Coastguard Worker   // Should trigger the overflow.
424*eb293b8fSAndroid Build Coastguard Worker   EXPECT_FALSE(symbols.GetGlobal<TypeParam>(&this->memory_, "global_1", &offset));
425*eb293b8fSAndroid Build Coastguard Worker }
426*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,get_name_oversized_count)427*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, get_name_oversized_count) {
428*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, UINT64_MAX, sizeof(TypeParam), 0x2000, UINT64_MAX);
429*eb293b8fSAndroid Build Coastguard Worker 
430*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
431*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
432*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
433*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
434*eb293b8fSAndroid Build Coastguard Worker 
435*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
436*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
437*eb293b8fSAndroid Build Coastguard Worker 
438*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
439*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
440*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
441*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
442*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
443*eb293b8fSAndroid Build Coastguard Worker }
444*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,get_name_size_overflow)445*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, get_name_size_overflow) {
446*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(0x1000, sizeof(TypeParam), sizeof(TypeParam), 0x2000, UINT64_MAX);
447*eb293b8fSAndroid Build Coastguard Worker 
448*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
449*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
450*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = 0x1000;
451*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
452*eb293b8fSAndroid Build Coastguard Worker 
453*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
454*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
455*eb293b8fSAndroid Build Coastguard Worker 
456*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
457*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
458*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
459*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
460*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
461*eb293b8fSAndroid Build Coastguard Worker }
462*eb293b8fSAndroid Build Coastguard Worker 
TYPED_TEST_P(SymbolsTest,get_name_offset_overflow)463*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(SymbolsTest, get_name_offset_overflow) {
464*eb293b8fSAndroid Build Coastguard Worker   Symbols symbols(UINT64_MAX - 0x1000, UINT64_MAX, UINT64_MAX / 4, 0x2000, 0x100);
465*eb293b8fSAndroid Build Coastguard Worker 
466*eb293b8fSAndroid Build Coastguard Worker   TypeParam sym;
467*eb293b8fSAndroid Build Coastguard Worker   this->InitSym(&sym, 0x5000, 0x10, 0x40);
468*eb293b8fSAndroid Build Coastguard Worker   uint64_t offset = UINT64_MAX - 0x1000;
469*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(offset, &sym, sizeof(sym));
470*eb293b8fSAndroid Build Coastguard Worker 
471*eb293b8fSAndroid Build Coastguard Worker   std::string fake_name("fake_function");
472*eb293b8fSAndroid Build Coastguard Worker   this->memory_.SetMemory(0x2040, fake_name.c_str(), fake_name.size() + 1);
473*eb293b8fSAndroid Build Coastguard Worker 
474*eb293b8fSAndroid Build Coastguard Worker   SharedString name;
475*eb293b8fSAndroid Build Coastguard Worker   uint64_t func_offset;
476*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(symbols.GetName<TypeParam>(0x5000, &this->memory_, &name, &func_offset));
477*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ("fake_function", name);
478*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(0U, func_offset);
479*eb293b8fSAndroid Build Coastguard Worker }
480*eb293b8fSAndroid Build Coastguard Worker 
481*eb293b8fSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(SymbolsTest, function_bounds_check, no_symbol, multiple_entries,
482*eb293b8fSAndroid Build Coastguard Worker                             multiple_entries_nonstandard_size, symtab_value_out_of_bounds,
483*eb293b8fSAndroid Build Coastguard Worker                             symtab_read_cached, get_global, get_global_overflow, symtab_end_marker,
484*eb293b8fSAndroid Build Coastguard Worker                             get_name_size_overflow, get_name_offset_overflow,
485*eb293b8fSAndroid Build Coastguard Worker                             get_name_oversized_count);
486*eb293b8fSAndroid Build Coastguard Worker 
487*eb293b8fSAndroid Build Coastguard Worker typedef ::testing::Types<Elf32_Sym, Elf64_Sym> SymbolsTestTypes;
488*eb293b8fSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Libunwindstack, SymbolsTest, SymbolsTestTypes);
489*eb293b8fSAndroid Build Coastguard Worker 
490*eb293b8fSAndroid Build Coastguard Worker }  // namespace unwindstack
491