xref: /aosp_15_r20/system/extras/simpleperf/read_elf_test.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include "read_elf.h"
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*288bf522SAndroid Build Coastguard Worker 
21*288bf522SAndroid Build Coastguard Worker #include <map>
22*288bf522SAndroid Build Coastguard Worker 
23*288bf522SAndroid Build Coastguard Worker #include <android-base/file.h>
24*288bf522SAndroid Build Coastguard Worker 
25*288bf522SAndroid Build Coastguard Worker #include "get_test_data.h"
26*288bf522SAndroid Build Coastguard Worker #include "read_apk.h"
27*288bf522SAndroid Build Coastguard Worker #include "test_util.h"
28*288bf522SAndroid Build Coastguard Worker #include "utils.h"
29*288bf522SAndroid Build Coastguard Worker 
30*288bf522SAndroid Build Coastguard Worker #define ELF_NOTE_GNU "GNU"
31*288bf522SAndroid Build Coastguard Worker #define NT_GNU_BUILD_ID 3
32*288bf522SAndroid Build Coastguard Worker 
33*288bf522SAndroid Build Coastguard Worker using namespace simpleperf;
34*288bf522SAndroid Build Coastguard Worker 
35*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,GetBuildIdFromNoteSection)36*288bf522SAndroid Build Coastguard Worker TEST(read_elf, GetBuildIdFromNoteSection) {
37*288bf522SAndroid Build Coastguard Worker   BuildId build_id;
38*288bf522SAndroid Build Coastguard Worker   std::vector<char> data;
39*288bf522SAndroid Build Coastguard Worker   // Fail to read build id for no data.
40*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(GetBuildIdFromNoteSection(data.data(), 0, &build_id));
41*288bf522SAndroid Build Coastguard Worker 
42*288bf522SAndroid Build Coastguard Worker   // Read build id from data starting from different alignment addresses.
43*288bf522SAndroid Build Coastguard Worker   char build_id_data[20];
44*288bf522SAndroid Build Coastguard Worker   for (int i = 0; i < 20; ++i) {
45*288bf522SAndroid Build Coastguard Worker     build_id_data[i] = i;
46*288bf522SAndroid Build Coastguard Worker   }
47*288bf522SAndroid Build Coastguard Worker   BuildId expected_build_id(build_id_data, 20);
48*288bf522SAndroid Build Coastguard Worker   data.resize(100, '\0');
49*288bf522SAndroid Build Coastguard Worker 
50*288bf522SAndroid Build Coastguard Worker   for (size_t alignment = 0; alignment <= 3; ++alignment) {
51*288bf522SAndroid Build Coastguard Worker     char* start = data.data() + alignment;
52*288bf522SAndroid Build Coastguard Worker     char* p = start;
53*288bf522SAndroid Build Coastguard Worker     uint32_t type = NT_GNU_BUILD_ID;
54*288bf522SAndroid Build Coastguard Worker     uint32_t namesz = 4;
55*288bf522SAndroid Build Coastguard Worker     uint32_t descsz = 20;
56*288bf522SAndroid Build Coastguard Worker     MoveToBinaryFormat(namesz, p);
57*288bf522SAndroid Build Coastguard Worker     MoveToBinaryFormat(descsz, p);
58*288bf522SAndroid Build Coastguard Worker     MoveToBinaryFormat(type, p);
59*288bf522SAndroid Build Coastguard Worker     MoveToBinaryFormat(ELF_NOTE_GNU, 4, p);
60*288bf522SAndroid Build Coastguard Worker     MoveToBinaryFormat(build_id_data, 20, p);
61*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(GetBuildIdFromNoteSection(start, p - start, &build_id));
62*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(build_id == expected_build_id);
63*288bf522SAndroid Build Coastguard Worker   }
64*288bf522SAndroid Build Coastguard Worker }
65*288bf522SAndroid Build Coastguard Worker 
66*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,GetBuildIdFromElfFile)67*288bf522SAndroid Build Coastguard Worker TEST(read_elf, GetBuildIdFromElfFile) {
68*288bf522SAndroid Build Coastguard Worker   BuildId build_id;
69*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
70*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE), &status);
71*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(status, ElfStatus::NO_ERROR);
72*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, elf->GetBuildId(&build_id));
73*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(build_id, BuildId(elf_file_build_id));
74*288bf522SAndroid Build Coastguard Worker }
75*288bf522SAndroid Build Coastguard Worker 
76*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,GetBuildIdFromEmbeddedElfFile)77*288bf522SAndroid Build Coastguard Worker TEST(read_elf, GetBuildIdFromEmbeddedElfFile) {
78*288bf522SAndroid Build Coastguard Worker   BuildId build_id;
79*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
80*288bf522SAndroid Build Coastguard Worker   std::string path = GetUrlInApk(APK_FILE, NATIVELIB_IN_APK);
81*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(path), &status);
82*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(status, ElfStatus::NO_ERROR);
83*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, elf->GetBuildId(&build_id));
84*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(build_id, native_lib_build_id);
85*288bf522SAndroid Build Coastguard Worker }
86*288bf522SAndroid Build Coastguard Worker 
ParseSymbol(const ElfFileSymbol & symbol,std::map<std::string,ElfFileSymbol> * symbols)87*288bf522SAndroid Build Coastguard Worker void ParseSymbol(const ElfFileSymbol& symbol, std::map<std::string, ElfFileSymbol>* symbols) {
88*288bf522SAndroid Build Coastguard Worker   (*symbols)[symbol.name] = symbol;
89*288bf522SAndroid Build Coastguard Worker }
90*288bf522SAndroid Build Coastguard Worker 
CheckGlobalVariableSymbols(const std::map<std::string,ElfFileSymbol> & symbols)91*288bf522SAndroid Build Coastguard Worker static void CheckGlobalVariableSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
92*288bf522SAndroid Build Coastguard Worker   auto pos = symbols.find("GlobalVar");
93*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(pos, symbols.end());
94*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(pos->second.is_func);
95*288bf522SAndroid Build Coastguard Worker }
96*288bf522SAndroid Build Coastguard Worker 
CheckFunctionSymbols(const std::map<std::string,ElfFileSymbol> & symbols)97*288bf522SAndroid Build Coastguard Worker static void CheckFunctionSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
98*288bf522SAndroid Build Coastguard Worker   auto pos = symbols.find("GlobalFunc");
99*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(pos, symbols.end());
100*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(pos->second.is_func);
101*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(pos->second.is_in_text_section);
102*288bf522SAndroid Build Coastguard Worker }
103*288bf522SAndroid Build Coastguard Worker 
CheckElfFileSymbols(const std::map<std::string,ElfFileSymbol> & symbols)104*288bf522SAndroid Build Coastguard Worker void CheckElfFileSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
105*288bf522SAndroid Build Coastguard Worker   CheckGlobalVariableSymbols(symbols);
106*288bf522SAndroid Build Coastguard Worker   CheckFunctionSymbols(symbols);
107*288bf522SAndroid Build Coastguard Worker }
108*288bf522SAndroid Build Coastguard Worker 
109*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,parse_symbols_from_elf_file_with_correct_build_id)110*288bf522SAndroid Build Coastguard Worker TEST(read_elf, parse_symbols_from_elf_file_with_correct_build_id) {
111*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
112*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
113*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE), &elf_file_build_id, &status);
114*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
115*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR,
116*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
117*288bf522SAndroid Build Coastguard Worker   CheckElfFileSymbols(symbols);
118*288bf522SAndroid Build Coastguard Worker }
119*288bf522SAndroid Build Coastguard Worker 
120*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,parse_symbols_from_elf_file_without_build_id)121*288bf522SAndroid Build Coastguard Worker TEST(read_elf, parse_symbols_from_elf_file_without_build_id) {
122*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
123*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
124*288bf522SAndroid Build Coastguard Worker   // Test no build_id.
125*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE), &status);
126*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
127*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR,
128*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
129*288bf522SAndroid Build Coastguard Worker   CheckElfFileSymbols(symbols);
130*288bf522SAndroid Build Coastguard Worker 
131*288bf522SAndroid Build Coastguard Worker   // Test empty build id.
132*288bf522SAndroid Build Coastguard Worker   symbols.clear();
133*288bf522SAndroid Build Coastguard Worker   BuildId build_id;
134*288bf522SAndroid Build Coastguard Worker   elf = ElfFile::Open(GetTestData(ELF_FILE), &build_id, &status);
135*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
136*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR,
137*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
138*288bf522SAndroid Build Coastguard Worker   CheckElfFileSymbols(symbols);
139*288bf522SAndroid Build Coastguard Worker }
140*288bf522SAndroid Build Coastguard Worker 
141*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,parse_symbols_from_elf_file_with_wrong_build_id)142*288bf522SAndroid Build Coastguard Worker TEST(read_elf, parse_symbols_from_elf_file_with_wrong_build_id) {
143*288bf522SAndroid Build Coastguard Worker   BuildId build_id("01010101010101010101");
144*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
145*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
146*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE), &build_id, &status);
147*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::BUILD_ID_MISMATCH, status);
148*288bf522SAndroid Build Coastguard Worker }
149*288bf522SAndroid Build Coastguard Worker 
150*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,ParseSymbolsFromEmbeddedElfFile)151*288bf522SAndroid Build Coastguard Worker TEST(read_elf, ParseSymbolsFromEmbeddedElfFile) {
152*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
153*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
154*288bf522SAndroid Build Coastguard Worker   std::string path = GetUrlInApk(APK_FILE, NATIVELIB_IN_APK);
155*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(path), &native_lib_build_id, &status);
156*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(status, ElfStatus::NO_ERROR);
157*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_SYMBOL_TABLE,
158*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
159*288bf522SAndroid Build Coastguard Worker   CheckElfFileSymbols(symbols);
160*288bf522SAndroid Build Coastguard Worker }
161*288bf522SAndroid Build Coastguard Worker 
162*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,ParseSymbolFromMiniDebugInfoElfFile)163*288bf522SAndroid Build Coastguard Worker TEST(read_elf, ParseSymbolFromMiniDebugInfoElfFile) {
164*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
165*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
166*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE_WITH_MINI_DEBUG_INFO), &status);
167*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
168*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR,
169*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
170*288bf522SAndroid Build Coastguard Worker   CheckFunctionSymbols(symbols);
171*288bf522SAndroid Build Coastguard Worker }
172*288bf522SAndroid Build Coastguard Worker 
173*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,arm_mapping_symbol)174*288bf522SAndroid Build Coastguard Worker TEST(read_elf, arm_mapping_symbol) {
175*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(IsArmMappingSymbol("$a"));
176*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(IsArmMappingSymbol("$b"));
177*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(IsArmMappingSymbol("$a.anything"));
178*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(IsArmMappingSymbol("$a_no_dot"));
179*288bf522SAndroid Build Coastguard Worker }
180*288bf522SAndroid Build Coastguard Worker 
181*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,ElfFile_Open)182*288bf522SAndroid Build Coastguard Worker TEST(read_elf, ElfFile_Open) {
183*288bf522SAndroid Build Coastguard Worker   auto IsValidElfPath = [](const std::string& path) {
184*288bf522SAndroid Build Coastguard Worker     ElfStatus status;
185*288bf522SAndroid Build Coastguard Worker     ElfFile::Open(path, &status);
186*288bf522SAndroid Build Coastguard Worker     return status;
187*288bf522SAndroid Build Coastguard Worker   };
188*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(ElfStatus::NO_ERROR, IsValidElfPath("/dev/zero"));
189*288bf522SAndroid Build Coastguard Worker   TemporaryFile tmp_file;
190*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::READ_FAILED, IsValidElfPath(tmp_file.path));
191*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(android::base::WriteStringToFile("wrong format for elf", tmp_file.path));
192*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::FILE_MALFORMED, IsValidElfPath(tmp_file.path));
193*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, IsValidElfPath(GetTestData(ELF_FILE)));
194*288bf522SAndroid Build Coastguard Worker }
195*288bf522SAndroid Build Coastguard Worker 
196*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,check_symbol_for_plt_section)197*288bf522SAndroid Build Coastguard Worker TEST(read_elf, check_symbol_for_plt_section) {
198*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
199*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
200*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE), &status);
201*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
202*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR,
203*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
204*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(symbols.find("@plt"), symbols.end());
205*288bf522SAndroid Build Coastguard Worker }
206*288bf522SAndroid Build Coastguard Worker 
207*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,read_elf_with_broken_section_table)208*288bf522SAndroid Build Coastguard Worker TEST(read_elf, read_elf_with_broken_section_table) {
209*288bf522SAndroid Build Coastguard Worker   std::string elf_path = GetTestData("libsgmainso-6.4.36.so");
210*288bf522SAndroid Build Coastguard Worker   std::map<std::string, ElfFileSymbol> symbols;
211*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
212*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(elf_path, &status);
213*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, status);
214*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_SYMBOL_TABLE,
215*288bf522SAndroid Build Coastguard Worker             elf->ParseSymbols(std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
216*288bf522SAndroid Build Coastguard Worker 
217*288bf522SAndroid Build Coastguard Worker   BuildId build_id;
218*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_BUILD_ID, elf->GetBuildId(&build_id));
219*288bf522SAndroid Build Coastguard Worker 
220*288bf522SAndroid Build Coastguard Worker   uint64_t file_offset_of_min_vaddr;
221*288bf522SAndroid Build Coastguard Worker   uint64_t min_vaddr = elf->ReadMinExecutableVaddr(&file_offset_of_min_vaddr);
222*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(min_vaddr, 0u);
223*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(file_offset_of_min_vaddr, 0u);
224*288bf522SAndroid Build Coastguard Worker }
225*288bf522SAndroid Build Coastguard Worker 
226*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,ReadMinExecutableVaddr)227*288bf522SAndroid Build Coastguard Worker TEST(read_elf, ReadMinExecutableVaddr) {
228*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
229*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData("libc.so"), &status);
230*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(status, ElfStatus::NO_ERROR);
231*288bf522SAndroid Build Coastguard Worker   uint64_t file_offset_of_min_vaddr;
232*288bf522SAndroid Build Coastguard Worker   uint64_t min_vaddr = elf->ReadMinExecutableVaddr(&file_offset_of_min_vaddr);
233*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(min_vaddr, 0x29000u);
234*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(file_offset_of_min_vaddr, 0x29000u);
235*288bf522SAndroid Build Coastguard Worker }
236*288bf522SAndroid Build Coastguard Worker 
237*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,NoUndefinedSymbol)238*288bf522SAndroid Build Coastguard Worker TEST(read_elf, NoUndefinedSymbol) {
239*288bf522SAndroid Build Coastguard Worker   // Check if we read undefined symbols (like dlerror) from libc.so.
240*288bf522SAndroid Build Coastguard Worker   bool has_dlerror = false;
241*288bf522SAndroid Build Coastguard Worker   auto parse_symbol = [&](const ElfFileSymbol& symbol) {
242*288bf522SAndroid Build Coastguard Worker     if (symbol.name == "dlerror") {
243*288bf522SAndroid Build Coastguard Worker       has_dlerror = true;
244*288bf522SAndroid Build Coastguard Worker     }
245*288bf522SAndroid Build Coastguard Worker   };
246*288bf522SAndroid Build Coastguard Worker 
247*288bf522SAndroid Build Coastguard Worker   ElfStatus status;
248*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData("libc.so"), &status);
249*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(status, ElfStatus::NO_ERROR);
250*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ElfStatus::NO_ERROR, elf->ParseSymbols(parse_symbol));
251*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(has_dlerror);
252*288bf522SAndroid Build Coastguard Worker }
253*288bf522SAndroid Build Coastguard Worker 
254*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,VaddrToOff)255*288bf522SAndroid Build Coastguard Worker TEST(read_elf, VaddrToOff) {
256*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE));
257*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(elf != nullptr);
258*288bf522SAndroid Build Coastguard Worker   uint64_t off;
259*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(elf->VaddrToOff(0x400200, &off));
260*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(off, 0x200);
261*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(elf->VaddrToOff(0x300200, &off));
262*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(elf->VaddrToOff(0x420000, &off));
263*288bf522SAndroid Build Coastguard Worker }
264*288bf522SAndroid Build Coastguard Worker 
265*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(read_elf,GetSectionHeader)266*288bf522SAndroid Build Coastguard Worker TEST(read_elf, GetSectionHeader) {
267*288bf522SAndroid Build Coastguard Worker   auto elf = ElfFile::Open(GetTestData(ELF_FILE));
268*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(elf != nullptr);
269*288bf522SAndroid Build Coastguard Worker   std::vector<ElfSection> sections = elf->GetSectionHeader();
270*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sections.size(), 30);
271*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sections[13].name, ".text");
272*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sections[13].vaddr, 0x400400);
273*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sections[13].file_offset, 0x400);
274*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sections[13].size, 0x1b2);
275*288bf522SAndroid Build Coastguard Worker }
276