Fix issues in libunwindstack.
- Add a load_bias field in MapInfo so that it can be loaded offline,
and also so it can be cached.
- Add an Add function to the Maps class so that it's possible to manually
create a map.
- Remove the OfflineMaps class since I haven't found a reason for this to
exist.
- Add a pointer to the gnu debugdata compressed section in the interface
itself and modify the step path to try eh_frame, then debug_frame, then
gnu_debugdata. This way arm can add exidx as the last step behind
gnu_debugdata. Add an offline test to verify the order of unwind.
- Fix x86_64_ucontext_t since it was a different size on 32 bit and 64 bit
systems.
Test: Pass new unit tests.
Change-Id: I978b70d6c244bd307c62a29886d24c1a8cb2af23
diff --git a/libunwindstack/Maps.cpp b/libunwindstack/Maps.cpp
index 56370c1..4c16212 100644
--- a/libunwindstack/Maps.cpp
+++ b/libunwindstack/Maps.cpp
@@ -202,6 +202,13 @@
return return_value;
}
+void Maps::Add(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags,
+ const std::string& name, uint64_t load_bias) {
+ MapInfo* map_info = new MapInfo(start, end, offset, flags, name);
+ map_info->load_bias = load_bias;
+ maps_.push_back(map_info);
+}
+
Maps::~Maps() {
for (auto& map : maps_) {
delete map;
@@ -235,61 +242,4 @@
return "/proc/" + std::to_string(pid_) + "/maps";
}
-bool OfflineMaps::Parse() {
- // Format of maps information:
- // <uint64_t> StartOffset
- // <uint64_t> EndOffset
- // <uint64_t> offset
- // <uint16_t> flags
- // <uint16_t> MapNameLength
- // <VariableLengthValue> MapName
- android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(file_.c_str(), O_RDONLY)));
- if (fd == -1) {
- return false;
- }
-
- std::vector<char> name;
- while (true) {
- uint64_t start;
- ssize_t bytes = TEMP_FAILURE_RETRY(read(fd, &start, sizeof(start)));
- if (bytes == 0) {
- break;
- }
- if (bytes == -1 || bytes != sizeof(start)) {
- return false;
- }
- uint64_t end;
- bytes = TEMP_FAILURE_RETRY(read(fd, &end, sizeof(end)));
- if (bytes == -1 || bytes != sizeof(end)) {
- return false;
- }
- uint64_t offset;
- bytes = TEMP_FAILURE_RETRY(read(fd, &offset, sizeof(offset)));
- if (bytes == -1 || bytes != sizeof(offset)) {
- return false;
- }
- uint16_t flags;
- bytes = TEMP_FAILURE_RETRY(read(fd, &flags, sizeof(flags)));
- if (bytes == -1 || bytes != sizeof(flags)) {
- return false;
- }
- uint16_t len;
- bytes = TEMP_FAILURE_RETRY(read(fd, &len, sizeof(len)));
- if (bytes == -1 || bytes != sizeof(len)) {
- return false;
- }
- if (len > 0) {
- name.resize(len);
- bytes = TEMP_FAILURE_RETRY(read(fd, name.data(), len));
- if (bytes == -1 || bytes != len) {
- return false;
- }
- maps_.push_back(new MapInfo(start, end, offset, flags, std::string(name.data(), len)));
- } else {
- maps_.push_back(new MapInfo(start, end, offset, flags, ""));
- }
- }
- return true;
-}
-
} // namespace unwindstack