Elf interface for new unwinder.
This cl includes the code to read arm unwind information from a shared
library.
Bug: 23762183
Test: Passes all unit tests. I can dump the arm unwind information
Test: for an arm shared library.
Change-Id: I43501ea2eab843b81de8bd5128401dd1971af8d3
diff --git a/libunwindstack/tests/ArmExidxExtractTest.cpp b/libunwindstack/tests/ArmExidxExtractTest.cpp
index 021765a..aed75bf 100644
--- a/libunwindstack/tests/ArmExidxExtractTest.cpp
+++ b/libunwindstack/tests/ArmExidxExtractTest.cpp
@@ -53,16 +53,16 @@
}
TEST_F(ArmExidxExtractTest, cant_unwind) {
- elf_memory_.SetData(0x1000, 0x7fff2340);
- elf_memory_.SetData(0x1004, 1);
+ elf_memory_.SetData32(0x1000, 0x7fff2340);
+ elf_memory_.SetData32(0x1004, 1);
ASSERT_FALSE(exidx_->ExtractEntryData(0x1000));
ASSERT_EQ(ARM_STATUS_NO_UNWIND, exidx_->status());
ASSERT_TRUE(data_->empty());
}
TEST_F(ArmExidxExtractTest, compact) {
- elf_memory_.SetData(0x4000, 0x7ffa3000);
- elf_memory_.SetData(0x4004, 0x80a8b0b0);
+ elf_memory_.SetData32(0x4000, 0x7ffa3000);
+ elf_memory_.SetData32(0x4004, 0x80a8b0b0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x4000));
ASSERT_EQ(3U, data_->size());
ASSERT_EQ(0xa8, data_->at(0));
@@ -71,8 +71,8 @@
// Missing finish gets added.
elf_memory_.Clear();
- elf_memory_.SetData(0x534, 0x7ffa3000);
- elf_memory_.SetData(0x538, 0x80a1a2a3);
+ elf_memory_.SetData32(0x534, 0x7ffa3000);
+ elf_memory_.SetData32(0x538, 0x80a1a2a3);
ASSERT_TRUE(exidx_->ExtractEntryData(0x534));
ASSERT_EQ(4U, data_->size());
ASSERT_EQ(0xa1, data_->at(0));
@@ -82,29 +82,29 @@
}
TEST_F(ArmExidxExtractTest, compact_non_zero_personality) {
- elf_memory_.SetData(0x4000, 0x7ffa3000);
+ elf_memory_.SetData32(0x4000, 0x7ffa3000);
uint32_t compact_value = 0x80a8b0b0;
for (size_t i = 1; i < 16; i++) {
- elf_memory_.SetData(0x4004, compact_value | (i << 24));
+ elf_memory_.SetData32(0x4004, compact_value | (i << 24));
ASSERT_FALSE(exidx_->ExtractEntryData(0x4000));
ASSERT_EQ(ARM_STATUS_INVALID_PERSONALITY, exidx_->status());
}
}
TEST_F(ArmExidxExtractTest, second_read_compact_personality_1_2) {
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x8100f3b0);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x8100f3b0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(2U, data_->size());
ASSERT_EQ(0xf3, data_->at(0));
ASSERT_EQ(0xb0, data_->at(1));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x8200f3f4);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x8200f3f4);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(3U, data_->size());
ASSERT_EQ(0xf3, data_->at(0));
@@ -112,10 +112,10 @@
ASSERT_EQ(0xb0, data_->at(2));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x8201f3f4);
- elf_memory_.SetData(0x6238, 0x102030b0);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x8201f3f4);
+ elf_memory_.SetData32(0x6238, 0x102030b0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(6U, data_->size());
ASSERT_EQ(0xf3, data_->at(0));
@@ -126,12 +126,12 @@
ASSERT_EQ(0xb0, data_->at(5));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x8103f3f4);
- elf_memory_.SetData(0x6238, 0x10203040);
- elf_memory_.SetData(0x623c, 0x50607080);
- elf_memory_.SetData(0x6240, 0x90a0c0d0);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x8103f3f4);
+ elf_memory_.SetData32(0x6238, 0x10203040);
+ elf_memory_.SetData32(0x623c, 0x50607080);
+ elf_memory_.SetData32(0x6240, 0x90a0c0d0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(15U, data_->size());
ASSERT_EQ(0xf3, data_->at(0));
@@ -152,33 +152,33 @@
}
TEST_F(ArmExidxExtractTest, second_read_compact_personality_illegal) {
- elf_memory_.SetData(0x5000, 0x7ffa1e48);
- elf_memory_.SetData(0x5004, 0x1230);
- elf_memory_.SetData(0x6234, 0x832132b0);
+ elf_memory_.SetData32(0x5000, 0x7ffa1e48);
+ elf_memory_.SetData32(0x5004, 0x1230);
+ elf_memory_.SetData32(0x6234, 0x832132b0);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_INVALID_PERSONALITY, exidx_->status());
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x7ffa1e48);
- elf_memory_.SetData(0x5004, 0x1230);
- elf_memory_.SetData(0x6234, 0x842132b0);
+ elf_memory_.SetData32(0x5000, 0x7ffa1e48);
+ elf_memory_.SetData32(0x5004, 0x1230);
+ elf_memory_.SetData32(0x6234, 0x842132b0);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_INVALID_PERSONALITY, exidx_->status());
}
TEST_F(ArmExidxExtractTest, second_read_offset_is_negative) {
- elf_memory_.SetData(0x5000, 0x7ffa1e48);
- elf_memory_.SetData(0x5004, 0x7fffb1e0);
- elf_memory_.SetData(0x1e4, 0x842132b0);
+ elf_memory_.SetData32(0x5000, 0x7ffa1e48);
+ elf_memory_.SetData32(0x5004, 0x7fffb1e0);
+ elf_memory_.SetData32(0x1e4, 0x842132b0);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_INVALID_PERSONALITY, exidx_->status());
}
TEST_F(ArmExidxExtractTest, second_read_not_compact) {
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x1);
- elf_memory_.SetData(0x6238, 0x001122b0);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x1);
+ elf_memory_.SetData32(0x6238, 0x001122b0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(3U, data_->size());
ASSERT_EQ(0x11, data_->at(0));
@@ -186,10 +186,10 @@
ASSERT_EQ(0xb0, data_->at(2));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x2);
- elf_memory_.SetData(0x6238, 0x00112233);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x2);
+ elf_memory_.SetData32(0x6238, 0x00112233);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(4U, data_->size());
ASSERT_EQ(0x11, data_->at(0));
@@ -198,11 +198,11 @@
ASSERT_EQ(0xb0, data_->at(3));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x3);
- elf_memory_.SetData(0x6238, 0x01112233);
- elf_memory_.SetData(0x623c, 0x445566b0);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x3);
+ elf_memory_.SetData32(0x6238, 0x01112233);
+ elf_memory_.SetData32(0x623c, 0x445566b0);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(7U, data_->size());
ASSERT_EQ(0x11, data_->at(0));
@@ -214,15 +214,15 @@
ASSERT_EQ(0xb0, data_->at(6));
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x3);
- elf_memory_.SetData(0x6238, 0x05112233);
- elf_memory_.SetData(0x623c, 0x01020304);
- elf_memory_.SetData(0x6240, 0x05060708);
- elf_memory_.SetData(0x6244, 0x090a0b0c);
- elf_memory_.SetData(0x6248, 0x0d0e0f10);
- elf_memory_.SetData(0x624c, 0x11121314);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x3);
+ elf_memory_.SetData32(0x6238, 0x05112233);
+ elf_memory_.SetData32(0x623c, 0x01020304);
+ elf_memory_.SetData32(0x6240, 0x05060708);
+ elf_memory_.SetData32(0x6244, 0x090a0b0c);
+ elf_memory_.SetData32(0x6248, 0x0d0e0f10);
+ elf_memory_.SetData32(0x624c, 0x11121314);
ASSERT_TRUE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(24U, data_->size());
ASSERT_EQ(0x11, data_->at(0));
@@ -255,43 +255,43 @@
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_READ_FAILED, exidx_->status());
- elf_memory_.SetData(0x5000, 0x100);
+ elf_memory_.SetData32(0x5000, 0x100);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_READ_FAILED, exidx_->status());
- elf_memory_.SetData(0x5004, 0x100);
+ elf_memory_.SetData32(0x5004, 0x100);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_READ_FAILED, exidx_->status());
- elf_memory_.SetData(0x5104, 0x1);
+ elf_memory_.SetData32(0x5104, 0x1);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_READ_FAILED, exidx_->status());
- elf_memory_.SetData(0x5108, 0x01010203);
+ elf_memory_.SetData32(0x5108, 0x01010203);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_READ_FAILED, exidx_->status());
}
TEST_F(ArmExidxExtractTest, malformed) {
- elf_memory_.SetData(0x5000, 0x100);
- elf_memory_.SetData(0x5004, 0x100);
- elf_memory_.SetData(0x5104, 0x1);
- elf_memory_.SetData(0x5108, 0x06010203);
+ elf_memory_.SetData32(0x5000, 0x100);
+ elf_memory_.SetData32(0x5004, 0x100);
+ elf_memory_.SetData32(0x5104, 0x1);
+ elf_memory_.SetData32(0x5108, 0x06010203);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_MALFORMED, exidx_->status());
elf_memory_.Clear();
- elf_memory_.SetData(0x5000, 0x100);
- elf_memory_.SetData(0x5004, 0x100);
- elf_memory_.SetData(0x5104, 0x1);
- elf_memory_.SetData(0x5108, 0x81060203);
+ elf_memory_.SetData32(0x5000, 0x100);
+ elf_memory_.SetData32(0x5004, 0x100);
+ elf_memory_.SetData32(0x5104, 0x1);
+ elf_memory_.SetData32(0x5108, 0x81060203);
ASSERT_FALSE(exidx_->ExtractEntryData(0x5000));
ASSERT_EQ(ARM_STATUS_MALFORMED, exidx_->status());
}
TEST_F(ArmExidxExtractTest, cant_unwind_log) {
- elf_memory_.SetData(0x1000, 0x7fff2340);
- elf_memory_.SetData(0x1004, 1);
+ elf_memory_.SetData32(0x1000, 0x7fff2340);
+ elf_memory_.SetData32(0x1004, 1);
exidx_->set_log(true);
exidx_->set_log_indent(0);
@@ -305,8 +305,8 @@
}
TEST_F(ArmExidxExtractTest, raw_data_compact) {
- elf_memory_.SetData(0x4000, 0x7ffa3000);
- elf_memory_.SetData(0x4004, 0x80a8b0b0);
+ elf_memory_.SetData32(0x4000, 0x7ffa3000);
+ elf_memory_.SetData32(0x4004, 0x80a8b0b0);
exidx_->set_log(true);
exidx_->set_log_indent(0);
@@ -317,10 +317,10 @@
}
TEST_F(ArmExidxExtractTest, raw_data_non_compact) {
- elf_memory_.SetData(0x5000, 0x1234);
- elf_memory_.SetData(0x5004, 0x00001230);
- elf_memory_.SetData(0x6234, 0x2);
- elf_memory_.SetData(0x6238, 0x00112233);
+ elf_memory_.SetData32(0x5000, 0x1234);
+ elf_memory_.SetData32(0x5004, 0x00001230);
+ elf_memory_.SetData32(0x6234, 0x2);
+ elf_memory_.SetData32(0x6238, 0x00112233);
exidx_->set_log(true);
exidx_->set_log_indent(0);