android_system_core/libunwindstack/Elf.h
Christopher Ferris 8098b1c378 Add section parsing and function name handling.
Add the code to parse the Elf section headers.

Add the plumbing through of all the symbol handling code.

Add tests for all of this new functionality.

Bug: 23762183

Test: Pass new unit tests.
Change-Id: Ie2d90cbb3d7653c53251dbcf34d9e5d241278377
2017-06-23 10:51:28 -07:00

78 lines
1.9 KiB
C++

/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _LIBUNWINDSTACK_ELF_H
#define _LIBUNWINDSTACK_ELF_H
#include <stddef.h>
#include <memory>
#include <string>
#include "ElfInterface.h"
#include "Memory.h"
#if !defined(EM_AARCH64)
#define EM_AARCH64 183
#endif
// Forward declaration.
class Regs;
class Elf {
public:
Elf(Memory* memory) : memory_(memory) {}
virtual ~Elf() = default;
bool Init();
void InitGnuDebugdata();
bool GetSoname(std::string* name) {
return valid_ && interface_->GetSoname(name);
}
bool GetFunctionName(uint64_t addr, std::string* name, uint64_t* func_offset) {
return valid_ && interface_->GetFunctionName(addr, name, func_offset);
}
bool Step(uint64_t rel_pc, Regs* regs, Memory* process_memory) {
return valid_ && interface_->Step(rel_pc, regs, process_memory);
}
ElfInterface* CreateInterfaceFromMemory(Memory* memory);
bool valid() { return valid_; }
uint32_t machine_type() { return machine_type_; }
uint8_t class_type() { return class_type_; }
Memory* memory() { return memory_.get(); }
ElfInterface* interface() { return interface_.get(); }
static bool IsValidElf(Memory* memory);
protected:
bool valid_ = false;
std::unique_ptr<ElfInterface> interface_;
std::unique_ptr<Memory> memory_;
uint32_t machine_type_;
uint8_t class_type_;
};
#endif // _LIBUNWINDSTACK_ELF_H